应正确配置 nginx.service 单元文件,用 After/Wants 声明依赖如 network-online.target、remote-fs.target 和后端服务,避免 ExecStartPre 轮询;启用 Restart=on-failure 等健壮性选项,并通过 daemon-reload 和 list-dependencies 验证顺序。
要让 Nginx 通过 systemd 启动时按需等待依赖服务(如网络就绪、磁盘挂载完成、后端服务启动等),关键不是重写启动脚本,而是正确配置
的 systemd 单元文件。Nginx 官方已提供标准单元文件,自定义脚本反而容易破坏兼容性或引发 reload/failover 异常。
明确依赖关系:控制服务启动时机
systemd 通过
、
、
等指令定义服务顺序与依赖。例如:
确保网络完全就绪(比
更严格)
声明软依赖,不强制失败但影响顺序
保证 NFS 或其他远程文件系统已挂载
若 Nginx 反向代理本地服务,可显式等待其启动
避免常见陷阱:不要用 ExecStartPre 模拟依赖
有人在
中加
或轮询检测,这不可靠且违反 systemd 设计原则:
sleep 时间难预估,过短易失败,过长拖慢启动
轮询脚本未处理超时/重试/退出码,导致服务卡在 “activating” 状态
systemd 无法感知真实依赖状态,可能并行启动冲突服务
应优先用原生依赖指令,必要时配合
或自定义 target。
增强健壮性:启用自动重启与失败抑制
在
段中加入以下配置,提升生产环境稳定性:
:仅在非正常退出(如崩溃、被 kill)时重启
:重启前等待 5 秒,避免高频闪退
和
:1 分钟内最多启动失败 3 次,之后暂停尝试
:若 Nginx 30 秒内未进入 running 状态,视为启动失败
验证与调试:确认加载顺序生效
修改
后,务必执行:
—— 重新加载单元定义
—— 查看哪些服务应在它之前启动
—— 查看它之后启动的服务
+
—— 检查启动日志是否含 “Started nginx” 且无 timeout 或 failed 提示
若发现依赖未生效,检查目标 unit 是否存在(如
需启用
)。
nginx.serviceWantsAfterRequiresAfter=network-online.targetnetwork.targetWants=network-online.targetAfter=remote-fs.targetAfter=my-backend.serviceExecStartPresleepsystemd-networkd-wait-online.service[Service]Restart=on-failureRestartSec=5StartLimitIntervalSec=60StartLimitBurst=3TimeoutStartSec=30/etc/systemd/system/nginx.servicesudo systemctl daemon-reloadsudo systemctl list-dependencies nginx.service --beforesudo systemctl list-dependencies nginx.service --aftersudo systemctl status nginxjournalctl -u nginx -n 50 --no-pagernetwork-online.targetsystemd-networkd-wait-online.service