Wants和Requires必须与After配对使用才能生效:Wants=network-online.target确保软依赖启动,After=network-online.target保证顺序,单独After不触发等待;挂载点需用.mount单元名而非路径;代理后端需补充socket目录创建与权限设置;验证须用systemctl show和list-dependencies命令。

依赖没生效?先看 Wants 和 Requires 有没有配对 After
单独写 After=network-online.target 不会触发等待,systemd 只按顺序启动,不校验目标是否真就绪。常见错误是只加 After 却漏掉 Wants= 或 Requires=,结果 Nginx 抢在网卡获取 IP 前启动,绑定 80 端口失败。
必须组合使用:
-
Wants=network-online.target:尝试启动等待服务(软依赖,失败也不拦 Nginx) -
After=network-online.target:确保顺序,等它完成后再启动 - 若要求“网络不可用就别启 Nginx”,改用
Requires=network-online.target(强依赖,失败则本服务直接退出)
挂载点路径没就绪?用 .mount 单元名而非路径
当 SSL 证书放在 /etc/nginx/ssl,而该目录由独立磁盘挂载时,不能写 Wants=/etc/nginx/ssl.mount —— systemd 不认路径形式的挂载单元名。实际单元名来自 .mount 文件名,比如你建了 /etc/systemd/system/mnt-ssl.mount,对应单元名就是 mnt-ssl.mount。
正确写法:
Wants=mnt-ssl.mountAfter=mnt-ssl.mount- 确保
mnt-ssl.mount文件中What=和Where=指向真实设备与挂载点 - 执行
sudo systemctl daemon-reload后,用systemctl is-active mnt-ssl.mount验证挂载单元状态
代理后端服务(如 PHP-FPM)总报 502?不只是加 Wants
Nginx 启动时后端进程可能已运行,但 Unix socket(如 /run/php-fpm.sock)还没创建或权限不对,Wants=php-fpm.service + After=php-fpm.service 仍不够。
需补充防护措施:
- 确认
php-fpm.service的[Service]段有RuntimeDirectory=php-fpm或手动创建 socket 目录 - 在 Nginx 单元中加
ExecStartPre=-/bin/mkdir -p /run/php-fpm(-表示忽略 mkdir 失败) - 加
ExecStartPre=-/bin/chown nginx:nginx /run/php-fpm保证权限 - 避免用
Requires=php-fpm.service,除非你确定它绝对不能晚于 Nginx 启动;多数场景Wants更安全
验证依赖是否真起作用?别只看 enable 状态
systemctl is-enabled nginx.service 只说明是否开机自启,完全不反映依赖配置是否生效。真正要查的是启动时序和实际依赖链。
实操检查步骤:
- 运行
systemctl show nginx.service -p After -p Wants -p Requires,核对输出是否含你写的单元名 - 执行
systemctl list-dependencies nginx.service,看输出里是否有network-online.target、mnt-ssl.mount等 - 重启机器或模拟启动:
sudo systemctl restart nginx.service,立刻跑journalctl -u nginx.service -n 30,重点找 “bind failed” 或 “No such file or directory” 类错误 - 如果挂载或网络单元本身启动慢,
systemd-analyze blame能看出哪个环节拖慢整体启动
最易被忽略的一点:所有修改必须经 sudo systemctl daemon-reload 才生效,且该命令不提示成功与否——没执行就等于没改。


















