必须协同配置upstream长连接池、fastcgi协议层握手控制和php-fpm并发参数;仅启用fastcgi_keep_conn on无效。需在http块定义upstream并设keepalive 8,location中配fastcgi_keep_conn on、fastcgi_http_version 1.1及空connection头,并对齐pm.max_children与pm.max_requests。

要真正让 Nginx 与 PHP-FPM 建立并复用 TCP 连接,不能只开 fastcgi_keep_conn on 就完事——它只是协议层握手控制的一环,必须配合 upstream 长连接池和 PHP-FPM 并发参数协同生效。
1. 先定义带 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 8表示每个 worker 最多缓存 8 个空闲连接;该值不能超过 PHP-FPM 的pm.max_children(如后者为 10,设 8 较稳妥) - 避免写
keepalive 100这类过大值,否则空闲连接堆积,反而压垮后端
2. 在 location 中启用 fastcgi_keep_conn 并强制 HTTP/1.1
仅 upstream 开启不够,Nginx 必须以 FastCGI over HTTP/1.1 协议通信,且清除干扰头:
- 替换原
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_keep_conn on是开关指令,告诉 Nginx 不要在每次请求后主动断开 FastCGI 连接 -
Connection ""必须是空字符串(双引号内无字符),不是"keep-alive",也不是"close",否则 PHP-FPM 会误判并立即关闭连接
3. 对齐 PHP-FPM 的并发与回收策略
长连接能否稳定复用,取决于后端是否“愿意留着连接”。需检查 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不宜过短,避免连接被异常中断
4. 验证是否生效
配置完成后重载 Nginx,并观察实际连接行为:
- 执行
ss -ant | grep :9000 | grep ESTAB | wc -l,高并发下应稳定在keepalive设定值附近(如设 8,通常维持 6–8 个 ESTABLISHED) - 对比优化前后
ss -ant | grep TIME_WAIT | wc -l,正常可从数百上千降至 20 以内 - 查看 Nginx error.log 是否有
upstream sent too big header或recv() failed类报错,这类错误常因 Connection 头未清空导致











