Nginx 在 systemd 下需配置 Restart=on-failure、RestartSec=5、StartLimitIntervalSec=60 和 StartLimitBurst=3 实现崩溃自动重启,并通过 After=network-online.target 和 After=php-fpm.service 等确保依赖就绪后启动。

在 systemd 环境下,让 Nginx 启动失败后自动重启、并延迟启动以等待依赖服务(如网络、DNS 或后端服务)就绪,需通过 systemd 服务单元文件的特定配置实现。关键不在于修改 Nginx 自身,而在于合理设置其 .service 文件中的启动行为与依赖关系。
启用自动拉起(崩溃后重启)
systemd 默认不会在进程退出后自动重启服务。要让 Nginx 异常终止后自动恢复,需在 /etc/systemd/system/nginx.service(或 /usr/lib/systemd/system/nginx.service)中添加以下重启策略:
- Restart=always:无论退出状态码如何都重启(最常用)
- Restart=on-failure:仅当非正常退出(如被 kill、崩溃)时重启
- RestartSec=5:两次重启之间等待 5 秒,避免频繁闪退打满日志
- StartLimitIntervalSec=60 和 StartLimitBurst=3:限制 60 秒内最多重启 3 次,防失控循环
示例片段:
Restart=on-failure RestartSec=5 StartLimitIntervalSec=60 StartLimitBurst=3
配置延时启动(等待依赖就绪)
Nginx 常因网络未就绪(如 DNS 不可用)、上游服务未启动(如 PHP-FPM、Redis)而启动失败。可通过以下方式延迟或条件化启动:
- After=network-online.target:确保网络已完全上线(比 network.target 更可靠)
- Wants=network-online.target:配合 After 使用,声明依赖关系
- After=php-fpm.service(或其他上游服务名):显式等待特定服务启动完成
- ExecStartPre=/bin/sleep 3:简单粗暴地启动前等待 3 秒(仅作临时调试,不推荐长期使用)
注意:network-online.target 需要 systemd-networkd-wait-online.service 或对应网络管理器支持;若用 NetworkManager,需启用 NetworkManager-wait-online.service。
验证与重载配置
修改 service 文件后必须重新加载 systemd 配置,并检查是否生效:
- sudo systemctl daemon-reload:重载 unit 文件
- sudo systemctl enable nginx:确保开机自启(若尚未启用)
- sudo systemctl restart nginx:触发新配置
- sudo systemctl status nginx -l:查看实时状态与最近日志,确认 Restart 和 After 是否被识别
- sudo systemctl list-dependencies nginx --after:查看实际生效的“启动顺序依赖”
补充建议:避免假性启动失败
有时 Nginx 启动报错并非真因依赖未就绪,而是配置问题或端口冲突。建议:
- 运行 sudo nginx -t 确保配置语法正确
- 用 ss -tlnp | grep :80 检查 80/443 端口是否被占用
- 若依赖动态服务(如 Consul 注册的后端),可改用 ExecStartPre 脚本做健康探测,而非单纯延时
- 日志中若频繁出现 "connect() failed (111: Connection refused)",说明 upstream 不可用,应优先修复依赖服务启动顺序,而非加长 sleep

















