要让nginx真正获得65536文件描述符限制,必须同时配置systemd的limitnofile=65536和nginx.conf中worker_rlimit_nofile 65536;仅改ulimit -n或limits.conf无效,还需验证/proc/pid/limits并确保fs.file-max足够。

要让 Nginx 真正拿到高文件描述符限制(比如 65536),不能只在终端里敲 ulimit -n 65536——那只会作用于你当前 shell 启动的临时进程,Nginx 由 systemd 管理,压根不认这个。
先确认当前限制在哪卡着
运行以下命令看真实瓶颈:
-
ulimit -n:查当前 shell 的软限制(常是 1024) -
ulimit -Hn:查硬限制(普通用户无法突破它) -
cat /proc/$(pgrep nginx | head -n1)/limits | grep "Max open files":查正在运行的 Nginx worker 实际拿到的值(这才是关键)
针对 Nginx 进程本身:必须配 systemd 的 LimitNOFILE
从 systemd v219 起,/etc/security/limits.conf 对 systemctl start nginx 启动的服务完全无效。正确做法是:
- 执行
sudo systemctl edit nginx.service - 在打开的编辑器中写入:
LimitNOFILE=65536
- 保存后执行:
sudo systemctl daemon-reload && sudo systemctl restart nginx - 验证:
systemctl show nginx --property LimitNOFILE应输出LimitNOFILE=65536
同时别漏掉 Nginx 自身配置
仅改系统限制还不够,Nginx 主进程需主动告知 worker 使用更大上限:
- 编辑
/etc/nginx/nginx.conf,在main块(即最外层)添加一行:
- 然后重载:
sudo nginx -t && sudo systemctl reload nginx
其他配套项建议一并检查
避免“改了却还是报 Too many open files”:
-
系统总上限 fs.file-max:临时调大用
sudo sysctl -w fs.file-max=2097152;永久生效则往/etc/sysctl.conf加fs.file-max = 2097152,再运行sudo sysctl -p -
PAM limits 配置(影响登录用户启动的非 systemd 进程):确保
/etc/pam.d/common-session包含session required pam_limits.so;再在/etc/security/limits.conf添加如www-data soft nofile 65536和www-data hard nofile 65536(Nginx 常以该用户跑 worker) -
不要依赖 su - 或 sudo -u 切换用户来测试:它们不触发完整 PAM session,
ulimit -n显示的仍是旧值;真正验证得看/proc/PID/limits











