fastcgi_buffer_size的核心作用是专门容纳fastcgi响应头(status line+所有http headers),不处理页面内容;需根据error.log中“header: 14280 bytes”等实测值,取略大的2的幂值(如16k)设置,并确保≤fastcgi_buffers单块大小,同步配置fastcgi_busy_buffers_size和fastcgi_temp_file_write_size。

fastcgi_buffer_size 的核心作用是专门容纳 FastCGI 响应头(status line + 所有 HTTP headers),它不参与页面内容缓存。设小了会截断 Cookie、Location 或调试头导致 502 或跳转失败;设大了则纯属浪费内存,尤其在高并发下会显著抬升每个请求的固定内存开销。
从 error.log 抓真实 header 大小
别猜、别套模板。打开 /var/log/nginx/error.log,搜索关键词:upstream sent too big header。找到类似这一行:
upstream sent too big header while reading response header from upstream, client: 192.168.1.100, server: example.com, request: "GET /api/user HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "example.com", referrer: "-", header: 14280 bytes
这个 14280 就是 PHP 实际输出的响应头总字节数——它是唯一可靠依据。
设一个“刚好够用”的值
取比日志数字略大的、2 的幂值(利于内存对齐,也匹配 Nginx 内部分配逻辑):
- 14280 → 推荐 16k(16384 字节)
- 21500 → 推荐 32k(32768 字节)
- 超过 48KB 才考虑 64k;95% 的 WordPress、Laravel 或调试接口场景,16k–32k 已覆盖
在 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 即可,Nginx reload 后立即生效。
配套调好 busy 和 temp 写入参数
单改 fastcgi_buffer_size 容易引发连锁问题,建议一并确认:
- fastcgi_busy_buffers_size:设为单个 buffer 大小的 2 倍,例如用 16k buffer 就设 32k
-
fastcgi_temp_file_write_size:与
fastcgi_busy_buffers_size保持一致(如 32k),避免小块频繁刷磁盘 - 确保
fastcgi_pass指向正确(127.0.0.1:9000或 Unix socket 路径),且 PHP-FPM 进程正在运行











