必须显式配置 LimitNOFILE 和 worker_rlimit_nofile 才能支撑高并发:先查 systemctl show nginx | grep LimitNOFILE 和 /proc/$(pgrep nginx)/limits,再通过 /etc/systemd/system/nginx.service.d/limits.conf 设置 LimitNOFILE=65536,同步在 nginx.conf 主上下文添加 worker_rlimit_nofile 65536;若限流模块报错,还需加 LimitLOCKS=65536。

要让 systemd 托管的 Nginx 服务稳定支撑高并发,必须显式配置 LimitNOFILE,否则默认 1024 的文件描述符上限极易导致连接拒绝、日志写入失败或限流模块异常。
确认当前限制是否已成瓶颈
先查真实生效值,避免盲目调大:
- 查看 systemd 当前设置:
systemctl show nginx | grep LimitNOFILE - 查运行中 worker 进程的实际限制:
cat /proc/$(pgrep nginx | head -n1)/limits | grep "Max open files"(注意 soft/hard 是否一致且足够) - 检查系统总上限:
cat /proc/sys/fs/file-max,确保它 ≥ 你计划设的值(建议预留 10% 给其他进程)
用覆盖方式安全修改服务限制
不直接改 /usr/lib/systemd/system/nginx.service,防止被包管理器覆盖:
- 创建覆盖目录:
sudo mkdir -p /etc/systemd/system/nginx.service.d - 新建配置文件:
sudo nano /etc/systemd/system/nginx.service.d/limits.conf - 写入(例如设为 65536):
[Service]<br>LimitNOFILE=65536
- 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart nginx
同步配置 Nginx 自身的 worker 限制
只改 systemd 不起作用——Nginx worker 进程仍按默认软限启动:
- 编辑
/etc/nginx/nginx.conf,在最外层(events块之前、http块之外)添加:worker_rlimit_nofile 65536; - 验证配置语法:
sudo nginx -t - 重载生效:
sudo systemctl reload nginx
额外注意事项
某些场景还需补充调整:
- 若使用
limit_req或limit_conn模块频繁报 “Too many open files”,可能是文件锁(locks)耗尽,需加LimitLOCKS=65536到同一覆盖文件中 - 值不能超过
/proc/sys/fs/nr_open,否则启动会失败 - SELinux 或 AppArmor 可能拦截资源提升,验证时留意
ausearch -m avc -ts recent


















