nginx.service 启动失败 "control process exited" 怎么排查?

systemd 报 nginx.service failed because the control process exited 的排查路径:nginx -t 查语法、journalctl -xe 看详细日志、端口占用、权限问题,按序检查清单与 FAQ。

最佳实践
nginx.service 启动失败 "control process exited" 怎么排查?封面

这个 systemd 报错只是"启动子进程失败了"的通用外壳,真正的原因要看 Nginx 自己的错误输出。先用 systemctl cat nginx.service 核对 ExecStart/ExecStartPre、配置路径和运行环境,再按相同二进制与参数检查。标准动作两步:sudo nginx -t 查配置语法;sudo journalctl -xeu nginx.service 看详细日志。

排查顺序(按命中率)

1. 配置语法错误(最常见)

sudo nginx -t

输出会直接指出哪个文件第几行有错:[emerg] ... in /etc/nginx/conf.d/mysite.conf:23。常见错法:少分号、括号不配对、指令写错位置(如把 location 写进了 http 顶层)。

2. 看详细日志

sudo journalctl -xeu nginx.service
sudo tail -50 /var/log/nginx/error.log

3. 端口被占用

nginx -t 通过但启动失败,经典原因是 80/443 被占:

sudo ss -tlnp '( sport = :80 or sport = :443 )'

占用者可能是 Apache(装了没卸)、另一个 Nginx 实例、或某个乱入的应用。停掉对方或改自己的监听端口。

4. 文件/路径问题

  • 配置里 ssl_certificate 指向的证书文件不存在或权限不足;
  • error_log/access_log 指向的目录不存在(Nginx 不会自动创建日志目录);
  • include 了不存在的路径且没用通配符。

5. 残留进程卡死

之前手动起的 Nginx 没被 systemd 管理,占着端口导致 systemd 启动失败:

ps aux | grep nginx           # 核对master PID、命令行和所属服务
# 确认需要停掉该独立实例且已安排服务切换后:
sudo kill -QUIT <已确认的master_PID>
# 等待该实例释放监听端口后再启动目标服务
sudo systemctl start nginx

修复后

sudo nginx -t                 # 再验一次
sudo systemctl start nginx
sudo systemctl status nginx   # 确认 active (running)

恢复后,可为站点配置观测云 HTTP 拨测,从实际用户所在区域检查状态码和响应内容;告警需另设检测周期与通知对象。启动失败的原因仍以本次 journalctl 和 error.log 为准,尤其要核对失败发生在日志文件可写之前还是之后。

常见问题(FAQ)

Q:nginx -t 明明 ok,为什么还是起不来?
A:-t 只查语法和文件可达性,查不了端口占用和运行时资源冲突。-t 过了就按上面第 3-5 步查端口和残留进程。

Q:journalctl 里没有有用的信息?
A:有些错误只写进 error.log。两个都看;仍需前台诊断时,先确认无目标实例在运行、端口不会冲突,并使用服务实际二进制和配置参数;不要直接另起一个与线上争抢端口的实例。

Q:SELinux 会导致启动失败吗?
A:会——比如配置里监听了非标准端口(如 8081),SELinux 不允许 httpd 绑定。看 audit.log,先用 semanage port -l 检查映射;未分配端口可用 -a,已有映射不能重复添加,应审查所属策略后决定是否修改。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台