1. 程式人生 > 其它 >upstream sent too big header while reading response header from upstream

upstream sent too big header while reading response header from upstream

先看問題

開發反饋有個介面請求一直是502,運維介入後檢視nginx error log 展示資訊如下:

upstream sent too big header while reading response header from upstream

意思是上游服務返回的響應攜帶的頭資訊太大了, 超過了配置的緩衝區,導致讀取響應超時, nginx直接返回502

如何解決

分情況討論:

  • 新上線的Nginx叢集,未調整過任何引數
    • 可以在主配置檔案中新增proxy buffer 相關引數,如下
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
  • 已線上執行許久的Nginx叢集

此時如果你看到這個報錯就直接去百度去谷歌大概率也能解決這個問題,因為網上對這個問題的解決方案無非就是加大快取區

如果直接加大緩衝區,大概率也可以解決當前的問題,但也許不是最優的解決方案。
此時可以呼叫異常的介面,檢視它的response header 看看是否存在異常, 是否是因為業務程式碼邏輯問題導致頭資訊異常增加,可以這樣:

  • 一般正常的請求如下, buffer通常不會溢位
# 請求
♪ localhost ~ $ curl -I www.baidu.com

# 響應頭
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Tue, 12 Apr 2022 05:20:07 GMT
Etag: "575e1f71-115"
Last-Modified: Mon, 13 Jun 2016 02:50:25 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
  • 異常的請求各有各的不同, 比如這個: 由於邏輯錯誤導致後端返回set-cookie巨多
♪ localhost ~ $ curl -I test.chaizh.com/api/v1/get-list

HTTP/1.1 200 OK
Date: Tue, 12 Apr 2022 05:24:57 GMT
Content-Type: application/json
Connection: keep-alive
Server: openresty
X-Powered-By: PHP/7.0.27
Cache-Control: no-cache
Set-Cookie: hahah=xxxxxxxxx; expirse=xxxxxx; Max-Age=xxxxxx; Path=/
...
... 此處省略1000行, 全部是set-cookie
...
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *

所以,上述的這種問題不應該通過增大緩衝區來處理,而是需要找到對應的業務負責人來修復這種邏輯問題才是根本的解決方案。

知其然更要知其所以然

這裡我建議瞭解一下Nginx作為反向代理的資料流向和執行階段, 比如Nginx從上游接收響應到流程...