Nginx错误日志停止写入且出现“Too many open files”报错,通常是系统文件描述符耗尽所致;需通过/proc/PID/fd/和limits确认FD使用量,检查worker_connections、keepalive、日志配置等隐式消耗项,并调整limits与优化配置。

当 Nginx 错误日志突然停止写入,同时系统出现大量 accept() failed (24: Too many open files) 或类似 open() failed (24: Too many open files) 的报错,很可能是文件描述符(file descriptor, fd)耗尽所致。这不是 Nginx 自身逻辑错误,而是操作系统层面资源限制触发的连锁反应——连日志文件都打不开,自然无法记录错误。
确认是否真的 FD 耗尽
别急着改配置,先验证问题根源:
- 查 Nginx 主进程 PID:
ps aux | grep nginx | grep master,拿到主进程 PID(如1234) - 看该进程当前打开的 fd 数量:
ls -l /proc/1234/fd/ | wc -l(注意:子进程如 worker 也可能单独占 fd,可一并检查/proc/$(pgrep -f "nginx: worker")/fd/) - 查系统级限制:
cat /proc/1234/limits | grep "Max open files",重点关注Soft Limit和Hard Limit - 对比当前使用量和软限制值,若接近或已达上限,基本可确认是 fd 耗尽
检查 Nginx 配置中隐式消耗 fd 的设置
有些配置项看似无关,实则会显著增加 fd 占用:
- worker_connections 过高 + 大量 keepalive 连接:每个活跃连接至少占用 1 个 fd(客户端 socket),加上 upstream、日志文件、临时文件等,总量极易突破限制
- access_log 和 error_log 使用非默认路径但未配 buffer:频繁写日志会打开/关闭文件句柄;若日志路径在 NFS 或慢盘上,fd 可能因写阻塞而长期滞留
- upstream 中配置了过多 server,且启用了 keepalive:每个 upstream keepalive 连接池都会为每个 backend 维护一组空闲连接,每个连接占 1 个 fd
- 使用了 limit_conn 或 limit_req 模块并配了 large zone:zone 存储在共享内存,不直接占 fd,但若 zone 文件异常或初始化失败,可能引发底层 fd 分配异常(较少见,但需排除)
快速缓解与长期修复方法
先止血,再根治:
-
临时提升 soft limit:修改
/etc/security/limits.conf,加入nginx soft nofile 65536和nginx hard nofile 65536(假设运行用户为 nginx),然后重启 systemd 服务或重新登录用户生效 -
在 systemd service 文件中显式设置:编辑
/etc/systemd/system/nginx.service.d/override.conf,添加:[Service]<br> LimitNOFILE=65536
然后执行systemctl daemon-reload && systemctl restart nginx -
优化 Nginx 配置降低 fd 压力:
- 调低
worker_connections至合理值(如 4096~8192),结合worker_rlimit_nofile设为略高于该值(如 10000) - 启用
access_log ... buffer=64k flush=5s减少日志写频次 - 对 upstream,控制
keepalive数量(如keepalive 32),并确保proxy_http_version 1.1和proxy_set_header Connection ''正确设置
- 调低
监控与预防建议
避免下次再“突然失声”:
- 用
ss -s或netstat -an | awk '$1 ~ /^(tcp|udp)/ {a[$6]++} END{for(i in a) print i, a[i]}'观察连接状态分布,确认是否存在大量TIME_WAIT或未释放连接 - 定期采集
/proc/PID/fd/数量,接入 Prometheus + node_exporter(通过process_open_fds指标)做趋势告警 - 在 error_log 开头加一句测试写入:
echo "test $(date)" >> /var/log/nginx/error.log,确认磁盘、权限、SELinux(如启用)均无阻碍 - 上线新配置前,用
ab或wrk模拟连接压力,观察 fd 增长是否符合预期











