连接处理

本章节介绍 Nginx 的连接处理方法。

连接处理方法

Nginx 支持多种连接处理方法:

方法适用平台特点
epollLinux 2.6+高性能,支持数百万并发连接,推荐使用
kqueueFreeBSD, macOS高效的事件通知机制
eventportSolaris 10Solaris 平台的事件端口
/dev/pollUnix基于 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_processesworker_connections 共同决定。每个 Worker 进程可以处理 worker_connections 个连接,因此 Nginx 的最大连接数为 worker_processes × worker_connections

连接数限制

Nginx 的连接数受限于系统资源:

  1. 文件描述符限制:每个连接都需要一个文件描述符,因此连接数受限于系统文件描述符限制
  2. 内存限制:每个连接都需要占用内存,因此连接数受限于系统内存
  3. CPU 限制:每个连接都需要 CPU 处理,因此连接数受限于 CPU 性能

调整文件描述符限制

# 查看文件描述符限制
ulimit -n

# 临时调整文件描述符限制
ulimit -n 65535

# 永久调整文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

文件描述符限制原理: 每个连接都需要一个文件描述符,因此连接数受限于系统文件描述符限制。可以使用 ulimit -n 命令查看和调整系统文件描述符限制。

最佳实践

  1. 使用最高效的事件模型:在 Linux 上使用 epoll,在 FreeBSD 上使用 kqueue
  2. 合理设置 worker_connections:根据系统资源和预期并发量设置,通常设置为 1024-65535 之间
  3. 调整系统文件描述符限制:使用 ulimit -n 命令查看和调整系统文件描述符限制,确保其大于 worker_connections 的值
  4. 启用多 worker 进程:使用 worker_processes 指令设置 worker 进程数,通常设置为 CPU 核心数,以充分利用多核 CPU 性能
  5. 监控连接数:定期监控连接数,及时发现异常
worker_processes auto;  # 自动设置为 CPU 核心数

events {
    use epoll;
    worker_connections 65535;  # 根据系统资源调整
}