1. 程式人生 > >nginx超詳細講解之location,rewrite,反向代理及負載均衡

nginx超詳細講解之location,rewrite,反向代理及負載均衡

一、location 的語法

locltion可以把不同方式的請求,定位到不同的處理方式上(個人感覺有點像java中的filter)

1.1location分類及用法

location大致分為三類:

location = patt {} [精準匹配]

location patt{} [一般匹配]

location ~ patt{} [正則匹配]

location / {//定位,個人理解就是java中的filter。
            root   html;   //符合條件請求轉發路徑
            index  index.html index.htm;      //索引
        }
如果訪問的頁面為xxx.com
首先因為訪問的是/會進入該location然後給出的索引為index.html
接下來回去訪問/index.html繼續命中該location
然後到html路徑下去尋找index.html
root為資源存放的目錄,該例子是放在html(nginx安裝根目錄下的html資料夾的相對路徑),可以使用/開頭表示絕對路徑
index為索引

1.2location執行流程

1、首先檢視精準匹配是否匹配成功,如果成功則返回結果並停止解析過程

2、檢視普通匹配是否匹配成功,如果匹配成功,把匹配成功最長的記錄下來

3、依次尋找正則匹配,如果有一個匹配,立馬返回結果並停止解析過程

4、如果正則都不匹配則返回普通匹配中記錄的最長匹配

二、rewrite重寫

2.1重寫中用到的指令

if (條件) {} 設定條件,再進行重寫

set #設定變數

return #返回狀態碼

break #跳出rewrite

rewrite #重寫

2.2語法格式

If 語法格式

If 空格 (條件) {

重寫模式

}

條件又怎麼寫?

答:3種寫法

1: “=”來判斷相等, 用於字串比較

2: “~” 用正則來匹配(此處的正則區分大小寫)

~* 不區分大小寫的正則

3: -f -d -e來判斷是否為檔案,為目錄,是否存在.

例子:

if ($remote_addr = 192.168.1.100) {
return 403;
}
if ($http_user_agent ~ MSIE) {
rewrite ^.*$ /ie.htm;
break; #(不break會迴圈重定向)
}
if (!-e $document_root$fastcgi_script_name) {
rewrite ^.*$ /404.html break;
} 
if ($http_user_agent ~* msie) {
set $isie 1;
}
if ($fastcgi_script_name = ie.html) {
set $isie 0;
}
if ($isie 1) {
rewrite ^.*$ ie.html;
}

三、反向代理及負載均衡

3.1反向代理

1.主要使用proxy_pass方法

例如:

location ~ .*\.(jpg|png|gif|bmp)$ {
proxy_pass http://imagesever;
}

upstream imagesever {
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
}

2.upstream每個裝置的狀態說明

1.down 表示單前的server暫時不參與負載

2.weight 預設為1.weight越大,負載的權重就越大。

3.max_fails :允許請求失敗的次數預設為1.當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤

4.fail_timeout:max_fails次失敗後,暫停的時間。

5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

3.upstream負載均衡方式

nginx的upstream目前支援5種方式的分配

1、輪詢(預設)

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

2、weight

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

例如:

upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
3、ip_hash

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。

例如:

upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
4、fair(第三方)

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

upstream backend {
server server1;
server server2;
fair;
}
5、url_hash(第三方)

按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。

例:在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法

upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
tips:
upstream bakend{#定義負載均衡裝置的Ip及裝置狀態
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}

在需要使用負載均衡的server中增加

proxy_pass http://bakend/;