2020年11月16日 星期一

Nginx 出現 upstream sent too big header while reading response header from upstream 錯誤,回應 502 Bad Gateway

[環境]
Server A(192.168.56.10) 使用 Nginx 設定 Load Balance 負載平衡。
proxy_pass 給 Server B(192.168.56.11)、Server C(192.168.56.12),真正處理的 Web Server。

Server A(192.168.56.10) 設定
upstream myweb {
    server 192.168.56.11 weight=3;//Server B
    server 192.168.56.12 weight=3;//Server C
}
server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://myweb;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto http;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;
}
當 Server B、Server C 輸出的 header 過大,超出 Server A 的限制,Server A 接收到 Server B、Server C 時會:
  1. 直接回應 502 Bad Gateway 給使用者端
  2. 在 Server A 的 access.log 可看到 502 相關的紀錄:
    ...."GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleW....
  3. 在 Server A 的 error.log 可看到[error]層級的錯誤:
    [error] 5131#5131: *10 upstream sent too big header while reading response header from upstream....
但對 Server B、Server C 而言,工作都已正常完成,所以 log 都是正常的。
故若不經過 Server A,直接瀏覽 Server B、Server C 會是正常的。


[解決方法]
如果過大的 header 是預期中、必要的,可在  Server A 加大 proxy buffer 限制
location / {
    .....
    proxy_buffer_size 64k;
    proxy_buffers 4 32k; //proxy_buffers number size
    proxy_busy_buffers_size 64k;
    .....
}


參考:
Module ngx_http_proxy_module
修復Nginx 502錯誤:upstream sent too big header while reading response header from upstream - IT閱讀



沒有留言:

張貼留言