报错表明nginx worker进程触及文件描述符上限,需同步调高系统级(fs.file-max)、用户级(limits.conf)、进程级(worker_rlimit_nofile)及systemd级(limitnofile)四层限制,并验证生效。

这个报错说明 Nginx worker 进程已达到系统允许打开的文件描述符(file descriptor,简称 fd)上限,内核拒绝为其分配新 socket,不是网络不通,而是本机资源卡死了。
确认当前限制是否真的不足
先别急着改配置,用几条命令快速定位瓶颈在哪一层:
- 查系统总上限:
cat /proc/sys/fs/file-max—— 建议至少设为 100 万(高并发场景) - 查当前 shell 限制:
ulimit -n(软限)、ulimit -Hn(硬限)—— 默认常是 1024,明显不够 - 查正在运行的 Nginx 进程实际生效值:
cat /proc/$(pidof nginx)/limits | grep "Max open files"—— 看输出的 soft 和 hard 是否一致、是否达标 - 查当前使用量:
lsof -p $(pidof nginx) | wc -l—— 对比上面的上限值,差得越小越危险
同步调高三层限制(缺一不可)
Linux 文件描述符有系统级、用户级、进程级三层限制,必须全部对齐,否则 Nginx 只能取其中最小值。
-
系统级:编辑
/etc/sysctl.conf,添加fs.file-max = 1048576,然后执行sysctl -p -
用户级:编辑
/etc/security/limits.conf,按 Nginx 实际运行用户添加两行(如用户是nginx):nginx soft nofile 65536nginx hard nofile 65536 -
进程级(Nginx 自身):在
nginx.conf的 main 块(events 块之前)加入:worker_rlimit_nofile 65536;
注意:不能写在 http/server/location 块里,会报语法错误
systemd 环境下额外补一刀
如果 Nginx 是通过 systemd 启动(绝大多数现代发行版默认如此),limits.conf 的设置可能被忽略。需手动补充:
- 创建覆盖配置目录:
mkdir -p /etc/systemd/system/nginx.service.d - 新建
/etc/systemd/system/nginx.service.d/override.conf,内容为:[Service]LimitNOFILE=65536 - 重载配置:
systemctl daemon-reload
验证与收尾
改完不要直接 reload,按顺序操作:
- 检查语法:
nginx -t - 重载服务:
systemctl reload nginx - 再次查进程限制:
cat /proc/$(pidof nginx)/limits | grep "Max open files"—— 确认 soft/hard 都显示 65536 - 观察 error.log 是否还有该报错,同时留意日志中是否有
worker_connections相关警告 —— 若仍有问题,再检查events { worker_connections 65536; }是否匹配(建议设为worker_rlimit_nofile的 80% 左右)











