应按框架响应特征配置scgi_buffers:thinkphp等头重体大,需设scgi_buffer_size 16k、scgi_buffers 12 32k;laravel大json或报表导出则用32 256k;同步调大scgi_busy_buffers_size至总量1/3~1/2,并手动定义scgi_param替代include避免path_info冲突。

配置 scgi_buffers 承载 ThinkPHP、Laravel 等特殊后端框架的复杂响应,关键不是堆大内存,而是匹配其输出模式——比如 ThinkPHP 依赖 PATH_INFO 路由、常带长 Header;Laravel 可能返回含 Base64 图片字段的大 JSON。盲目套用默认值(如 scgi_buffers 8 4k)极易触发临时文件落盘或 502 错误。
按框架响应特征设定缓冲结构
ThinkPHP 和多数 PHP 框架输出不是均匀流,而是“头重体大”:响应头常含大量 Cookie、JWT、X-Powered-By、自定义 Header,体积轻松超 8KB;响应体则可能因模板渲染、ORM 预加载而达 200–800KB。
- 若后端平均响应头约 12KB →
scgi_buffer_size 16k(必须 ≤ 单块scgi_buffers大小) - 若典型 HTML/JSON 响应体集中在 300KB 左右 → 推荐
scgi_buffers 12 32k(总 384KB,留余量) - 若支持报表导出或附件预览(单次响应达 5–20MB)→ 可设
scgi_buffers 32 256k(总 8MB),但需确认服务器内存充足
协同控制“忙缓冲区”上限防阻塞
scgi_busy_buffers_size 决定 Nginx 能否持续从 SCGI 后端读数据。设太小,后端一发大响应就卡住;设太大,又挤占空闲 buffer,影响并发接收能力。
- 对应
scgi_buffers 12 32k(总量 384KB)→ 设scgi_busy_buffers_size 128k(约总量 1/3,且 ≥ 单块 32k) - 对应
scgi_buffers 32 256k(总量 8MB)→ 设scgi_busy_buffers_size 2m~4m - 务必确保
scgi_buffering on已启用,否则该参数不生效
绕过 scgi_params 冲突,手动构造安全参数
标准 include scgi_params; 包含大量 CGI 兼容变量(如 SCRIPT_NAME、PATH_TRANSLATED),与 ThinkPHP 的 PATH_INFO 路由机制冲突,易导致 404 或路由错乱。
- 删除
include scgi_params;,改用显式scgi_param定义最小必要集 - 强制入口:
scgi_param SCRIPT_FILENAME $document_root/index.php; - 精准路由:
scgi_param PATH_INFO $path_info;(需配合 location 正则捕获$path_info) - 保障元信息:
scgi_param REQUEST_URI $request_uri;、scgi_param QUERY_STRING $query_string;、scgi_param SCGI 1;
验证是否真正适配框架行为
reload 后不能只看服务是否启动,要观察真实响应路径:
- 用
curl -s -w "%{size_header}\n%{size_download}\n" -o /dev/null http://site/api/test查看头+体大小,确认未超出scgi_buffer_size + (scgi_buffers × size)总和 - 检查 error log 是否还有
upstream sent too big header(说明scgi_buffer_size不够)或using temporary file(说明 body 缓冲不足) - 对 ThinkPHP 路由路径如
/admin/user/edit/123,确认 Nginx 返回 200 且页面内容完整,无路由跳转失败或空白










