在 systemd 中为 nginx 设置 limitnofile=65535 并配合 nginx.conf 中 worker_rlimit_nofile 65535 和合理配置 worker_connections,才能真正提升文件描述符限制;需 daemon-reload 后 restart 生效,并确保 fs.file-max 足够大。

直接在 systemd 服务配置中设置 LimitNOFILE 是让 Nginx 真正用上高文件描述符的关键一步——因为 Nginx 由 systemd 启动时,/etc/security/limits.conf 完全不生效。
修改 nginx.service 的 LimitNOFILE
推荐使用 drop-in 方式(不直接改原始 unit 文件),操作清晰、易维护:
- 执行
sudo systemctl edit nginx,系统会自动创建并打开覆盖配置文件 - 在编辑器中输入以下内容:
[Service]
LimitNOFILE=65535 - 保存退出后,运行
sudo systemctl daemon-reload重载配置 - 再执行
sudo systemctl restart nginx重启服务(reload 不重载 limits)
验证是否生效
别只信配置写了,要看进程实际绑定的值:
- 查 Nginx 主进程 PID:
cat /var/run/nginx.pid或pgrep nginx - 查看其真实限制:
cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files" - 期望输出类似:
Max open files 65535 65535 files
表示软硬限制均已成功设为 65535
配套必须做的 Nginx 配置
systemd 设置只是“给口子”,Nginx 自身也得“伸手去要”:
- 编辑 /etc/nginx/nginx.conf,在 全局块(main context) 添加:
worker_rlimit_nofile 65535; - 确保 events 块中
worker_connections不超过该值的一半(例如设为 4096 或 8192),留足空间给日志、上游连接等其他句柄
注意几个常见坑
这些细节常导致配置看似正确却无效:
- 没运行
daemon-reload,改了配置也不加载 - 只
systemctl reload nginx(平滑重载),但 limits 必须restart才生效 - LimitNOFILE 设得比内核
fs.file-max还大,会被截断(建议fs.file-max ≥ 2×单个服务需求) - 用了非 root 用户运行 Nginx(如 www-data),但未在 limits.conf 中单独配该用户,systemd 又没覆盖,就会 fallback 到默认 1024











