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和訪問比率成正比,用於後端伺服器效能不均的情況。
例如:
3、ip_hashupstream bakend { server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; }
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
例如:
4、fair(第三方)upstream bakend { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; }
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
5、url_hash(第三方)upstream backend { server server1; server server2; fair; }
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法
tips:upstream backend { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
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/;