Nginx TCP代理高并发需调优Linux内核参数:增大连接队列(somaxconn、tcp_max_syn_backlog)、加速TIME-WAIT复用(tw_reuse、local_port_range)、放宽资源限制(file-max、rmem/wmem)并配置系统级文件句柄上限。

要让 Nginx 在 TCP 代理(如 stream 模块反代数据库、Redis、TLS 流量等)场景下支撑更高并发,光调 Nginx 配置远远不够——系统内核参数才是底层瓶颈所在。TCP 代理对连接建立速度、连接复用率、端口回收效率和队列吞吐极为敏感,而这些全由 Linux 内核控制。
关键 TCP 连接队列参数必须匹配
Nginx stream 模块监听 socket 的连接接纳能力直接受内核队列限制。若不调优,高并发建连时会直接丢 SYN 包,现象是客户端频繁报 Connection refused 或超时。
-
net.core.somaxconn = 65535:监听队列最大长度,必须 ≥ Nginx
listen ... backlog=65535的值;建议设为 65535(USHRT_MAX 上限) - net.ipv4.tcp_max_syn_backlog = 65535:SYN 半连接队列容量,应对突发握手洪峰;低于 somaxconn 会导致 SYN 包被内核静默丢弃
- net.core.netdev_max_backlog = 262144:网卡软中断接收队列,防止网卡收包过快但内核来不及处理而丢包
加速 TIME-WAIT 端口回收与复用
TCP 代理常面临大量短连接(如 Redis 查询、MySQL 小事务),极易堆积 TIME-WAIT 连接,耗尽本地端口或触发 Cannot assign requested address 错误。
- net.ipv4.tcp_tw_reuse = 1:允许将处于 TIME-WAIT 状态的端口快速复用于新 出向 连接(Nginx 作代理发起后端连接时生效)
- net.ipv4.ip_local_port_range = 1024 65535:扩大临时端口范围,提供约 6.4 万个可用端口(默认仅 3.2 万)
- net.ipv4.tcp_fin_timeout = 30:缩短 FIN_WAIT_2 超时时间,加快连接彻底关闭;避免长时间悬挂
- 禁用 tcp_tw_recycle:该参数在 NAT/负载均衡环境下会导致连接异常,已废弃,务必设为 0
放宽资源上限与缓冲区限制
TCP 代理不涉及 HTTP 解析,但更依赖稳定的大吞吐网络通道,需保障内存缓冲充足、文件句柄无瓶颈。
- fs.file-max = 2097152:系统级最大文件描述符数,应 ≥ Nginx worker_rlimit_nofile × worker_processes
- net.core.rmem_max / wmem_max = 16777216(16MB):提升单连接收发缓冲上限,适应高延迟或带宽突增链路
- net.ipv4.tcp_rmem / tcp_wmem = "4096 65536 8388608":设置为自动缩放模式,兼顾小包低延迟与大流吞吐
- vm.swappiness = 1:极低交换倾向,防止 Nginx 内存压力下触发 swap,导致代理延迟飙升
配套系统级限制不可遗漏
内核参数只是基础,还需确保 Nginx 进程实际能用到这些资源:
- 在
/etc/security/limits.conf中添加:
* soft nofile 100000
* hard nofile 100000 - Nginx 主配置中显式声明:
worker_rlimit_nofile 100000; - 若使用 systemd 启动,需在 service 文件中加:
LimitNOFILE=100000 - 生效后验证:
cat /proc/$(pgrep nginx)/limits | grep "Max open files"应显示 100000



















