必须同步调高系统级、启动环境级和Nginx自身级三处文件描述符限制:在/etc/security/limits.conf设nginx用户软硬限制为65535,启动脚本前加ulimit命令,并在nginx.conf全局块配置worker_rlimit_nofile 65535且确保worker_connections×worker_processes不超过该值。
遇到高吞吐下 Nginx 报 accept() failed (24: Too many open files) 或 worker_connections are not enough,基本可以锁定是文件描述符(FD)不足——不是配置写少了,而是系统、进程、Nginx 三层限制没对齐,其中任一环卡在 1024 就会崩。
别猜,直接查进程实际拿到的 FD 上限:
pgrep nginx | head -1
cat /proc/<PID>/limits | grep "Max open files"
1024 1024,说明启动环境没给够;若显示 65535 65535 却仍报错,再查 worker_connections × worker_processes 是否超过该值,或后端连接/日志/静态文件把 FD 耗尽了必须同步改这三项,缺一不可:
ulimit -n 看当前会话限制;永久生效就加到 /etc/security/limits.conf,例如:nginx soft nofile 65535
nginx hard nofile 65535
/etc/init.d/nginx),在 nginx 命令前加:ulimit -n 65535
ulimit -Hn 65535
nginx.conf 全局块(http 外)加:worker_rlimit_nofile 65535;
同时确保 events { worker_connections 8192; } 不超过它
改完别急着 reload,先确认是否真正生效:
cat /proc/<PID>/limits,确认数值已变lsof -p <PID> | wc -l 看当前打开的 FD 数,接近上限就要警惕泄漏sysctl -w fs.file-max=262144,并写入 /etc/sysctl.conf 永久生效keepalive_timeout 60; 和 keepalive_requests 100; 放在 http 块里容器里默认只有 1024 FD,且 limits.conf 不生效。必须在 docker run 时加参数:
--ulimit nofile=65535:65535
或在 docker-compose.yml 中写:
ulimits: nofile: { soft: 65535, hard: 65535 }