phpenv中nginx长连接生效必须同步配置upstream keepalive、fastcgi_http_version 1.1和fastcgi_set_header connection '',仅设fastcgi_keep_conn on或调大keepalive_timeout无效;需确保upstream块显式定义、协议版本正确、connection头清空,并与php-fpm的pm.max_children和pm.max_requests参数对齐。

只写 fastcgi_keep_conn on 是无效的。它只是 FastCGI 协议层的一个握手开关,真正实现连接复用必须在 upstream、协议协商、PHP-FPM 三端协同生效。
1. 定义带 keepalive 的 upstream 块
默认 nginx.conf 没有 upstream,所有 fastcgi_pass 127.0.0.1:9000 都是直连短连接,无法复用。
- 在
http { }最上方手动添加:
upstream php_backend {<br> server 127.0.0.1:9000;<br> keepalive 8;<br> keepalive_requests 1000;<br> keepalive_timeout 60s;<br>}
-
keepalive 8:每个 Nginx worker 最多缓存 8 个空闲连接,该值不能超过 PHP-FPM 的pm.max_children(例如后者为 10,设 8 更稳妥) -
keepalive_requests 1000:单连接最多处理 1000 个请求,建议与 PHP-FPM 的pm.max_requests对齐 -
keepalive_timeout 60s:空闲连接保持时间,不是全局keepalive_timeout,两者无关
2. location 中强制 HTTP/1.1 并清空 Connection 头
仅 upstream 开启不够——若协议版本错误或头部干扰,Nginx 仍会降级为短连接。
- 替换原
fastcgi_pass 127.0.0.1:9000;为:
fastcgi_pass php_backend;<br>fastcgi_keep_conn on;<br>fastcgi_http_version 1.1;<br>fastcgi_set_header Connection "";
-
fastcgi_http_version 1.1是协议基础,FastCGI 复用依赖此语义 -
Connection ""必须是双引号内完全为空(无空格、无字符),写成"close"或"keep-alive"都会导致 PHP-FPM 主动断连 - 保留
include fastcgi_params;,确保SCRIPT_FILENAME等关键参数不丢失
3. 对齐 PHP-FPM 的并发与回收策略
长连接能否稳定复用,取决于后端是否“愿意留着连接”。需检查 www.conf:
-
pm.max_children = 10→ upstream 的keepalive值建议 ≤ 8 -
pm.max_requests = 1000→ 可同步设upstream keepalive_requests 1000,避免单连接因超请求数被主动关闭 -
request_terminate_timeout和request_slowlog_timeout不宜过短(如低于 30s),防止连接被异常中断 - 确认
listen = 127.0.0.1:9000且listen.allowed_clients = 127.0.0.1,避免网络层拦截
4. 验证是否真正生效
配置重载后,通过以下方式观察实际连接行为:
- 运行
ss -ant | grep :9000 | grep ESTAB | wc -l:高并发下应稳定在keepalive设定值附近(如设 8,通常维持 6–8 个 ESTABLISHED) - 对比优化前后
ss -ant | grep TIME_WAIT | wc -l:正常可从数百上千降至 20 以内 - 检查
error.log是否出现upstream prematurely closed connection类报错,常见原因是Connection ""未清空或fastcgi_http_version未设为 1.1
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











