要让 worker_connections 发挥高并发能力,需同步调高 ulimit -n、worker_rlimit_nofile、fs.file-max 和 somaxconn 等系统级限制,并配置 events 块 use epoll; multi_accept on; accept_mutex on; 起步值推荐 4096~8192。

要让 worker_connections 真正发挥高并发能力,不能只改 Nginx 配置文件里的一个数字。它必须和操作系统级的资源限制层层对齐——从单进程文件描述符上限(ulimit),到整个系统的句柄总量(fs.file-max),再到内核网络队列深度(somaxconn),缺一不可。否则再高的配置也卡在系统层,报错 “Too many open files” 或直接丢连接。
先确认并调高单进程文件描述符限制
worker_connections 的实际生效值,不会超过当前 Nginx worker 进程能打开的最大文件数(即 ulimit -n)。Linux 默认是 1024,远不够用。
- 临时生效:启动 Nginx 前执行
ulimit -n 65536(需 root 或 nginx 用户权限) - 永久生效:编辑
/etc/security/limits.conf,添加两行(把nginx替换为实际运行用户,如www-data):nginx soft nofile 65536nginx hard nofile 65536 - 验证方式:
ulimit -n查当前会话值;或用cat /proc/$(pgrep nginx)/limits | grep "Max open files"查已运行 worker 进程的实际限制
同步设置 Nginx 进程级句柄上限
仅靠系统 limits 不够,Nginx 主配置中还需显式声明进程能申请的文件描述符上限:
- 在
nginx.conf的主上下文(http 块之外)添加:worker_rlimit_nofile 65536; - 该值应 ≥
worker_connections,推荐设为相同数值或略高(如 1.2 倍),确保 Nginx 有足够余量处理日志、上游连接等额外开销
扩大系统总文件句柄池与网络队列
所有 worker 进程加起来打开的连接总数,不能超过系统全局上限 /proc/sys/fs/file-max。高频短连接场景下,还要防止 listen 队列溢出:
- 查看当前值:
cat /proc/sys/fs/file-max - 临时调高:
sysctl -w fs.file-max=2000000 - 永久生效:在
/etc/sysctl.conf中添加fs.file-max = 2000000,再执行sysctl -p - 提升 TCP 监听队列长度:
net.core.somaxconn = 65535(默认常为 128) - 增大网卡接收队列:
net.core.netdev_max_backlog = 25000 - 启用 TIME-WAIT 复用:
net.ipv4.tcp_tw_reuse = 1,缩短回收时间:net.ipv4.tcp_fin_timeout = 30
合理设定 worker\_connections 与 events 协同参数
数值不是越大越好,要结合硬件资源和业务特征:
- 推荐起步值:4096 或 8192;API 或短连接密集型服务可设 16384~65535
- 配套
events块必须显式配置:use epoll;(Linux 必须指定,避免回退低效模型)multi_accept on;(一次事件循环尽可能多 accept,缓解突发流量排队)accept_mutex on;(默认开启,防“惊群”,与 multi_accept 协同) - 若纯短连接场景,可考虑
keepalive_timeout 0;释放连接槽位;若需长连接,建议设为 15–30 秒










