nginx报错accept() failed (24: too many open files)本质是文件描述符(fd)耗尽,需同步调优系统fs.file-max、用户limits.conf、systemd limitnofile及nginx.conf中worker_rlimit_nofile与worker_connections四层限制。

看到 Nginx 拒绝新连接,且错误日志里反复出现 accept() failed (24: Too many open files),基本可以断定是文件描述符(fd)耗尽了。这不是配置写错了,而是资源被用光了——得快速分层定位,哪一层卡住了。
立刻查错误日志和系统提示
先确认是不是 fd 问题,别绕弯:
- 执行
tail -n 30 /var/log/nginx/error.log,找accept() failed (24: Too many open files)——有就是 fd 耗尽的直接证据 - 运行
dmesg | grep -i "file.*max\|descriptor",如果输出类似VFS: file-max limit reached,说明系统级 fd 总量已满 - 执行
cat /proc/sys/fs/file-nr,看第一列(已分配 fd 数)是否接近第三列(file-max值);差值小于 10% 就危险
快速判断是进程级还是系统级瓶颈
同一时间点观察多个线索:
- 如果只有部分 worker 进程(比如 PID 1234、5678)报错,其他正常 → 很可能是该 worker 存在 fd 泄漏(如长连接未释放、模块异常)
- 如果所有 worker 几乎同步报错,且
dmesg有 file-max 告警 → 是系统全局 fd 不够,优先调高fs.file-max - 如果
systemctl status nginx显示 “killed” 或 “OOM killed process”,要立即查dmesg | grep nginx,排除内存不足误判为 fd 问题
马上验证 Nginx 当前 fd 使用量
不靠猜测,看真实数字:
- 查主进程 PID:
ps -eo pid,comm | grep nginx | grep master - 统计它当前打开的 fd 数:
ls -1 /proc/<pid>/fd/ 2>/dev/null | wc -l</pid> - 对比上限:
cat /proc/<pid>/limits | grep "Max open files"</pid>,若使用量 > 上限的 80%,就是瓶颈所在 - 顺手看看有没有异常多的 socket:
lsof -p <pid> | grep sock | wc -l</pid>,远高于并发连接数就可疑
临时缓解+同步调优四层限制
一边恢复服务,一边打通限制链路:
- 临时提系统上限(重启失效):
sysctl -w fs.file-max=1000000 - 临时提用户限制(当前会话有效):
ulimit -n 65535,再手动启动 Nginx 测试 - 改 systemd 服务限制(推荐):新建
/etc/systemd/system/nginx.service.d/override.conf,加LimitNOFILE=65536,然后systemctl daemon-reload && systemctl restart nginx - 确保 Nginx 配置匹配:检查
nginx.conf全局块是否有worker_rlimit_nofile 65536;,并确认worker_connections不超过该值的 80%











