Ubuntu 上 Nginx 故障排查清单
一 快速定位流程
sudo nginx -t,确保输出为 syntax is ok / test is successful。sudo systemctl status nginx,若失败,结合 sudo journalctl -xe 获取详细上下文。sudo tail -f /var/log/nginx/error.log,优先从最新报错入手。ss -tulnp | grep ':80\|:443'(或 netstat -tulnp | grep ':80\|:443'),确认 80/443 未被占用且监听正确。curl -I http://127.0.0.1 或服务器公网 IP;远程可用 curl -Iv https://你的域名 查看 TLS 握手与重定向细节。二 常见错误与处理对照表
| 症状 | 快速检查 | 处理要点 |
|---|---|---|
| Job for nginx.service failed | sudo nginx -t、sudo systemctl status nginx、sudo journalctl -xe |
先修正语法或端口冲突,再重启服务 |
| bind() to 0.0.0.0:80 failed (98: Address already in use) | `ss -tulnp | grep :80或netstat -tulnp |
| Permission denied / 403 Forbidden | ls -ld /var/www/html、检查 user 指令 |
目录/文件权限与 Nginx 运行用户(如 www-data) 一致,常用:chmod -R 755 /var/www/html,chown -R www-data:www-data /var/www/html |
| No such file or directory(如 nginx.conf 或 logs 目录缺失) | ls /etc/nginx/nginx.conf、ls /var/log/nginx/ |
指定正确配置:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf;缺失 logs 则 mkdir -p /usr/local/nginx/logs && touch error.log access.log |
| invalid PID number “” in “/run/nginx.pid” | cat /run/nginx.pid |
以指定配置启动:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 重建 pid |
| 域名无法访问 / ERR_NAME_NOT_RESOLVED | nslookup 你的域名、dig 你的域名 |
核对 DNS 解析 与 A/CNAME 记录是否正确 |
| 正则或 location 导致 NOT FOUND | 检查 location 匹配顺序与正则 |
使用精确匹配 location = /,前缀匹配 ^~,区分大小写 ~ 或不区分 ~*,避免错误正则覆盖 |
三 配置与权限要点
sudo nginx -t 验证;主配置通常位于 /etc/nginx/nginx.conf,站点配置常通过 include /etc/nginx/conf.d/*.conf; 或 include /etc/nginx/sites-enabled/*; 引入,便于拆分与排错。server { listen 80; server_name your.domain; ... } 中确保端口未被占用、域名与证书匹配;反向代理时 proxy_pass 目标地址末尾不要带多余 /,以免路径拼接异常。user www-data;(或自定义用户)与网站目录权限一致;常见做法为目录 755、文件 644,必要时 chown -R www-data:www-data 你的目录。tail -f 观察请求是否到达与匹配到了哪个 server/location。四 网络与防火墙检查
ss -tulnp | grep ':80\|:443',curl -I http://127.0.0.1 验证服务是否在本机可达。curl -Iv https://你的域名 检查 TLS 与重定向;nslookup/dig 核对 DNS 记录是否正确。sudo ufw allow 80/tcp、sudo ufw allow 443/tcp,或 sudo ufw status 查看规则是否已生效。五 一键排查脚本示例
#!/usr/bin/env bash
set -e
echo "=== 1) 配置语法检查 ==="
sudo nginx -t
echo "=== 2) 服务状态 ==="
sudo systemctl status nginx || true
sudo journalctl -xe --no-pager -n 50 || true
echo "=== 3) 监听端口 ==="
ss -tulnp | grep ':80\|:443' || echo "未检测到 80/443 监听"
echo "=== 4) 错误日志尾部 ==="
sudo tail -n 50 /var/log/nginx/error.log || echo "无 /var/log/nginx/error.log"
echo "=== 5) 站点目录权限示例 ==="
ls -ld /var/www/html 2>/dev/null || echo "目录 /var/www/html 不存在"
echo "=== 6) DNS 解析 ==="
nslookup your.domain || dig your.domain +short || echo "DNS 解析失败(将 your.domain 替换为实际域名)"
将脚本保存为 nginx-debug.sh,执行 bash nginx-debug.sh 即可按序输出关键诊断信息。