本章节介绍 Nginx 的连接处理方法。
Nginx 支持多种连接处理方法:
| 方法 | 适用平台 | 特点 |
|---|---|---|
epoll | Linux 2.6+ | 高性能,支持数百万并发连接,推荐使用 |
kqueue | FreeBSD, macOS | 高效的事件通知机制 |
eventport | Solaris 10 | Solaris 平台的事件端口 |
/dev/poll | Unix | 基于 Unix 的设备轮询 |
select | 通用 | 跨平台,但有连接数限制(通常 1024) |
poll | 通用 | 改进的 select,无连接数限制,但性能较差 |
连接处理原理: Nginx 使用事件驱动模型处理连接,每个 Worker 进程监听多个文件描述符,当文件描述符有事件发生时,操作系统会通知 Nginx,Nginx 会处理相应的事件。这种模型避免了阻塞等待,提高了并发处理能力。
events {
worker_connections 1024;
}
配置说明:
worker_connections:每个 Worker 进程允许同时打开的最大连接数ulimit -n)worker_connections 原理:
每个 Worker 进程都有一个连接池,连接池的大小由 worker_connections 指定。当连接数超过 worker_connections 时,新的连接会被拒绝。
最大连接数 = worker_processes × worker_connections
worker_processes 4;
events {
worker_connections 1024;
}
最大连接数 = 4 × 1024 = 4096
最大连接数原理:
Nginx 的最大连接数由 worker_processes 和 worker_connections 共同决定。每个 Worker 进程可以处理 worker_connections 个连接,因此 Nginx 的最大连接数为 worker_processes × worker_connections。
Nginx 的连接数受限于系统资源:
# 查看文件描述符限制
ulimit -n
# 临时调整文件描述符限制
ulimit -n 65535
# 永久调整文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
文件描述符限制原理:
每个连接都需要一个文件描述符,因此连接数受限于系统文件描述符限制。可以使用 ulimit -n 命令查看和调整系统文件描述符限制。
epoll,在 FreeBSD 上使用 kqueueulimit -n 命令查看和调整系统文件描述符限制,确保其大于 worker_connections 的值worker_processes 指令设置 worker 进程数,通常设置为 CPU 核心数,以充分利用多核 CPU 性能worker_processes auto; # 自动设置为 CPU 核心数
events {
use epoll;
worker_connections 65535; # 根据系统资源调整
}