仅启用fastcgi_keep_conn on无效,必须协同配置upstream长连接池(含keepalive、keepalive_requests、keepalive_timeout)、fastcgi协议层强制http/1.1并清空connection头,以及对齐php-fpm的pm.max_children和pm.max_requests参数,三者缺一不可。

只写 fastcgi_keep_conn on 是无效的——它不是独立开关,而是长连接复用链条中的一环。真正生效必须同时满足 upstream 连接池、协议层握手、PHP-FPM 后端容量三者对齐。
定义带 keepalive 的 upstream 块
默认 nginx.conf 没有 upstream,所有 fastcgi_pass 127.0.0.1:9000 都是直连短连接。需在 http { } 最上方手动添加:
upstream php_backend {
server 127.0.0.1:9000;
keepalive 8;
keepalive_requests 1000;
keepalive_timeout 60s;
}
-
keepalive 8 表示每个 Nginx worker 最多缓存 8 个空闲连接;该值不能超过 PHP-FPM 的
pm.max_children(如后者为 10,设 8 更稳妥) -
keepalive_requests 1000 防止单连接因请求数超限被 PHP-FPM 主动断开,建议与
pm.max_requests保持一致 -
keepalive_timeout 60s 是空闲连接保活时间,和全局
keepalive_timeout无关
location 中强制 HTTP/1.1 并清空 Connection 头
仅 upstream 开启不够,Nginx 必须以 FastCGI over HTTP/1.1 协议通信,且清除干扰头:
location ~ \.php$ {
fastcgi_pass php_backend;
fastcgi_keep_conn on;
fastcgi_http_version 1.1;
fastcgi_set_header Connection "";
include fastcgi_params;
}
-
fastcgi_http_version 1.1是协议基础,缺它则降级为 HTTP/1.0,无法复用连接 -
fastcgi_set_header Connection ""必须是双引号内完全无字符(不是"keep-alive",也不是"close"),否则 PHP-FPM 会误判并立即关闭连接 -
include fastcgi_params不可省略,确保SCRIPT_FILENAME等关键参数正常传递
对齐 PHP-FPM 的并发与回收策略
长连接能否稳定复用,取决于 PHP-FPM 是否“愿意留着连接”:
- 检查
/etc/php/*/fpm/pool.d/www.conf,确认pm = dynamic或pm = ondemand -
pm.max_children应 ≥ upstream 的keepalive值(例如 keepalive 设 8,则 max_children 至少为 8) -
pm.max_requests建议设为 500–1000,避免进程过早退出导致连接中断 -
request_terminate_timeout和request_slowlog_timeout不宜过短(如低于 30s),防止连接被异常中止
验证是否真正生效
配置重载后,用以下命令观察真实连接状态:
- 运行
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 ""写成带空格或非空字符串
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











