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 自己的错误输出。标准动作两步: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 | grep -E ':80|:443'

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

4. 文件/路径问题

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

5. 残留进程卡死

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

ps aux | grep nginx           # 有非 systemd 拉的 master 就先杀
sudo pkill nginx
sudo systemctl start nginx

修复后

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

观测云对照

Nginx 起不来的故障窗口,站点是完全不可用的——这类事故的第一要务是缩短发现时间。把 Nginx error.log 接入观测云,[emerg] 级日志(启动失败、配置错误都会打这个级别)设即时告警;配合站点可用性监测从外部探测,"改配置把服务改挂了"从事后扯皮变成分钟级回滚。

常见问题(FAQ)

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

Q:journalctl 里没有有用的信息?
A:有些错误只写进 error.log。两个都看;还是找不到时 sudo nginx -g 'daemon off;' 前台直接跑,错误会直接打在终端上。

Q:SELinux 会导致启动失败吗?
A:会——比如配置里监听了非标准端口(如 8081),SELinux 不允许 httpd 绑定。看 audit.log,用 semanage port -a -t http_port_t -p tcp 8081 放行。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台