nginx 高并发需永久提升文件描述符限制:先确认运行用户及当前 limits,再根据启动方式分别配置 /etc/security/limits.conf(传统方式)或 systemd service 的 limitnofile(systemd 方式),并同步调整 nginx.conf 中 worker_connections。

Nginx 本身不直接调用 ulimit,它依赖系统为 worker 进程分配的文件描述符限制。要让 Nginx 能打开足够多的连接(比如高并发场景),必须**永久提升其运行时可用的文件描述符数量**,关键在于修改 Nginx 进程启动时继承的 limits,而不是在命令行临时执行 ulimit。
确认当前限制和 Nginx 运行用户
先查清楚 Nginx 是以哪个用户身份运行的(通常为 www-data 或 nginx):
ps -eo user,comm | grep nginx
再查看该用户当前 soft/hard limit(以 nginx 用户为例):
sudo -u nginx sh -c 'ulimit -Sn; ulimit -Hn'
永久修改用户级 limits(推荐方式)
Linux 系统通过 /etc/security/limits.conf 或 /etc/security/limits.d/*.conf 文件设置用户登录会话的默认 limits。Nginx 若由 systemd 启动,还需额外配置服务单元文件(见下文),但 limits.conf 对大多数传统启动方式(如 SysV init 或手动启动)生效。
编辑 limits 配置文件:
sudo nano /etc/security/limits.conf
在末尾添加(假设 Nginx 运行用户是 nginx):
nginx soft nofile 65536 nginx hard nofile 65536
⚠️ 注意:
- 必须使用实际运行 Nginx 的用户名(不是 root);
- 修改后需**重新登录或重启该用户的 shell 会话**才生效(对已运行的进程无效);
- 某些发行版(如较新 Ubuntu/CentOS)默认启用 systemd,而 limits.conf 对 systemd 服务可能不生效 —— 此时需配合下一步。
针对 systemd 启动的 Nginx 配置 service 文件
如果 Nginx 由 systemd 管理(绝大多数现代系统默认如此),必须在 service 单元中显式设置 limits,因为 systemd 忽略 limits.conf。
执行以下命令编辑 Nginx 服务配置:
sudo systemctl edit nginx
在打开的编辑器中输入:
[Service] LimitNOFILE=65536
保存退出后重载并重启服务:
sudo systemctl daemon-reload sudo systemctl restart nginx
验证是否生效:
sudo cat /proc/$(pgrep nginx)/limits | grep "Max open files"
检查 Nginx 配置并启用高并发支持
仅改系统限制还不够,还需确保 Nginx 自身配置允许使用这些资源:
- 在
nginx.conf的events块中设置worker_connections,例如:events { worker_connections 65536; } - 确认
worker_processes合理(通常设为auto) - 总连接数上限 =
worker_processes × worker_connections,不能超过系统nofile限制 - 可选:在
http块中添加reset_timedout_connection on;减少 TIME_WAIT 占用
不复杂但容易忽略 —— 关键是区分启动方式(systemd 还是传统 init),再对应修改 limits 来源,并验证进程实际值。











