天天看點

nginx 之 location,rewrite,反向代理及負載均衡nginx 之 location,rewrite,反向代理及負載均衡

nginx 之 location,rewrite,反向代理及負載均衡

一、location 的文法

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

1.1 location分類及用法

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.2 location執行流程

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-Xo9KoPxn-1578729094199)(https://github.com/bigdatajava/blogspot/raw/master/img/tuchuang/nginx.jpg)]

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/;
           

繼續閱讀