单机百万并发需四层资源对齐:系统总句柄池、用户级文件描述符上限、Nginx进程级声明(worker_rlimit_nofile)、worker事件调度能力(worker_connections),任一环节不足均导致“Too many open files”或连接被丢弃。

单机百万并发不是改一个 worker_connections 就能实现的,它本质是四层资源对齐的结果:系统总句柄池、用户级文件描述符上限、Nginx 进程级声明、以及 worker 自身的事件调度能力。任一环节卡住,连接数就上不去,报错“Too many open files”或连接被内核丢弃。
打通系统级文件描述符上限
Linux 默认单进程最多打开 1024 个 fd,而每个 TCP 连接至少占 1 个 fd。若目标是百万连接,8 个 worker 进程 × 每个 131072 连接 = 1048576,那系统必须允许单进程打开至少 131072 个文件描述符:
- 编辑 /etc/security/limits.conf,添加(以 nginx 用户为例):
nginx soft nofile 131072nginx hard nofile 131072 - systemd 管理的服务需额外配置:
在 /etc/systemd/system/nginx.service.d/override.conf 中加入:[Service]LimitNOFILE=131072
再执行systemctl daemon-reload && systemctl restart nginx - 验证是否生效:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",输出软硬限制应均为 131072
同步设置 Nginx 进程级资源声明
worker_rlimit_nofile 是 Nginx 主进程向系统申请的“最大可打开文件数”,它必须 ≥ 单个 worker 的 worker_connections × worker_processes 总和,否则启动失败或静默降级:
- 在 nginx.conf 全局块(
http块之外)添加:worker_rlimit_nofile 131072; - 该值不能超过
ulimit -Hn,否则无效;建议与worker_connections保持一致或略高(如 1.2 倍),为日志、上游连接等留余量
调优 events 块关键行为参数
仅提高数值不等于提升吞吐,必须匹配 Linux 高效事件模型和连接接收策略:
-
use epoll;:显式启用 epoll,避免回退到 select/poll 的 1024 硬限制 -
multi_accept on;:让一个 worker 在一次事件循环中 accept 尽可能多的新连接,压测显示吞吐可提升 30%+ -
accept_mutex off;:高并发多 IP 场景下关闭争抢锁,尤其搭配reuseport效果更佳 -
worker_connections 131072;:设在events块内,配合worker_processes auto;(通常等于 CPU 核心数)
补齐内核与网络底层限制
连接还没进 Nginx 就被系统丢弃?常见于 listen 队列满或全局句柄池不足:
- 扩大系统总句柄池:
在 /etc/sysctl.conf 添加fs.file-max = 1300000(≈ 100 万 × 1.3),执行sysctl -p - 增大 TCP 监听队列:
net.core.somaxconn = 65535(默认常为 128) - 缓解 TIME-WAIT 压力:
net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 30



















