nginx高并发能力源于多进程架构与epoll模型的深度协同:master进程负责配置管理与worker生命周期,worker进程以单线程事件循环+epoll高效处理i/o,通过accept_mutex避免惊群并实现负载均衡,辅以内核与nginx参数调优释放性能。

Nginx 的高并发能力,本质上来自多进程架构与 epoll 模型的深度协同——不是简单叠加,而是职责分明、各司其职的系统级配合。
Master-Worker 分工:管理与执行彻底解耦
启动后,Nginx 生成一个 root 权限的 Master 进程和多个 nobody 权限的 Worker 进程。Master 不处理任何请求,只做四件事:读配置、管 Worker 生命周期、收信号(如 reload/quit)、做热升级。所有网络 I/O 和业务逻辑,全部交给 Worker 承担。
- Worker 进程彼此独立,崩溃互不影响;
- 默认数量建议设为 CPU 核心数(
worker_processes auto;),避免上下文切换浪费; - 每个 Worker 是单线程 + 事件循环,靠 epoll 驱动,不依赖多线程锁机制。
epoll 在每个 Worker 内部高效运转
Linux 2.6+ 下,Nginx 编译时自动包含 epoll 支持,运行时默认启用,无需手动写 use epoll。每个 Worker 启动时调用 epoll_create() 创建专属句柄,然后将监听 socket 和后续 accept 到的客户端 fd 注册进去。
- 使用边缘触发(ET)模式:仅在 fd 状态变化时通知一次,要求非阻塞 socket + 循环读写直到 EAGAIN;
- 通过
epoll_wait()批量获取就绪事件,再由ngx_epoll_process_events()分发处理; - 避免 select/poll:它们需每次遍历全部 fd,而 epoll 只返回活跃 fd,时间复杂度从 O(n) 降至 O(1)(就绪数)。
连接分发机制:解决“惊群”并实现负载均衡
多个 Worker 共享同一个监听 socket,但不能同时 accept 同一连接。Nginx 用 accept_mutex(默认开启)加锁控制:只有抢到锁的 Worker 才能调用 accept()。高负载时可设 accept_mutex off,配合 multi_accept on 让单次 epoll_wait 尽可能多地建立连接,减少唤醒次数。
- 新连接到来时,内核唤醒所有等待的 Worker,但仅一个能成功 accept,其余返回 EAGAIN;
- Worker 可根据自身当前连接数或负载情况,选择暂不 accept 新连接,实现被动负载均衡;
- Master 不参与连接处理,只确保 Worker 崩溃后及时拉起新进程,服务不中断。
性能释放的关键协同点
epoll 再高效,也受限于系统资源。必须同步调优内核与 Nginx 参数,才能让多进程 + epoll 发挥最大效能:
- 内核:
net.core.somaxconn(增大 listen 队列)、fs.file-max(提升文件描述符上限)、net.core.netdev_max_backlog(应对突发包); - Nginx:
worker_rlimit_nofile与events { worker_connections 10240; }配合,确保单 Worker 能用足资源; - 启用
sendfile on和keepalive_timeout,减少用户态拷贝与 TCP 握手开销。











