nginx.service 启动失败 "control process exited" 怎么排查?
systemd 报 nginx.service failed because the control process exited 的排查路径:nginx -t 查语法、journalctl -xe 看详细日志、端口占用、权限问题,按序检查清单与 FAQ。
这个 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,已有映射不能重复添加,应审查所属策略后决定是否修改。