Ubuntu 下 Nginx 问题排查实操手册
一、快速定位流程
sudo nginx -t(若自定义配置路径:sudo nginx -t -c /path/nginx.conf)。通过后再进行重启或热加载。sudo systemctl status nginx,失败时用 sudo journalctl -xeu nginx 获取详细报错。sudo tail -f /var/log/nginx/error.log,优先从最新错误入手。ss -tulnp | grep ':80\|:443'(或 netstat -tulnp | grep ':80\|:443')。curl -I http://127.0.0.1 或外网 curl -Iv https://你的域名,观察状态码与响应头。sudo ufw allow 80,443/tcp;云服务器还需在安全组放行对应端口。二、常见故障与处理要点
| 症状 | 关键线索 | 处理要点 |
|---|---|---|
| 启动失败 | bind() to 0.0.0.0:80 failed (98: Address already in use) |
查占用:`ss -tulnp |
| 403 Forbidden | Permission denied、open() ".../index.html" failed (13: Permission denied) |
目录/文件权限:chmod -R 755 /var/www/html,chown -R www-data:www-data /var/www/html;检查 root 路径与索引文件;必要时确认 user www-data; 与目录属主一致。 |
| 502 Bad Gateway | connect() failed (111: Connection refused) 或 upstream timed out |
上游未起/端口不对:systemctl status php-fpm 或 `ps aux |
| 504 Gateway Timeout | upstream timed out (110: Connection timed out) |
同上,先确认上游健康;再增大超时:proxy_read_timeout 60s; proxy_connect_timeout 60s;。 |
| 静态资源 404 | No such file 或 The requested URL was not found |
核对 root 与 location 匹配;确认文件存在且路径大小写正确;正则或前缀匹配不当也会致 404。 |
| 域名可解析但访问被拒 | 浏览器 ERR_NAME_NOT_RESOLVED 或连接被拒 |
先 ping/dig 检查解析;再确认本机/云安全组/防火墙已放行 80/443;必要时 curl -Iv 看握手与返回。 |
三、日志与配置验证
sudo nginx -t;成功后 sudo systemctl reload nginx(零停机)。/var/log/nginx/error.log;实时跟踪:sudo tail -f /var/log/nginx/error.log。bind() to 0.0.0.0:80 failed → 端口冲突;Permission denied → 权限/属主/路径问题;connect() failed (111: Connection refused) → 上游未启动或端口错误;upstream timed out → 上游慢或超时阈值过低。/var/log/nginx/access.log;常用:tail -f 实时看、awk 统计 Top IP/URL,用于定位异常流量与错误集中点。sudo strace -p <worker_pid> -s 1024 -e trace=file,network 可快速看到文件访问拒绝或连接被拒等系统调用失败点。四、进阶排查与优化
ss -tulpn | grep :9000、telnet 127.0.0.1 9000;proxy_pass 末尾斜杠会影响路径拼接;按需选择 proxy_pass http://127.0.0.1:3000; 与 proxy_pass http://127.0.0.1:3000/;。sudo ufw status 与云控制台安全组同时核对 80/443 放行状态。/etc/logrotate.d/nginx 自动轮转,防止磁盘被日志撑满。五、一键排查脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
echo "=== 1) 配置语法 ==="
sudo nginx -t
echo -e "\n=== 2) 服务状态 ==="
sudo systemctl status nginx --no-pager || true
sudo journalctl -xeu nginx --no-pager -n 50 || true
echo -e "\n=== 3) 监听端口 ==="
ss -tulnp | grep ':80\|:443' || echo "未检测到 80/443 监听"
echo -e "\n=== 4) 错误日志尾部 ==="
sudo tail -n 50 /var/log/nginx/error.log || echo "无法读取错误日志"
echo -e "\n=== 5) 访问日志最新 10 行 ==="
sudo tail -n 10 /var/log/nginx/access.log || echo "无法读取访问日志"
echo -e "\n=== 6) 防火墙状态 ==="
sudo ufw status || echo "ufw 未安装或未启用"
echo -e "\n=== 7) 本机连通性测试 ==="
curl -I http://127.0.0.1 || echo "本机访问 127.0.0.1 失败"
nginx-debug.sh,chmod +x nginx-debug.sh,执行 ./nginx-debug.sh。curl -Iv https://你的域名 核对 TLS 握手与返回码。