反向代理設定
反向代理(reverse proxy)是指客戶端其實是在跟 Nginx 溝通,Nginx 再代替客戶端把請求轉發給後端的應用程式,並把回應傳回去。這與一般認知的「正向代理」(forward proxy,代替客戶端去存取外部網站)方向相反。現代網站架構中,Nginx 幾乎都是被放在應用程式(Node.js、Python、Java 等)前面,扮演這個角色。
proxy_pass 基本設定
假設後端應用程式跑在本機的 3000 埠:
這樣所有進到 app.example.com 的請求,都會被轉發到後端的 Node.js(或其他)應用程式處理,客戶端完全不會直接接觸到後端伺服器。
常用的 proxy header 設定
預設情況下,後端應用程式收到的請求,來源 IP 會顯示成 Nginx 自己的位址,而不是真正的客戶端 IP。因此反向代理幾乎都要補上以下標頭,讓後端知道請求的原始資訊:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
| 標頭 | 用途 |
|---|---|
Host |
保留原始請求的網域名稱,避免後端應用程式收到 Nginx 的內部位址 |
X-Real-IP |
告訴後端真正發出請求的客戶端 IP |
X-Forwarded-For |
記錄請求經過的代理鏈,常用於日誌與流量分析 |
X-Forwarded-Proto |
告知後端原始請求是 http 還是 https,避免應用程式判斷錯誤而導致重導向迴圈 |
逾時與緩衝設定
當後端回應較慢,或需要處理大檔案上傳/下載時,預設的逾時與緩衝設定可能不夠用:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_connect_timeout 5s; # 與後端建立連線的逾時時間
proxy_read_timeout 60s; # 等待後端回應的逾時時間
proxy_buffering on; # 是否先把後端回應緩衝起來再傳給客戶端
}
一般網站用預設值即可;如果後端是長時間運算的 API,或需要串流輸出(例如 Server-Sent Events),才需要調整 proxy_read_timeout 或關閉 proxy_buffering。
下一步
單一後端伺服器容易成為單點故障。下一頁的 負載平衡(Upstream) 會說明如何用 upstream 把 proxy_pass 指向多台後端伺服器。