调高worker_connections需同步放开系统文件描述符限制、配置worker_rlimit_nofile、优化events参数及内核网络队列,否则仅修改该值无效,易触发“too many open files”错误。

调高 worker_connections 本身很简单,但单独改这个值几乎没用——它只是个“上限标尺”,真正能撑住多少连接,取决于系统资源是否同步放开。常见报错如 accept() failed (24: Too many open files) 或日志里反复出现 worker_connections are not enough,说明你已经卡在某一层限制上了。
先改 nginx.conf 里的 worker_connections
这个参数必须写在 events 块内,不能放在 http、server 或其他位置:
- 打开
/etc/nginx/nginx.conf,找到或新建events { ... }块 - 设一个合理值,比如:
worker_connections 8192;(中等流量可从 4096 起步,API 或短连接密集型服务可到 16384~65535) - 保存后运行
nginx -t检查语法,再执行nginx -s reload生效
必须同步提升系统文件描述符限制
Nginx 每个连接至少占 1 个文件描述符(fd),而 Linux 默认单进程最多打开 1024 个 fd。如果你设了 worker_connections 8192,但系统不给,Nginx 启动时会自动截断,甚至报错无法打开日志文件。
- 临时生效(仅当前会话):
ulimit -n 65536 - 永久生效:编辑
/etc/security/limits.conf,追加两行(把nginx替换为实际运行用户,如www-data):nginx soft nofile 65536nginx hard nofile 65536 - 若用 systemd 管理,还需在
/etc/systemd/system/nginx.service.d/override.conf中添加:[Service]LimitNOFILE=65536
然后执行systemctl daemon-reload && systemctl restart nginx
补上 Nginx 进程级声明和内核队列
只调系统 ulimit 和配置项还不够,Nginx 自身也得“主动申请”足够句柄,并让内核别在入口就丢连接:
- 在
nginx.conf的主上下文(events块外、http块前)添加:worker_rlimit_nofile 65536;
该值应 ≥worker_connections × worker_processes,建议略高 10%~20% - 修改
/etc/sysctl.conf,增强网络队列能力:net.core.somaxconn = 65535net.core.netdev_max_backlog = 25000fs.file-max = 2000000
执行sysctl -p生效
配套 events 块优化不能少
否则即使参数调高,连接来了也接不快、抢不过、复用不了:
- 确保
events块中包含:use epoll;(Linux 必须显式写,避免回退到 select/poll)multi_accept on;(一次事件循环多收几个连接,缓解突发压力)accept_mutex off;(高并发多 worker 场景下减少锁争抢,搭配reuseport效果更好) - 如果用长连接(如 WebSocket、HTTP/2),适当调低
keepalive_timeout(例如 15–30 秒),避免空闲连接长期占满槽位











