直接提升 worker_connections 无法真正提高连接能力,必须同步调优系统文件描述符限制、Nginx 进程级句柄上限和内核网络队列参数,并按业务类型合理设置数值。

直接提升 worker_connections 数值本身并不能真正提高连接能力。它只是配置表象,背后必须打通系统资源、Nginx 自身限制和内核调度三道关卡,否则只会报 “Too many open files”,或连接被静默拒绝。
对齐系统级文件描述符限制
每个 TCP 连接至少占用 1 个文件描述符(fd),Nginx worker 进程还要额外用 fd 处理日志、上游连接、SSL 缓存等。若系统默认 ulimit -n 是 1024,你却设 worker_connections 8192,实际生效上限就是 1024。
- 永久生效:编辑
/etc/security/limits.conf,添加(把nginx替换为实际运行用户,如www-data):
nginx soft nofile 65536
nginx hard nofile 65536 - systemd 管理的服务还需在
/etc/systemd/system/nginx.service.d/override.conf中加:[Service] LimitNOFILE=65536
- 执行
systemctl daemon-reload && systemctl restart nginx,再用cat /proc/$(pgrep nginx)/limits | grep "Max open files"验证是否生效。
同步设置 Nginx 进程级句柄上限
系统允许 ≠ Nginx 能用。Nginx 必须显式声明自己能申请多少 fd,否则会自我限制。
- 在
nginx.conf的主块(http块外)添加:
worker_rlimit_nofile 65536; - 该值应 ≥
worker_connections,推荐设为相同值或略高(如 1.2 倍),为日志、上游连接等留余量;若超过系统硬限制,Nginx 启动会失败或静默降级。
匹配内核网络队列与事件模型
连接还没进 Nginx 就被内核丢弃,调高 worker_connections 也没用。
- 修改
/etc/sysctl.conf:net.core.somaxconn = 65535 net.core.netdev_max_backlog = 25000 net.ipv4.tcp_max_syn_backlog = 65535
执行
sysctl -p生效。 - 在
events块中强制启用高效模型:use epoll; multi_accept on; accept_mutex on;
按业务类型设合理值,避免盲目堆高
数值不是越大越好。每个连接占几 KB 内存,过高会加剧内存压力与上下文切换开销。
- 静态资源或短连接 API(如 H5 秒杀页):
4096–16384,配合keepalive_timeout 15–30s - WebSocket、HTTP/2 或直播流长连接:
2048–8192,重点控制空闲时长(如client_body_timeout) - HTTPS 反向代理:需额外 fd 支持 SSL session cache、OCSP stapling,建议
worker_connections不超过单进程ulimit的 80%
不复杂但容易忽略


















