Nginx短连接性能关键在于加速连接生命周期与资源周转而非Event Loop本身提速;需优化accept调度、关闭keepalive、提升fd限制、协同内核快速释放TIME_WAIT等状态。

让新连接进来得更快
短连接洪峰下,大量已完成三次握手的连接堆在内核全连接队列里,等 Nginx 调用 accept()。Event Loop 若响应慢,就会丢包或延迟:
- 显式配置
listen 80 backlog=65535;,把监听 socket 的待 accept 队列拉满 - 配套调高内核参数:
net.core.somaxconn = 65535,否则 backlog 设置无效 - 开启
multi_accept on;,让每次 epoll_wait 返回后,一次性 accept 所有就绪连接,减少轮询次数 - 关闭
accept_mutex off;(高并发场景),避免多个 worker 进程争抢监听锁,提升 accept 并发度
让空闲连接不留过夜
短连接本该秒级结束,但默认 keepalive_timeout 60 会让已关闭的连接继续占着 worker_connections 槽位长达一分钟,白白浪费并发容量:
- 直接设
keepalive_timeout 0;,响应完立即断开,不维持长连接 - 启用
reset_timedout_connection on;,对握手超时、读写卡死的连接主动发 RST,避免滞留在 FIN_WAIT2 状态 - 无需设置
keepalive_requests,因为 timeout=0 时该指令自动失效
让系统资源跟得上节奏
短连接生命周期短,但建销极快,文件描述符(fd)最先耗尽。Event Loop 再快,没 fd 可用也无济于事:
- 检查当前限制:
cat /proc/$(pgrep nginx)/limits | grep "Max open files" - 在
/etc/security/limits.conf中为 nginx 用户设:nginx soft nofile 1048576和hard nofile 1048576 - Nginx 主配置中加:
worker_rlimit_nofile 1048576; - 确保
worker_connections不超过系统 ulimit 值,常见配比是 8K–16K per worker
让内核帮着加速状态流转
Nginx 不管 TCP 状态机,但连接能否快速释放,取决于内核对 TIME_WAIT、FIN_WAIT2 等状态的处理效率:
-
net.ipv4.tcp_tw_reuse = 1:允许 TIME_WAIT socket 复用于新的 outbound 连接(反向代理尤其有用) -
net.ipv4.tcp_fin_timeout = 30:缩短 FIN_WAIT2 超时,加快被动关闭连接释放 -
net.ipv4.tcp_max_syn_backlog = 65535:配合 somaxconn,缓解 SYN 洪峰压力 - 压测时用
ss -lnt观察 Recv-Q 是否持续非零,这是队列积压的直接信号


















