二进制安装的 nginx 文件描述符限制需从启动环境(ulimit/limits.conf)和 nginx 配置(worker_rlimit_nofile)两方面设置,并可选调高内核 fs.file-max;否则 worker 进程默认受限于 1024。

二进制安装的 Nginx 没走包管理器或 systemd,所以不能靠 systemctl edit nginx 或修改 /usr/lib/systemd/system/nginx.service。它通常由脚本或手动启停,文件描述符限制必须从**启动环境**和**Nginx 自身配置**两头抓,否则 worker 进程仍卡在默认 1024。
确认当前限制在哪卡住
先查真实瓶颈:用 ps -ef | grep nginx 找到主进程 PID,再执行:
如果显示 1024 1024,说明进程没拿到足够 fd;若显示 65535 65535 但仍有 Too many open files 错误,则是 worker_connections 超过了实际可用值,需回溯检查。
改启动脚本的 ulimit 环境
二进制部署常用 /etc/init.d/nginx 或自定义启动脚本(如 /opt/nginx/sbin/start.sh)。打开该脚本,在 start 函数开头、nginx 命令执行前插入:
ulimit -n 65535-
ulimit -Hn 65535(显式设硬限制)
注意:必须放在 su -c "nginx ..." 或 daemon 调用之前;如果脚本用 sudo -u nginx 启动,需确保目标用户(如 nginx)在 /etc/security/limits.conf 中也有对应设置:
nginx hard nofile 65535
改完重启服务,重新登录终端或新开 shell 再验证 ulimit -n 是否生效。
配 nginx.conf 的 worker_rlimit_nofile
编辑 nginx.conf,在 http 块外、全局层级添加:
这个值不能高于你通过 ulimit 或 limits.conf 给进程申请到的上限,也不能低于 worker_connections。例如设了 worker_connections 8192,那 worker_rlimit_nofile 至少为 8192,建议留余量设为 65535。
保存后运行 nginx -t 检查语法,再 nginx -s reload 生效。
补 kernel 级兜底(可选但推荐)
系统总文件描述符池太小也会拖后腿。检查当前值:
sysctl -n fs.file-max若低于 262144,临时调高:
sysctl -w fs.file-max=262144永久生效则写入 /etc/sysctl.conf:
执行 sysctl -p 加载。这步不是必须,但避免多实例或高并发时触及全局瓶颈。











