nginx是由俄羅斯開發的一款http web伺服器,我們經常用這款伺服器做負載均衡和反向代理。
今天我們就來聊聊Nginx作為反向代理時,如何進行路由配置。
假設你已經部署好Nginx了,我們進入Nginx安裝目錄,進入nginx.conf檔案。
找到http節點下的server節點,值是一個json。
在json中 有一個location的指令,就是代表轉發。
一般是這樣的形式:
location {$path} {
proxy_pass {$url};
}
{$path}代表匹配源url的部分,proxy_pass 後的{$url}則是代表要轉發的目標url,
這裡一般會涉及到轉發時是否攜帶原有路徑的問題。舉個例子:
location /abc {
proxy_pass http://127.0.0.1:9090/;
}
如果我們請求 http://127.0.0.1:80/abc (假設nginx的伺服器的是80)
則請求的路徑path是/abc,此時會匹配到該location指令的規則 /abc,則請求會轉發的本機的9090埠。
如果我們請求 http://127.0.0.1:80/abc/cloud
則請求的路徑path是/abc/cloud,(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )此時會匹配到該location指令的規則,則請求會轉發的本機的9090埠。
但是問題來了,轉發9090埠時,/abc要不要補充到後邊?後邊的/cloud部分要不要追加?
這裡是和$url是否包含路徑有關係,無斜槓就代表不包含路徑,有斜槓就代表包含路徑。
一、無路徑場景
如果:$url為http://127.0.0.1:9090 表示無路徑
此種情況,會將源url的路徑部分直接追加
舉幾個例子
(1)
location /abc {
proxy_pass http://127.0.0.1:9090;
}
請求http://127.0.0.1:80/abc/bcd
則跳轉到http://127.0.0.1:9090/abc/bcd
(2)
location /abc/bcd {
proxy_pass http://127.0.0.1:9090;
}
請求http://127.0.0.1:80/abc/bcd
則跳轉到http://127.0.0.1:9090/abc/bcd
(3)
location /abc/bcd/ {
proxy_pass http://127.0.0.1:9090;
}
請求http://127.0.0.1:80/abc/bcd/
則跳轉到http://127.0.0.1:9090/abc/bcd/
總結就是一句話,proxy_pass 後配置的目標url,如果沒有路徑資訊(包括/),則會將源url的路徑部分,直接追加到目標url中
二、有路徑場景
如果:$url為http://127.0.0.1:9090/ 表示有路徑
如果:$url為http://127.0.0.1:9090/gov 表示有路徑
如果:$url為http://127.0.0.1:9090/gov/ 表示有路徑
此種情況,會將源url的路徑部分去掉已匹配部分後,將剩餘部分直接追加到目標url後,如圖:
舉幾個例子
(1)
location /abc/ {
proxy_pass http://127.0.0.1:9090/;
}
請求http://127.0.0.1:80/abc/bcd
則跳轉到http://127.0.0.1:9090/bcd
分析:
源url的路徑部分是: “/abc/bcd”
與匹配規則“/abc/”匹配成功
匹配後剩餘部分是“bcd”“http://127.0.0.1:9090/”追加“bcd”
則最終會跳轉到http://127.0.0.1:9090/bcd
(2)
location /abc {
proxy_pass http://127.0.0.1:9090/gov;
}
請求http://127.0.0.1:80/abc/bcd
則跳轉到http://127.0.0.1:9090/gov/bcd
(3)
location /abc/b {
proxy_pass http://127.0.0.1:9090/gov/;
}
請求http://127.0.0.1:80/abc/bcd/
則跳轉到http://127.0.0.1:9090/gov/cd/
(4)
location /abc/b {
proxy_pass http://127.0.0.1:9090/gov/;
}
請求http://127.0.0.1:80/abc/b/cd/
則跳轉到http://127.0.0.1:9090/gov//cd/
總結就是一句話,proxy_pass 後配置的目標url,如果有路徑資訊(包括/),則會將源url的路徑部分匹配後剩餘的部分路徑,直接追加到目標url中
現在還有一個問題就是,(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )如果有多個匹配規則都命中的話,那麼nginx會怎麼處理呢?
如下:
location / {
proxy_pass http://127.0.0.1:9091/gov/;
}
location /abc {
proxy_pass http://127.0.0.1:9092/gov/;
}
location /abc/ai {
proxy_pass http://127.0.0.1:9093/gov/;
}
請求http://127.0.0.1:80/abc/ai/
則nginx 會按照最大匹配原則的情況,選擇匹配物件,此時就會將請求轉發至9093埠