upstream sent too big header while reading response header from upstream
阿新 • • 發佈:2022-04-12
先看問題
開發反饋有個介面請求一直是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從上游接收響應到流程...