nginx.service 启动失败 "control process exited" 怎么排查?
systemd 报 nginx.service failed because the control process exited 的排查路径:nginx -t 查语法、journalctl -xe 看详细日志、端口占用、权限问题,按序检查清单与 FAQ。
这个 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 放行。