nginx 单机支撑千万级 tcp 并发需内核协同、进程模型适配、连接管理优化与 stream 模块调参四者联动;须绑定 worker 到 cpu 核心、调高文件描述符与队列上限、精简 stream 配置、重调 tcp 内核参数。

要让 Nginx 真正支撑千万级 TCP 并发,不能只靠堆配置,关键在于内核协同、进程模型适配、连接管理优化与 stream 模块精准调参四者联动。单机千万连接是可行的,但需系统级配合,不是单纯改几个 nginx.conf 参数就能达成。
CPU 与进程:用对 worker 进程模型
Nginx 的并发能力根基在 Master-Worker 架构。千万连接下,必须让每个 Worker 绑定到独立 CPU 核心,避免上下文切换开销:
- 设置 worker_processes auto,Nginx 会自动识别 NUMA 节点并匹配物理核心数,比手动写死数字更稳
- 启用 worker_cpu_affinity auto,实现自动 CPU 亲和绑定,减少缓存失效
- 关闭 multi_accept off(默认),避免单次事件循环抢收过多连接导致延迟毛刺;高吞吐场景可设为 on,但需配合足够大的 backlog
连接容量:突破文件描述符与连接队列瓶颈
千万连接意味着至少 1000 万级文件描述符(FD)和足够深的 listen 队列。仅改 nginx 配置远远不够:
- 系统层:/etc/security/limits.conf 中设置 nofile 为 10485760(即 1000 万+),并确保 systemd 服务启动时继承该限制
- Nginx 层:worker_rlimit_nofile 10485760 显式声明上限,与系统一致
- listen 指令加 backlog=65535(Linux 默认 128),防止 SYN 队列溢出丢包
- stream 块中务必设 proxy_timeout 30s 和 proxy_responses 1(对无响应协议如 MySQL handshake 更友好)
Stream 模块:TCP 负载均衡专用调优
HTTP 模块不处理 TCP 流量,千万级 TCP 并发必须走 stream { ... } 上下文,且配置需精简高效:
- upstream 内禁用 slow_start 和 max_fails 过于频繁的健康检查(TCP 连接探测本身就有开销),改用轻量 health_check interval=10 fails=3 passes=2
- server 块中关闭日志:access_log off;如需审计,用 log_format proxy 定义紧凑字段,并异步写入
- 避免在 stream 中使用 resolver(DNS 解析阻塞),后端地址尽量用 IP + 端口硬编码;若必须动态,启用 resolver 127.0.0.1 valid=30s 并搭配本地 DNS 缓存
内核参数:TCP 栈必须重调
Nginx 是用户态程序,真正承载千万连接的是 Linux 内核 TCP 栈。以下参数需写入 /etc/sysctl.conf 并生效:
- net.core.somaxconn = 65535:提升全连接队列上限
- net.ipv4.tcp_max_syn_backlog = 65535:提升半连接队列,防 SYN Flood
- net.ipv4.ip_local_port_range = 1024 65535:扩大客户端可用端口范围
- net.ipv4.tcp_tw_reuse = 1 和 net.ipv4.tcp_fin_timeout = 30:加速 TIME_WAIT 回收,避免端口耗尽
- fs.file-max = 12000000:系统级最大文件句柄数,高于 nginx 设置值











