nginx 配置之 proxy pass 神器!

2021-07-22 16:16:41 字數 1319 閱讀 2687

proxy 模組是 nginx 中最碉堡的模組之一。就是有了 proxy 模組,nginx 才能和其它 http 伺服器關聯起來,極大程度地提高了 nginx 的可用性。proxy 這個模組比較大,光是指令就有一大堆。這裡我們只是簡單地介紹一下它最核心的指令 —— proxy_pass 。

當我們遇到跨域問題,而且客戶端無法支援 cors 時,最好的辦法就是讓伺服器來做**。在前端頁面所在的伺服器 nginx 配置上開乙個路由,然後使用 proxy 去請求另乙個網域名稱下的資源。如果跨域資源也部署在同一臺機器上,我們甚至可以 proxy 到 127.0.0.1,比如:

location /api當客戶端請求 /api 這個路徑下的資源時伺服器就會幫助我們去 127.0.0.1 的 1234 埠上取資源,解決了跨域的問題。proxy_pass 會將當前的 $uri 帶過去,所以如果 /api 這個路由是我們擅自加的,在傳送到目標服務前可以使用 rewrite 來處理掉這個多餘的路由,比如:

location /api/rewrite 的作用是修改 $uri,但要注意 rewrite 要有個重新匹配 location 的***。由於 proxy_pass 的處理階段比 location 處理更晚,所以這裡需要 break 掉,以防止 rewrite 進入下一次 location 匹配而丟失 proxy_pass。

另外還有乙個值得注意的地方,proxy_pass 後面的 host 如果填寫乙個網域名稱的話,這個網域名稱將會在 nginx 啟動時解析。如果 nginx 啟動時網域名稱無法解析將會丟擲異常無法啟動,比如:location /apinginx: [emerg] host not found in upstream "***"而且由於 nginx 解析網域名稱是在啟動時做的,所以在 nginx 啟動之後修改網域名稱的解析對 nginx 是不會生效的。

如果覺得讓 nginx 啟動時去查詢 dns 這件事不靠譜(我就不推薦這麼做,因為 dns 確實是不可控的),那麼可以在 proxy_pass 時到某個 ip 上,hostname 可以通過 porxy_set_header 指令強制設定 proxy 的 http 請求中的 host 欄位來修改它,比如:

location /api除了設定 host 這個請求頭之外,proxy_set_header 還能設定別的頭,只要你的腦洞夠大就可以用它來做更多奇怪的事情!

另外還有個要注意的點。proxy_pass 預設使用的是 http 1.0,可以通過 proxy_http_version 指令讓它使用 http 1.1,以便開啟 keepalive 之類的功能。

location /api

LANMP安全配置之Nginx安全配置

比起前幾篇的apache安全配置 php安全配置 mysql安全配置,對nginx的了解巨少,沒怎麼用過除了知道nginx解析漏洞就啥也不知道了 好了,開始學習 1.1 更改預設使用者名稱 nginx預設nobody,可更改預設使用者名稱防止他人利用 1.2 新增使用者 1 新增組 groupadd...

nginx 配置之 虛擬目錄

server location ht location phpadmin location php 要注意的是,location phpadmin 和 location phpadmin 是完全不同的。前者可以訪問到目錄,而後者將被重定向到伺服器,如 http 127.0.0.1 phpadmin ...

nginx 配置之 proxy pass引數詳解

在nginx中配置proxy pass 時,如果在proxy pass後面的url加 表示絕對根路徑 如果沒有 表示相對路徑,把匹配的路徑部分也給 走。假設下面四種情況分別用 進行訪問。第一種 location proxy 到url 第二種 相對於第一種,最後少乙個 location proxy 到...