应根据 error.log 中实测 header 字节数(如 header: 14280)设置略大的 fastcgi_buffer_size(如 16k),确保 ≤ fastcgi_buffers 单块大小,并同步配置 fastcgi_busy_buffers_size 和 fastcgi_temp_file_write_size。

直接根据错误日志里暴露的真实响应头大小来设,不靠猜测、不堆数值。它只管状态行和所有 HTTP 头(比如 Set-Cookie、Location、X-Debug-Info),和页面内容完全无关。
从 error.log 抓真实头体积
遇到 502 或关键 Header 截断(如登录跳转失败、Cookie 丢失),打开 Nginx 错误日志(常见路径:/var/log/nginx/error.log),搜索关键词:
upstream sent too big header
找到对应行,末尾会明确标出字节数,例如:
header: 14280 bytes
这个 14280 就是 PHP 实际输出的响应头总长度——它是调优的唯一依据。
设一个“刚好够用”的 fastcgi_buffer_size 值
取比日志数字略大的、2 的幂值(利于内存对齐,也符合 Nginx 内部分配逻辑):
- 14280 → 推荐 16k(16384 字节)
- 21500 → 推荐 32k(32768 字节)
- 超过 48KB 才考虑 64k;绝大多数伪静态或调试场景,16k–32k 覆盖 95% 以上情况
在 location ~ \.php$ { } 块中添加一行即可:
fastcgi_buffer_size 16k;
检查并匹配 fastcgi_buffers 单块大小
该值必须 ≤ fastcgi_buffers 中每个 buffer 的 size,否则配置无效:
- 若已有
fastcgi_buffers 8 16k;,则fastcgi_buffer_size最大只能设为 16k - 想设
32k?就得同步改为fastcgi_buffers 8 32k;或fastcgi_buffers 12 32k; - 不用删旧配置,补上
fastcgi_buffer_size就能生效
顺手调好配套参数防连锁问题
单改一个容易引发新问题,建议一并确认:
- fastcgi_busy_buffers_size:设为单个 buffer 大小的 2 倍,如用 16k buffer 就设 32k
-
fastcgi_temp_file_write_size:也设成和
fastcgi_busy_buffers_size一致,避免小块频繁刷磁盘 - 确保
fastcgi_pass指向正确(127.0.0.1:9000或 socket 路径),且 PHP-FPM 进程正在运行
改完执行:
nginx -t && nginx -s reload
再用 curl -I 访问原页面,检查 Set-Cookie、Location 等关键头是否完整返回。











