Nginx伺服器配置---反向代理服務時proxy_pass的轉發規則

王若伊_恩赐解脱發表於2024-11-20

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埠

相關文章