Nginx 反向代理优化后端性能,核心是在 upstream 配置块中设置 keepalive 参数,并在 location 中强制使用 HTTP/1.1 协议。这适用于后端服务稳定且并发较高的场景,风险在于若后端连接数限制过低,过大的 keepalive 值会导致连接拒绝。
先说结论:开启 upstream keepalive 能减少 TCP 握手开销,但必须配合 HTTP/1.1 和清除 Connection 头才能生效。
- 先定位:确认后端服务支持长连接且未强制关闭连接。
- 先做:在 upstream 块设置 keepalive 数值,在 location 块设置 proxy_http_version 1.1。
- 再验证:通过 netstat 或 ss 命令观察 ESTABLISHED 连接数是否稳定复用。
快速处理思路
配置 Nginx 长连接不需要复杂命令,重点在于修改配置文件并平滑重载。以下是最小可用配置片段,直接替换原有 upstream 和 location 对应部分。
upstream backend_pool {
server 127.0.0.1:8080;
keepalive 32;
}
server {
location / {
proxy_pass http://backend_pool;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}为什么会这样
默认情况下 Nginx 与后端建立的是短连接,每次请求都会经历 TCP 三次握手和四次挥手。开启 keepalive 后,Nginx 工作进程会维护一个空闲连接缓存池,后续请求直接复用已建立的连接。这能显著降低 CPU 消耗和网络延迟,但前提是协议版本和 Header 设置必须允许连接保持存活。
分步处理
按顺序执行以下操作,确保配置生效且不影响现有业务。
第一步:备份配置文件
在修改前备份当前配置,防止语法错误导致服务不可用。cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
第二步:修改 upstream 配置
找到定义后端的 upstream 块,添加 keepalive 指令。数值建议根据 worker 进程数和后端承受能力设定,公开资料中没有看到可靠的量化数据,通常从 32 或 64 开始测试。
第三步:修改 location 配置
在调用该 upstream 的 location 块中,必须显式指定 proxy_http_version 1.1,默认是 1.0 不支持长连接。同时添加 proxy_set_header Connection ""; 清除默认的 Close 头。
第四步:检查并重载
先检查语法正确性,再发送信号重载配置。nginx -t && nginx -s reload
怎么验证是否生效
配置完成后,通过连接状态和日志确认长连接是否建立。
1. 检查网络连接状态
使用 ss 或 netstat 观察 Nginx 到后端的连接数。如果长连接生效,会看到多个请求复用少量 ESTABLISHED 状态连接,而不是频繁出现 TIME_WAIT。ss -ant | grep 8080
2. 查看 Nginx 错误日志
观察 error.log 是否有 upstream 连接重置或关闭的报错。若配置错误,可能会看到 upstream prematurely closed connection。
3. 监控后端负载
观察后端服务的活跃连接数监控。如果 Nginx 侧 keepalive 设置过大,后端连接数可能会持续居高不下。
常见坑
1. 默认协议版本错误
不设置 proxy_http_version 1.1 时,Nginx 默认使用 1.0,会在请求头带上 Connection: close,导致长连接失效。
2. 后端主动关闭连接
部分后端框架或应用服务器(如某些 Tomcat 配置、PHP-FPM)默认超时时间较短,若 Nginx keepalive 超时时间长于后端,连接会被后端强制切断。
3. 多 worker 进程影响keepalive 限制的是每个 worker 进程的空闲连接数,总连接数约为 keepalive 值 * worker_processes 数,需评估后端总承载能力。
常见问题
keepalive 数值设置多少合适?
没有统一标准,建议根据后端最大连接数除以 Nginx worker 进程数来估算,先从较小值如 32 开始观察。
WebSocket 服务需要配置 keepalive 吗?
不需要,WebSocket 协议本身基于 Upgrade 头建立长连接,不依赖 HTTP keepalive 机制,但需确保 proxy_http_version 1.1 已启用。
配置后为什么后端连接数反而升高?
因为连接被复用且不再频繁关闭,活跃连接数会维持在 keepalive 设定的水位,这是正常现象,需确认后端是否达到最大连接限制。
参考来源
- 来源名:Nginx Official Documentation
页面标题:ngx_http_upstream_module
URL:https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive - 来源名:Nginx Official Documentation
页面标题:ngx_http_proxy_module
URL:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version