Nginx因proxy_buffer_size过小截断超长Set-Cookie导致502,需调大proxy_buffer_size、proxy_buffers等参数,并修正proxy_cookie_path和proxy_redirect以适配重定向路径,同时建议从源头精简Cookie体积。

后端API返回超长 Set-Cookie(比如含多段 JWT、加密属性、多个 domain/path)时,Nginx 默认缓冲区会截断响应头,导致解析失败,触发 502 错误——尤其在重定向场景下(如登录后 302 跳转),该问题更易暴露,因为重定向响应本身头信息精简,但若携带超长 Cookie,就极易越界。
确认是不是 Set-Cookie 导致的 502
别一上来就改配置。先看 Nginx 错误日志:
- 执行 tail -f /var/log/nginx/error.log,找这行:upstream sent too big header while reading response header from upstream
- 用 curl -v http://your-api/login 2>&1 | grep '^<' | wc -c 统计完整响应头字节数(注意:不能用
-I,它可能只取头不带全部 Cookie) - 如果单条 Set-Cookie 实测达 8–16KB,而默认
proxy_buffer_size是 4k 或 8k,基本就是它了
调大 proxy_buffer_size 并配齐协同参数
proxy_buffer_size 只管“最长那一行响应头”的长度(不是所有头加起来),必须 ≥ 最长 Set-Cookie 行(含状态行 + 所有字段 + CRLF)。推荐设为 16k 或 32k:
- 在
location块中、proxy_pass之前添加:proxy_buffer_size 16k; - 同步设置:proxy_buffers 8 16k; 和 proxy_busy_buffers_size 32k;(后者建议为单 buffer 的 2 倍)
- 若启用 HTTP/2,还需在
http块中加:http2_max_field_size 16k; 和 http2_max_header_size 64k;
修正 Set-Cookie 的 Path 避免重定向失效
即使 502 解决了,重定向后浏览器仍可能不带 Cookie——因为后端设的 Path=/api/v1/,而用户访问的是 /app/,路径不匹配。
- 在同个
location块中加:proxy_cookie_path /api/v1/ /app/;(把后端路径映射到前端上下文) - 配合 proxy_redirect /api/v1/ /app/; 重写 302 的 Location 头
- 再加一行 rewrite ^/app/(.*)$ /api/v1/$1 break;,确保请求能正确转发到后端
从源头减少 Cookie 体积(长期更稳)
靠调大缓冲区是兜底,不是根治。重定向频繁出问题,往往说明 Cookie 已严重膨胀:
- 避免在单次响应里 set 多个长 Cookie;改用服务端 Session,只传一个短 session_id
- JWT 类 Token 不塞进 Set-Cookie,改走
Authorization: Bearer xxx或前端存 localStorage + 后端查表校验 - 清理调试头、冗余链路追踪 ID、未关闭的 X-RateLimit 等非必要响应头


















