Nginx配置长连接keepalive

Nginx 配置长连接 keepalive,本质上是在 Nginx 与上游后端(比如 PHP-FPM、Java 服务、Node 接口)之间复用 TCP 连接,避免每个请求都重新握手。
本文用零基础友好的方式,讲清楚上游后端 keepalive 连接池怎么配、怎么验证、踩坑后怎么查,跟着操作就能落地。

keepalive 解决的是哪一类性能浪费

当 Nginx 以反向代理方式转发请求时,默认对每个上游请求都会新建一条 TCP 连接,用完就关闭。
高并发下,三次握手和四次挥手会白白消耗 CPU 和端口资源,延迟也会升高。

配置 upstream 里的 keepalive 参数,就是让 Nginx 与后端之间保留一批空闲连接,在下一个请求到来时直接复用,从而降低握手次数。
需要注意:这个长连接是 Nginx 到后端 的,和浏览器到 Nginx 的 keep-alive 是两码事,别混在一起。

动手前先确认环境和版本

Nginx 的 keepalive 配置依赖 ngx_http_upstream_module,该模块默认编译进主线版本。
确认 Nginx 版本可执行:

nginx -v

如果输出 nginx version: nginx/1.18.0 这类信息,说明可用。
还要确认上游应用是否支持 HTTP/1.1 或 fastcgi keepalive,例如 PHP-FPM 8.0+ 默认支持,旧版本需检查官方文档。

另外需要知道后端的地址:IP 端口、域名或 Unix Socket。
这些信息决定 upstream 怎么写。

反向代理场景的 keepalive 配置示例

下面是一份完整示例,Nginx 将请求转发给本机 8080 端口服务,并开启连接池:

http {
    upstream backend {
        server 127.0.0.1:8080;
        keepalive 32;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
}

配置解释:

  • keepalive 32:指定 Nginx 为每个 worker 进程保留最多 32 个空闲连接,不是总连接数上限。
  • proxy_http_version 1.1:HTTP/1.0 默认不支持长连接,必须设为 1.1。
  • proxy_set_header Connection "":将请求头里的 Connection 清空,避免后端误判为需要关闭连接。

保存后测试并重载:

nginx -t
nginx -s reload

PHP-FPM 上游同样可以开启 keepalive

如果你的 Nginx 通过 fastcgi 转发给 PHP-FPM,配置稍有不同。
以常见的 Unix Socket 为例:

upstream php_backend {
    server unix:/run/php/php8.1-fpm.sock;
    keepalive 16;
}

server {
    location ~ \.php$ {
        fastcgi_pass php_backend;
        fastcgi_keep_conn on;
    }
}

关键点:fastcgi_keep_conn on; 必须开启,否则 FastCGI 响应后连接会立刻关闭,upstream 里的 keepalive 池形同虚设。

修改后同样执行 nginx -tnginx -s reload

验证效果与常见避坑

配置生效后,可以用 ss 命令观察连接状态:

ss -tn | grep 8080

如果看到大量 ESTAB 状态的连接,说明长连接正在复用。
压测时还可以对比开启前后的 Time_wait 数量,正常情况下会明显减少。

常见坑有三个:

  1. keepalive 数值过大:如果并发请求低于空闲连接数,后端会一直保持多余连接,占用内存和文件句柄。建议从 16 或 32 开始,结合监控调整。
  2. 忘记设置 proxy_http_version 1.1:连接默认按 HTTP/1.0 处理,keepalive 无法生效。
  3. 与后端超时配置不匹配:Nginx 的 proxy_read_timeoutproxy_send_timeout 若小于后端的空闲超时,可能导致连接被后端回收后 Nginx 仍复用,产生偶发 502。可尝试将 Nginx 超时时间设置到 60s,并确认后端闲置超时大于 Nginx 的空闲时间。

如果你正在处理 Nginx 配置长连接 keepalive,上游后端 keepalive 连接池相关的问题,建议先按本文步骤完整执行,再根据自己的环境微调;
遇到异常时优先回看避坑和高频问题部分,逐步排除。

分享到:
上一篇
服务器磁盘健康监控smartctl
下一篇
KVM qcow2镜像压缩,减小镜像磁盘占用空间
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意