解决“too many open files”需系统、用户、nginx、日志采集器四层协同:先调高内核fs.file-max,再配limits.conf或systemd limitnofile限定nginx用户nofile值,接着在nginx.conf设worker_rlimit_nofile与worker_connections,并为filebeat/fluentd单独分配fd限额,最后逐进程验证/proc/pid/limits。

要解决日志采集器(如 Filebeat、Fluentd)与 Nginx 网关在高并发下争抢文件描述符导致的 Too many open files 问题,关键不是单独调大某一方,而是让两者共存于同一系统资源框架下——worker_rlimit_nofile 是 Nginx 的“句柄配额声明”,但它必须和系统对 Nginx 用户的硬限制、以及日志采集器自身的句柄占用一并统筹。
明确 Nginx 的句柄需求底线
Nginx 实际消耗的文件描述符远不止连接数:每个 client 连接、每个缓存文件、每个 upstream socket、每条访问日志写入(尤其开启 buffer 后仍会暂存)、SSL 会话缓存都会占一个 fd。日志采集器持续轮询日志文件、建立 HTTP 上报连接,也会稳定占用几十到上百个 fd。
- 假设网关峰值并发 8000,平均每个请求涉及 2~3 个静态资源(含缓存小文件),则仅文件读取就需约 1.6 万~2.4 万个 fd
- 再加 2000 个 upstream 连接、1000 个日志写入缓冲、500 个 SSL session → 总需求轻松突破 3 万
- 建议 worker_rlimit_nofile 至少设为 65536,保守场景可设为 131072
同步打通系统级限制链路(避免静默失效)
只改 Nginx 配置不生效是常见失败原因。Nginx worker 进程启动时继承的是其运行用户的系统级限制,若该限制没放开,worker_rlimit_nofile 就会被截断或直接报错退出。
- 确认 Nginx 运行用户(如
nginx或www-data):ps -eo pid,comm,user | grep nginx | head -1 - 检查该用户当前硬限制:
sudo -u nginx bash -c 'ulimit -Hn'—— 若低于 65536,必须调整 - 若用 systemd(绝大多数现代发行版):在
/etc/systemd/system/nginx.service.d/override.conf中添加
[Service]
LimitNOFILE=65536
然后执行systemctl daemon-reload && systemctl restart nginx - 若用 limits.conf:添加两行(用户名务必匹配)
nginx soft nofile 65536
nginx hard nofile 65536
并确保/etc/pam.d/common-session包含session required pam_limits.so
把日志采集器也纳入句柄规划
日志采集器不是旁观者,而是同级资源竞争者。它常以同一用户(如 nginx)或独立用户(如 beats)运行,若未限制,可能吃掉大量 fd,挤压 Nginx 可用空间。
- Filebeat 默认无 fd 限制,可在其 service 文件中加
LimitNOFILE=16384(systemd)或配置max_open_files: 8192(Filebeat 7.10+) - Fluentd 建议通过
ulimit -n 8192启动,或在 systemd unit 中设置LimitNOFILE=8192 - 避免采集器监控整个
/var/log/nginx/*.log—— 改为按天滚动 + 轮询间隔拉长,减少 inotify 句柄占用
验证是否真正协同生效
重启后不能只看 Nginx 是否启动成功,要确认两个进程各自拿到的 fd 配额是否符合预期,且不互相挤占。
- 查一个 Nginx worker PID:
pgrep -f "nginx: worker" | head -1 - 查看其实际限制:
cat /proc/<pid>/limits | grep "Max open files"</pid>→ Soft Limit 应等于你设的worker_rlimit_nofile值 - 同样方法查 Filebeat 或 Fluentd 进程的
Max open files,确认未超过为其分配的上限 - 观察 error.log 是否仍有
open() failed (24: Too many open files)或setrlimit(RLIMIT_NOFILE) failed类警告










