Nginx 文件句柄优化需系统级(/etc/security/limits.conf)、进程级(nginx.conf 中 worker_rlimit_nofile)和 systemd 服务级(override.conf 中 LimitNOFILE)三层配置协同生效,缺一不可,并须通过 /proc/PID/limits 验证实际值。

文件句柄(file descriptor)是 Linux 系统中每个打开文件、socket、管道等资源的唯一标识。Nginx 在高并发场景下,每个连接、每个静态文件读取、每个 upstream 连接都会消耗一个文件句柄。默认限制(通常是 1024)极易触发 Too many open files 错误,导致请求被拒绝或服务卡顿。优化必须分层设置,缺一不可。
系统级全局限制(/etc/security/limits.conf)
这是所有用户和进程的基础上限,需重启会话或 reboot 生效:
- 编辑
/etc/security/limits.conf,添加以下两行(适用于所有用户):
* soft nofile 65535<br>* hard nofile 65535
若只针对 nginx 启动用户(如 www 或 nginx),可写成:
www soft nofile 65535<br>www hard nofile 65535
注意:该配置对 systemd 启动的服务可能不生效,需配合 systemd 单元文件设置(见下文)。
Nginx 进程级限制(nginx.conf)
在 nginx.conf 的 main 块(即最外层,不在 http 或 server 内)添加:
worker_rlimit_nofile 65535;
这告诉 Nginx worker 进程最多可打开 65535 个文件句柄。必须配合系统级设置才有效,否则会被内核或 limits 限制截断。
同时建议检查并显式设置 worker_connections(每个 worker 能处理的最大连接数):
events {<br> use epoll; # Linux 推荐<br> worker_connections 65535;<br>}注意:worker_connections × worker_processes 不应超过 worker_rlimit_nofile 和系统 nofile 限制中的最小值。
systemd 服务级覆盖(/etc/systemd/system/nginx.service.d/override.conf)
现代 Linux 发行版(CentOS 7+/Ubuntu 16.04+)使用 systemd,limits.conf 对服务无效。需创建覆盖配置:
- 新建目录:
sudo mkdir -p /etc/systemd/system/nginx.service.d - 新建文件:
sudo vim /etc/systemd/system/nginx.service.d/override.conf
内容如下:
[Service]<br>LimitNOFILE=65535
然后重载并重启:
sudo systemctl daemon-reload<br>sudo systemctl restart nginx
验证是否生效
不要只信配置文件,务必验证运行时实际值:
-
查 master 进程限制:
cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files" -
查任一 worker 进程(如 PID 12345):
cat /proc/12345/limits | grep "Max open files" -
查当前已打开句柄总数:
lsof -p $(cat /var/run/nginx.pid) | wc -l -
查系统总上限:
sysctl fs.file-max
若输出中 “Max open files” 显示为 65535,说明三层配置均已成功落地。


















