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 -t 和 nginx -s reload。
验证效果与常见避坑
配置生效后,可以用 ss 命令观察连接状态:
ss -tn | grep 8080
如果看到大量 ESTAB 状态的连接,说明长连接正在复用。
压测时还可以对比开启前后的 Time_wait 数量,正常情况下会明显减少。
常见坑有三个:
keepalive数值过大:如果并发请求低于空闲连接数,后端会一直保持多余连接,占用内存和文件句柄。建议从 16 或 32 开始,结合监控调整。- 忘记设置
proxy_http_version 1.1:连接默认按 HTTP/1.0 处理,keepalive 无法生效。 - 与后端超时配置不匹配:Nginx 的
proxy_read_timeout和proxy_send_timeout若小于后端的空闲超时,可能导致连接被后端回收后 Nginx 仍复用,产生偶发 502。可尝试将 Nginx 超时时间设置到 60s,并确认后端闲置超时大于 Nginx 的空闲时间。
如果你正在处理 Nginx 配置长连接 keepalive,上游后端 keepalive 连接池相关的问题,建议先按本文步骤完整执行,再根据自己的环境微调;
遇到异常时优先回看避坑和高频问题部分,逐步排除。