systemctl show nginx -p LimitNOFILE
sudo grep -r LimitNOFILE /etc/systemd/system.conf
sudo systemctl edit --full nginx
sudo systemctl daemon-reload && sudo systemctl restart nginx

服务日志里反复出现 Too many open files 报错,进程被 systemd 拉起后几分钟就退出,在终端里把 ulimit -n 调到 65535 再重启服务结果一样,很让人怀疑限制到底有没有生效。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,systemd 启动的服务只认 unit 里写的 LimitNOFILE,登录会话里通过 PAM 配置的 limits.conf 对它完全无效,全局 DefaultLimitNOFILE 还会把它压回默认值,三个地方的说法互相打架,实际排查时容易改错。

围绕「systemd LimitNOFILE」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:先用 systemctl show 查这个服务实际生效的句柄上限值到底是多少;在 unit 文件的 Service 段里补上 LimitNOFILE 这行再执行 daemon-reload 重载 不要只改命令行里的临时值;核对 system.conf 里的 DefaultLimitNOFILE 不低于这个数值 否则单项设置会被全局默认盖掉。

改完只确认一件事:改完再看 systemctl show 的输出确认是 65535 并且日志里不再出现这句报错 跑满一天也没复发。

作者 9823189