Ubuntu 上 Nginx 启动失败的排查与修复
一、快速定位
- 查看服务状态与最近报错:运行 systemctl status nginx,关注输出的错误片段与“Active: failed”。
- 查看服务日志:运行 journalctl -u nginx -f,实时跟踪启动失败原因。
- 检查配置文件语法:运行 sudo nginx -t(若使用默认安装,无需额外参数)。
- 查看 Nginx 自身日志:运行 sudo tail -f /var/log/nginx/error.log。
- 确认进程与端口:运行 ps aux | grep nginx;检查 80/443 是否被占用(如 sudo ss -tulnp | grep ‘:80\|:443’)。
以上命令能覆盖大多数启动失败场景,优先从状态与日志入手可快速缩小范围。
二、常见原因与对应修复
- 配置文件语法错误或路径问题
现象:nginx -t 报错,或 systemctl 提示 configuration test failed。
处理:执行 sudo nginx -t 定位文件与行号;修正指令参数、花括号、分号、include 路径;必要时用 sudo nginx -t -c /path/nginx.conf 指定正确配置。
- 端口被占用(如 80/443)
现象:bind() to 0.0.0.0:80 failed (98: Address already in use)。
处理:用 ss 找到占用进程 PID,确认无业务影响后 sudo kill -9 ;或在站点配置中把 listen 80; 改为其他端口并同步开放防火墙。
- PID 文件异常或残留进程干扰
现象:nginx: [error] invalid PID number “”;或 systemctl 反复失败。
处理:清理残留进程 pkill -9 nginx;若使用默认包安装,删除 /run/nginx.pid 后启动;若是源码安装,使用 nginx -c /usr/local/nginx/conf/nginx.conf 重新生成。
- 日志目录或文件不可写
现象:open() “/usr/local/nginx/logs/error.log” failed (13: Permission denied) 或 No such file or directory。
处理:确保日志目录存在且 Nginx 运行用户对目录有写权限;建议将日志放在 /var/log/nginx/(Debian/Ubuntu 常见做法),或执行:
sudo mkdir -p /usr/local/nginx/logs
sudo touch /usr/local/nginx/logs/{error,access}.log
sudo chown -R www-data:www-data /usr/local/nginx/logs
- 防火墙或云安全组未放行
现象:本机能访问,外网访问超时。
处理:UFW 放行 sudo ufw allow ‘Nginx HTTP’ 或 sudo ufw allow 80,443/tcp;云服务器同步在安全组放行对应端口。
- 服务单元不存在(未通过包管理器安装)
现象:Failed to start nginx.service: Unit nginx.service not found.
处理:优先用 sudo apt-get update && sudo apt-get install nginx 安装;若必须保留源码版,可编写 init 脚本或改用 systemd unit 托管。
以上为高频根因与处置要点,按“配置—端口—进程—权限—网络”的顺序排查,通常可在数分钟内恢复。
三、一键排查脚本示例
- 复制以下脚本保存为 /usr/local/bin/check_nginx.sh,执行 bash /usr/local/bin/check_nginx.sh 自动定位常见问题:
#!/usr/bin/env bash
set -Eeuo pipefail
echo "=== 1) 服务状态 ==="
systemctl is-active --quiet nginx && echo "Nginx is active." || {
echo "Nginx is NOT active. Status:"
systemctl status nginx --no-pager -l
}
echo -e "\n=== 2) 最近服务日志 ==="
journalctl -u nginx -n 50 --no-pager
echo -e "\n=== 3) 配置文件语法 ==="
if command -v nginx >/dev/null 2>&1; then
sudo nginx -t && echo "Config OK." || echo "Config ERROR, see above."
else
echo "nginx not found in PATH."
fi
echo -e "\n=== 4) 端口占用 80/443 ==="
ss -tulnp | grep -E ':80|:443' || echo "80/443 not in use."
echo -e "\n=== 5) Nginx 错误日志尾部 ==="
if [[ -f /var/log/nginx/error.log ]]; then
tail -n 50 /var/log/nginx/error.log
elif [[ -f /usr/local/nginx/logs/error.log ]]; then
tail -n 50 /usr/local/nginx/logs/error.log
else
echo "Nginx error log not found."
fi
该脚本覆盖了状态、日志、语法、端口与错误日志五个关键维度,便于快速定位。
四、仍未恢复时的稳妥方案
- 备份并重新安装
- 备份配置:sudo cp -a /etc/nginx /root/nginx.bak-$(date +%F)
- 彻底清理:
sudo apt-get --purge remove nginx nginx-common nginx-core
sudo apt-get autoremove
sudo rm -rf /etc/nginx /var/log/nginx /usr/share/nginx /run/nginx.pid
- 重装:sudo apt-get update && sudo apt-get install nginx
- 恢复配置前先测试:sudo nginx -t
- 启动:sudo systemctl start nginx && sudo systemctl enable nginx
- 源码安装的补充建议
若你是从源码编译安装,确保以正确的 -c 指定配置文件,并以合适的用户(如 www-data)运行;必要时为日志目录与站点根目录设置一致的属主与权限。
重装能修复因文件损坏、残留配置或单元文件缺失导致的顽固问题。