1. 程式人生 > >rewrite、nginx proxy反向代理和快取

rewrite、nginx proxy反向代理和快取

實驗環境
閘道器  classroom  172.25.8.254
workstation 172.25.8.9
server a-jeth0 172.25.8.10-外網
eth1 192.168.0.x內網
eth2 192.168.1.x備用
--------------------------------------------
rewrite地址重寫技術
需求:   網頁的地址也希望看起來儘量簡潔明快
搜尋引擎更喜歡靜態頁面形式的網頁,搜尋引擎對靜態頁面的評分一般要高於動態頁面。所以,UrlRewrite 可
以讓我們網站的網頁更容易被搜尋引擎所收錄。
從安全形度上講,如果在 url 中暴露太多的引數,無疑會造成一定量的資訊洩漏,可能會被一些黑客利用,對你的系統造
成一定的破壞,所以靜態化的 url 地址可以給我們帶來更高的安全性。
設計:
原理:1)匹配
    
location:~正則 對path匹配
if:if(匹配的內容) { } 可以匹配除路徑以外的其他資訊,如主機名、客戶端 ip 等。
if 可以支援如下條件判斷匹配符號
~ 為區分大小寫匹配
~* 為不區分大小寫匹配
!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配
-f 和!-f 用來判斷是否存在檔案
-d 和!-d 用來判斷是否存在目錄
-e 和!-e 用來判斷是否存在檔案或目錄
-x 和!-x 用來判斷檔案是否可執行
2)重寫
{rewrite 舊地址 新地址 標記位}
每行 rewrite 指令最後應該根一個 flag 標記,支援的 flag 標記有,其中最為常用的有 last、break、permanent
last
相當於 Apache 裡的[L]標記,表示完成 rewrite
break
本條規則匹配完成後,終止匹配,不再匹配後面的規則
redirect 返回 302 臨時重定向,瀏覽器地址會顯示跳轉後的 URL 地址
permanent
返回 301 永久重定向,瀏覽器地址會顯示跳轉後 URL 地址
--------------------------------------------------------
硬體:Linux
系統:rhel7
軟體:nginx
服務:nginx
部署:
 location ~ /new {
                rewrite /new/.* /new/index.html break;
        }
-----------------------------------------------------------
        location ~ /uplook {
        rewrite ^/uplook/([0-9]+)-([0-9]+)-([0-9]+)\.html /uplook/$1/$2/$3.html last;
        }
if:
--------------------------------
[email protected]
~]# vim /etc/nginx/conf.d/www.joy.com.conf
server {
listen
80;
server_name ~.*.joy.com;
root /usr/share/nginx/joy.com;
index index.html index.htm;
if ( $http_host ~* ^www\.joy\.com$ ) {
29Nginx 配置
break;
}
#如果使用者訪問的是 www.joy.com,則不做 rewrite
if ( $http_host ~* ^(.*)\.joy\.com$ ) {
set $domain $1;
rewrite /.* /$domain/index.html break;
}
#將使用者輸入的.joy.com 之前的字串儲存並將儲存的記憶體賦值給 domain 變數
建立測試檔案
[
[email protected]
~]# cd /usr/share/nginx/joy.com/
[[email protected] joy.com]# mkdir tom
[[email protected] joy.com]# echo tom > tom/index.html
[[email protected] ~]# systemctl restart nginx.service
客戶端測試
[[email protected] ~]# echo 172.25.41.10 tom.joy.com >> /etc/hosts
-----------
代理:正向代理、反向代理、透明代理
正向代理:一般用在客戶端,當client與server無法直接通訊時,客戶端可以用一個可以和cilent和server正常通訊的伺服器作為代理來實現client與server之間的通訊,一般用作翻牆
反向代理(Reverse Proxy)方式是指以代理伺服器來接受 internet 上的連線請求,然後將請求轉發給內部網路上的服務
器,並將從伺服器上得到的結果返回給 internet 上請求連線的 客戶端,此時代理伺服器對外就表現為一個伺服器。
反向代理又稱為 Web 伺服器加速,是針對 Web 伺服器提供加速功能的。它作為代理 Cache,但並不針對瀏覽器使用者,
而針對一臺或多臺特定 Web 伺服器(這也是反向代理名稱的由來)。代理伺服器可以快取一些 web 的頁面,降低了 web 服務
器的訪問量,所以可以降低 web 伺服器的負載。web 伺服器同時處理的請求數少了,響應時間自然就快了。同時代理伺服器也
存了一些頁面,可以直接返回給客戶端,加速客戶端瀏覽。實施反向代理,只要將反向代理裝置放置在一臺或多臺 Web 伺服器
前端即可。當網際網路使用者訪問某個 WEB 伺服器時,通過 DNS 伺服器解析後的 IP 地址是代理伺服器的 IP 地址,而非原始 Web
伺服器的 IP 地址,這時代理伺服器裝置充當 Web 伺服器,瀏覽器可以與它連線,無需再直接與 Web 伺服器相連。因此,大量
Web 服務工作量被轉載到反向代理服務上。不但能夠很大程度上減輕 web 伺服器的負擔,提高訪問速度,而且能夠防止外部
網主機直接和 web 伺服器直接通訊帶來的安全隱患。
透明代理:一般用在閘道器
-------------------------------------------------


Nginx proxy 是 Nginx 的王牌功能,利用 proxy 基本可以實現一個完整的 7 層負載均衡,它有這 些特色:
1.
功能強大,效能卓越,執行穩定。
2. 配置簡單靈活。
3. 能夠自動剔除工作不正常的後端伺服器。
4. 上傳檔案使用非同步模式。
5. 支援多種分配策略,可以分配權重,分配方式靈活。


servera:
/etc/nginx/conf.d
 vim www.ccc.com.conf 
server {
        listen  80;
        server_name www.ccc.com;
        location / {
             proxy_pass http://192.168.0.11; #反向代理指向ip,確定需要代理的 URL,埠或 socket。
          
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;




        }
}
+++++++++++++++++++++++++++++++++++++++++++++++
proxy_pass http://192.168.0.11;
#確定需要代理的 URL,埠或 socket。
proxy_set_header Host $host;
#這個指令允許將傳送到後端伺服器的請求頭重新定義或者增加一些欄位。 這個值可以是一個文字,變數或者它們的組合。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
proxy_set_header X-Real-IP $remote_addr;
#確定在何種情況下請求將轉發到下一個伺服器:
#error - 在連線到一個伺服器,傳送一個請求,或者讀取應答時發生錯誤。
#timeout - 在連線到伺服器,轉發請求或者讀取應答時發生超時。
#invalid_header - 伺服器返回空的或者錯誤的應答。
#http_500 - 伺服器返回 500 程式碼。
#http_502 - 伺服器返回 502 程式碼。
#http_503 - 伺服器返回 503 程式碼。
#http_504 - 伺服器返回 504 程式碼。
#http_404 - 伺服器返回 404 程式碼。
#off - 禁止轉發請求到下一臺伺服器。
proxy_redirect off;
#如果需要修改從後端伺服器傳來的應答頭中的"Location"和"Refresh"欄位,可以用這個指令設定。


------------------------------------------------
serverb:
 yum -y install httpd vim
vim /etc/httpd/conf.d/ccc.com.com
<VirtualHost *:80>
serverName www.ccc.com
DocumentRoot /var/www/ccc.com
</VirtualHost>
 mkdir /var/www/ccc.com
echo serverb> /var/www/ccc.com/index.html
systemctl start httpd




upstream
作用:HTTP 負載均衡模組。upstream 這個欄位設定一群伺服器,可以將這個欄位放在 proxy_pass 和 fastcgi_pass 指令中作
為一個單獨的實體,它們可以是監聽不同埠的伺服器,並且也可以是同時監聽 TCP 和 Unix socket 的伺服器。
分配方式:


輪詢(預設)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器 down 掉,能自動剔除。


weight
指定輪詢機率,weight 和訪問比率成正比,用於後端伺服器效能不均的情況。






輪詢:
servera:
/etc/nginx
vim nginx.conf 
    upstream ccc_pool {#定義一個組  組名
        server 192.168.0.11:80 weight=1;組成員  weight:權重
        server 192.168.0.12:80 weight=4;組成員  weight:權重,權重越大越容易被訪問到
        ip_hash;#會話一致性,同一個使用者不進行輪詢
        }
-----------------------
/etc/nginx/conf.d
vim www.ccc.con.conf
server {
        listen  80;
        server_name www.ccc.com;
        location / {
                proxy_pass http://ccc_pool; #反向代理指向組
        proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
}
}
----------------------------------------------
serverb:
 yum -y install httpd vim
vim /etc/httpd/conf.d/ccc.com.com
<VirtualHost *:80>
serverName www.ccc.com
DocumentRoot /var/www/ccc.com
</VirtualHost>
 mkdir /var/www/ccc.com
echo serverb> /var/www/ccc.com/index.html
systemctl start httpd
--------------------------------------------------
serverc:
 yum -y install httpd vim
vim /etc/httpd/conf.d/ccc.com.com
<VirtualHost *:80>
serverName www.ccc.com
DocumentRoot /var/www/ccc.com
</VirtualHost>
 mkdir /var/www/ccc.com
echo serverc> /var/www/ccc.com/index.html
systemctl start httpd
*********************************************************************
快取:
nginx 快取
修改全域性配置選項,指定快取檔案放置位置
servera:
/etc/nginx
vim nginx.conf 
proxy_temp_path /usr/share/nginx/proxy_temp_dir 1 2;
proxy_cache_path /usr/share/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_web:50m inactive=1d max_size=30g;
    upstream ccc_pool {#定義一個組  組名
        server 192.168.0.11:80 weight=1;組成員  weight:權重
        server 192.168.0.12:80 weight=4;組成員  weight:權重,權重越大越容易被訪問到
        ip_hash;#會話一致性,同一個使用者不進行輪詢
        }
------------------------------------------------
建立全域性配置項中的快取檔案放置位置,並將目錄的擁有者設定為 nginx
mkdir -p /usr/share/nginx/proxy_temp_dir /usr/share/nginx/proxy_cache_dir
chown nginx /usr/share/nginx/proxy_temp_dir/ /usr/share/nginx/proxy_cache_dir/






------------------------------------------------
vim /etc/nginx/conf.d/www.ccc.com.conf


server {
        listen  80;
        server_name www.ccc.com;
        location / {
#               proxy_pass http://192.168.0.11;
                proxy_pass http://ccc_pool;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect off;
        client_max_body_size 10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_cache cache_web;
        proxy_cache_valid 200 302 12h;#200 302指網頁的型別
        proxy_cache_valid 301 1d;
        proxy_cache_valid any 1h;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
#對快取做相關設定,如快取檔案大小等
        }
}
------------------------------


systemctl restart nginx.service
沒訪問之前檢視快取目錄,目錄為空
ll /usr/share/nginx/proxy_cache_dir/
total 0
訪問完成後再次檢視快取目錄,有相應快取檔案,也可將後臺服務停掉,對於快取檔案,客戶端仍然可以訪問到。








問題與解答: