nginx配置proxy_set_header

你说夕阳很美發表於2024-10-11

深入解析 Nginx proxy_set_header:實現高階代理功能 - dashery - 部落格園 (cnblogs.com)

proxy_set_header 是 Nginx 配置中的一個重要指令,特別是在使用 Nginx 作為反向代理時。該指令允許你修改由 Nginx 傳遞給代理後端的請求頭。這對於確保後端應用程式能夠接收到正確的客戶端資訊(如 IP 地址、主機名等)以及控制快取行為等場景非常有用。
本文將詳細解釋 proxy_set_header 的用法和一些常見的應用場景。

一、proxy_set_header 簡介

proxy_set_header 是 Nginx 配置檔案中用於設定代理請求頭的指令。它通常在 location 塊中使用,允許你為代理請求新增或修改請求頭。

二、基本語法

proxy_set_header 的基本語法如下:

proxy_set_header HeaderName HeaderValue;
  • HeaderName:要設定的請求頭的名稱。
  • HeaderValue:請求頭的值。

三、常見用法

  1. 設定 Host 頭
    當 Nginx 代理請求到後端伺服器時,預設情況下會保留原始的 Host 頭。但是,在某些情況下,你可能需要覆蓋這個值。

    nginx複製程式碼
    
    proxy_set_header Host $host;
    

    這裡 $host 是 Nginx 變數,它包含了請求的主機名。

  2. 傳遞真實客戶端 IP
    當 Nginx 位於負載均衡器或 CDN 後面時,後端伺服器看到的客戶端 IP 可能是負載均衡器或 CDN 節點的 IP,而不是真實使用者的 IP。為了解決這個問題,你可以使用 X-Real-IPX-Forwarded-For 頭來傳遞真實 IP。

    proxy_set_header X-Real-IP $remote_addr;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    

    $remote_addr 是客戶端的 IP 地址。$proxy_add_x_forwarded_for 是一個特殊的 Nginx 變數,它包含了原始請求的 X-Forwarded-For 頭的內容,並附加上客戶端的 IP 地址。

  3. 控制快取
    你可以透過修改或新增特定的頭來控制後端伺服器或中間快取的行為。

    proxy_set_header Cache-Control "no-cache, no-store, must-revalidate";  
    proxy_set_header Pragma no-cache;  
    proxy_set_header Expires 0;
    

    這些頭通常用於確保請求不會被快取,或者用於控制快取的持續時間。

  4. 自定義頭
    除了修改標準 HTTP 頭之外,你還可以新增自定義頭來傳遞額外的資訊給後端伺服器。

    nginx複製程式碼
    
    proxy_set_header My-Custom-Header "SomeValue";
    
  5. 刪除頭
    雖然 proxy_set_header 主要用於新增或修改頭資訊,但你也可以透過將其設定為空值來刪除不需要的頭。

    nginx複製程式碼
    
    proxy_set_header Accept-Encoding "";
    

    這將刪除 Accept-Encoding 頭,可能是因為你不希望後端伺服器對內容進行壓縮。

四、使用場景

  1. 負載均衡器:

    • 在負載均衡器中,你可能需要將原始請求頭傳遞給後端伺服器以進行路由決策。
  2. 安全性:

    • 透過設定 X-Frame-OptionsX-XSS-Protection 等安全相關的請求頭,增強應用的安全性。
  3. 內容協商:

    • 透過設定 Accept-LanguageAccept-Encoding 請求頭,實現內容協商和國際化。

五、注意事項

  • 請求頭大小限制:

    • Nginx 有預設的請求頭大小限制,如果請求頭過大,可能會被截斷。可以透過 large_client_header_buffers 指令調整大小。
  • 代理協議:

    • 如果使用 HTTP/2 或其他代理協議,確保 proxy_set_header 指令與協議相容。

六、示例配置

以下是一個示例配置,展示瞭如何使用 proxy_set_header 在 Nginx 中設定代理請求頭:

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;

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

七、結論

proxy_set_header 是 Nginx 反向代理配置中的一個重要指令,透過它可以實現高階代理功能,最佳化你的網路應用。掌握其用法,可以更好地控制代理請求的行為,提高應用的靈活性和安全性。

八、常見問題解答

  • 問:我可以同時設定多個請求頭嗎?

    • 答:可以,你可以在 location 塊中使用多個 proxy_set_header 指令。
  • 問:修改請求頭會影響後端伺服器的響應嗎?

    • 答:會的,後端伺服器可能會根據請求頭的內容決定其響應行為。
  • 問:如何確保請求頭的安全?

    • 答:避免傳遞敏感資訊,如身份驗證令牌或個人資料,除非絕對必要。