📖 背景
大屏加了用户登录功能。本地测试完美。上线后,用户一多,部分人偶尔遇到 502 Bad Gateway。
查 nginx/error.log,发现一行红字:
upstream sent too big header while reading response header from upstream。
🔍 原因
小学生版解释:
Nginx 去 Flask 那边拿快递(Response)。Nginx 手里拿了个固定大小的麻袋(Buffer),默认是 4K 大小。
现在 Flask 塞过来一堆附件(用户登录的 Cookie、很长的 JWT Token、复杂的 CORS 头),麻袋撑爆了。Nginx 兜不住,直接把快递扔地上,大喊一声"502"。
🛠 解决
调大 Nginx 的麻袋。修改 nginx.conf:
css
location / {
proxy_pass http://dashboard:5000;
# 关键:调大缓冲区
proxy_buffer_size 128k; # 专门用来存 Header 的
proxy_buffers 4 256k; # 响应体的
proxy_busy_buffers_size 256k;
# ... 其他 header 配置
}
✅ 验证效果
nginx -t 和 nginx -s reload。
让用户重新登录刷新大屏。F12 网络面板里,502 消失,正常的 200 响应返回,Header 里的 Token 完整传递。
💣 三个坑
只加 proxy_buffers:很多人只加 proxy_buffers 4 256k;。但存 Header 的其实是 proxy_buffer_size。如果不改它,照样爆。
本地不复现:本地开发环境通常不带复杂的 Cookie 或 SSO Token,导致本地永远测不出这个错,必须上生产。
设得太大浪费内存:Buffer 设太大会吃物理内存。一般 128k 就能应付 99% 的超级大 Header,不用设到几 M。