启用 epoll 模型、合理设置 worker_connections 并匹配系统文件描述符限制、开启 multi_accept 且关闭 accept_mutex,可显著提升 nginx 并发能力。

直接在 nginx.conf 的 events 块里配置关键参数,就能显著提升并发能力。核心不是堆参数,而是让 Nginx 与 Linux 内核高效协同——特别是用对事件模型、管住文件描述符、减少连接分发抖动。
必须显式启用 epoll 模型
Linux 下别依赖自动检测,一定要写 use epoll;。Nginx 在某些编译环境或旧版本中可能回退到低效的 select 或 poll,它们有连接数上限且性能随并发增长断崖下跌。epoll 是内核原生支持(2.6+),时间复杂度 O(1),万级连接下依然稳定。
- 配置位置:在
events { ... }块内第一行写明 - 验证方式:启动后查 error 日志,若出现
using the "epoll" event method即生效 - Docker 场景:确认基础镜像内核 ≥ 2.6(主流 alpine/debian 镜像均满足)
worker_connections 要匹配系统限制
这个值不是越大越好,它受操作系统单进程最大文件描述符(fd)数量硬约束。设高了,Nginx 启动时不会报错,但运行中会频繁出现 accept() failed (24: Too many open files)。
- 先查当前限制:
ulimit -n(用户级)和sysctl fs.file-max(系统级) - 永久调高:在
/etc/security/limits.conf中为 nginx 用户加两行:nginx soft nofile 65536nginx hard nofile 65536 - 再在
nginx.conf全局块(events外)加:worker_rlimit_nofile 65536;,确保 worker 进程真正继承该限制 - 典型设置:4 核服务器配
worker_processes auto;+worker_connections 16384;,理论并发约 6.5 万(反向代理场景建议除以 2 留足 upstream 连接余量)
开启 multi_accept 并合理控制 accept_mutex
这两个指令配合使用,能大幅降低新连接到达时的唤醒开销和锁竞争。
-
multi_accept on;:让每个 worker 一次尽可能 accept 多个就绪连接,减少事件循环空转,适合 API 网关等短连接场景 -
accept_mutex off;:Nginx 1.11.3+ 默认关闭,所有 worker 可同时等待 accept(),消除“惊群”;旧版本需手动关闭,并可加accept_mutex_delay 200ms;缓冲争抢 - 注意:如果后端响应极慢、连接长期堆积,开启
multi_accept可能导致负载不均,此时建议搭配worker_cpu_affinity auto;绑定 CPU 核心
进阶微调:connection_pool_size(按需)
默认 256KB 的连接内存池,在超大并发(>5 万)且连接生命周期极短时,频繁分配释放会造成内存压力。
- 仅当观察到
malloc分配延迟升高或内存碎片明显时才调整 - 可适当降低(如
connection_pool_size 64k;),但不宜过小,否则影响 TLS 握手等操作 - 该参数不影响功能,纯属性能微调,多数业务无需改动











