需在操作系统级、Nginx进程级、Nginx配置级三层协同设置:修改/etc/security/limits.conf设软硬nofile为65535;nginx.conf全局块加worker_rlimit_nofile 65535;events块中设worker_connections 65535。

要让 Nginx 工作进程能打开足够多的文件(比如处理大量并发连接),必须在三个层级上协同设置:操作系统级、Nginx 进程级、Nginx 配置级。只改其中一项,往往不起作用,甚至会报 Too many open files 错误。
操作系统级:限制所有用户进程可打开的文件数
这是最底层的前提。Nginx 的 worker 进程也受此限制约束。
- 编辑
/etc/security/limits.conf,添加两行(需 root 权限):
* soft nofile 65535
* hard nofile 65535
其中 * 表示对所有用户生效;soft 是当前会话可立即调整的上限,hard 是不可突破的硬限制。
- 保存后,需重新登录或执行
ulimit -n 65535使当前 shell 生效 - 用
ulimit -a | grep "open files"确认是否已变成65535
Nginx 进程级:为 worker 进程单独提升文件句柄上限
即使系统允许开 65535 个文件,Nginx 自身默认仍按较低值启动。需在 Nginx 主配置文件(如 nginx.conf)的全局块(main context)中显式声明:
worker_rlimit_nofile 65535;
这行必须放在 events 块之外、最外层,它告诉 Nginx 主进程:每个 worker 启动时,主动向内核申请最多可打开 65535 个文件描述符。
- 若不设此项,worker 进程只能继承启动它的 shell 的
ulimit值(常为 1024) - 该值应 ≥
worker_connections × worker_processes,否则瓶颈就在这一层
Nginx 配置级:设定每个 worker 能处理的并发连接数
在 events 块中配置实际可用的连接能力:
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
worker_connections 表示单个 worker 进程最多能同时处理多少个客户端连接(含 keepalive 空闲连接)。每建立一个连接,通常会占用至少 1 个文件描述符(socket + 日志/静态文件等)。
- 实际最大总连接数 ≈
worker_processes × worker_connections - 若你设了
worker_processes 4和worker_connections 65535,那理论总连接数是 262140,此时worker_rlimit_nofile至少得设为 65535(不是 262140),因为它是“每个 worker”的上限,不是全局总和
验证是否生效
配置完成后重载 Nginx:nginx -s reload
- 查 worker 进程 PID:
ps aux | grep 'nginx: worker' - 查看该进程的文件限制:
cat /proc/{PID}/limits | grep "Max open files" - 输出应类似:
Max open files 65535 65535 files(软硬限制一致)











