第零步:确认基本问题

在开始深入排查之前,先确认几个最基本的问题:

  1. 域名/IP是否正确? 确保你输入的网址(域名或IP地址)是正确的。
  2. 其他网站能打开吗? 如果你的服务器上还运行着其他网站(Apache),看看它们是否正常,如果所有网站都打不开,那问题很可能出在 Nginx 服务本身或系统网络层面。
  3. 浏览器问题? 尝试换个浏览器(如 Chrome, Firefox, Edge)或者使用手机流量访问,排除本地浏览器或网络运营商的问题。
  4. 防火墙/安全组? 检查服务器的防火墙(如 ufw, firewalld)和云服务商(如阿里云、腾讯云、AWS)的安全组设置,确保 80 (HTTP)443 (HTTPS) 端口是开放的。

第一步:检查 Nginx 服务状态

这是最核心的第一步,确认 Nginx 是否正在运行。

  1. 检查 Nginx 进程是否存在:

    ps aux | grep nginx
    • 如果看到类似 nginx: master processnginx: worker process 的行,说明 Nginx 正在运行。
    • 如果只看到 grep nginx 这一行,说明 Nginx 没有运行。
  2. 检查 Nginx 服务状态(推荐使用 systemd):

    sudo systemctl status nginx
    • 如果显示 active (running),说明服务正在运行。
    • 如果显示 failedinactive,说明服务没有运行或启动失败。
  3. 如果服务没有运行,尝试启动它:

    sudo systemctl start nginx

    启动后,再次用 sudo systemctl status nginx 检查。

  4. 查看启动失败的错误信息: 如果服务启动失败,可以用以下命令查看详细的错误日志:

    sudo journalctl -u nginx -n 50  # 查看最近50行Nginx的系统日志

    这里的 -n 50 是显示最近的50行,你可以根据需要调整数字。


第二步:检查 Nginx 错误日志

Nginx 服务在运行,但网站依然打不开,那么问题很可能出在配置文件或网站本身上。错误日志是排查问题的最佳线索。

Nginx 的默认错误日志路径通常是 /var/log/nginx/error.log

  1. 查看错误日志:

    sudo tail -f /var/log/nginx/error.log

    (使用 tail -f 可以实时查看日志,方便你在浏览器访问时观察新产生的错误信息)

  2. 常见的错误日志信息及含义:

    • connect() to [127.0.0.1]:9000 failed (13: Permission denied)

      • 原因:Nginx worker 进程没有权限连接到后端服务(如 PHP-FPM),通常是因为 Nginx 运行在 www-data 用户,而 PHP-FPM 运行在其他用户,或者它们的 socket 文件权限不正确。
      • 解决:检查 PHP-FPM 的配置文件,确保 listen.owner, listen.group, listen.mode 设置正确,Nginx 用户(通常是 www-data)有权限访问。
    • could not build the server_names_hash

      • 原因server_name 配置有问题,比如某个 server_name 太长或格式错误。
      • 解决:检查 Nginx 主配置文件 (nginx.conf) 和虚拟主机配置文件中的 server_name 指令。
    • no live upstreams while connecting to upstream

      • 原因:负载均衡或反向代理配置中,所有后端服务器(upstream)都不可用。
      • 解决:检查 upstream 块配置的后端服务器地址和端口是否正确,以及后端服务是否正常运行。
    • [crit] ... open() "/var/log/nginx/access.log" failed (13: Permission denied)

      • 原因:Nginx 进程没有权限写入访问日志文件。
      • 解决:修改日志文件的所属用户和组,使其与 Nginx 运行用户一致。
        sudo chown -R www-data:www-data /var/log/nginx/
    • file not found

      • 原因:Nginx 找不到你请求的文件(如 index.html)。
      • 解决:检查 root 指令指定的网站根目录路径是否正确,以及该目录下是否存在 index.html 文件,检查文件权限。

第三步:检查 Nginx 配置文件

错误的配置是导致网站无法访问的常见原因。

  1. 检查配置文件语法是否正确:

    sudo nginx -t
    • 如果显示 syntax is oktest is successful,说明配置文件语法没有问题。
    • 如果显示错误信息,会明确指出是哪个文件、哪一行出了问题,根据提示去修改配置文件,然后重新加载 Nginx。
  2. 重新加载/重启 Nginx 使配置生效: 修改配置后,需要让 Nginx 重新加载配置。

    # 重新加载配置(推荐,不会中断现有连接)
    sudo nginx -s reload
    # 如果reload失败,可以尝试重启
    sudo systemctl restart nginx

第四步:检查网站目录和文件权限

即使 Nginx 在运行,如果它没有权限读取你的网站文件,也会返回 403 Forbidden 错误。

  1. 检查网站根目录的所有者: 假设你的网站根目录是 /var/www/html

    ls -l /var/www/html

    确保所有者和组是 Nginx 的运行用户,通常是 www-data

    # 如果不是,修改所有者
    sudo chown -R www-data:www-data /var/www/html
  2. 检查目录和文件的权限:

    • 目录权限通常应该是 755 (drwxr-xr-x)。
    • 文件权限通常应该是 644 (-rw-r--r--)。
      # 递归设置目录权限
      sudo find /var/www/html -type d -exec chmod 755 {} \;

    递归设置文件权限

    sudo find /var/www/html -type f -exec chmod 644 {} \;


第五步:检查端口是否被监听

确保 Nginx 正在监听正确的端口(80和443)。

  1. 使用 netstatss 命令检查:

    # 使用 netstat
    sudo netstat -tlnp | grep nginx
    # 或者使用 ss (更现代)
    sudo ss -tlnp | grep nginx
    • 你应该能看到类似 0.0.0:800.0.0:443 的监听地址和端口。
    • nginx 没有出现在结果中,说明 Nginx 没有成功绑定到端口。

第六步:检查 SELinux 或 AppArmor

如果你在使用 CentOS/RHEL 等系统,可能是 SELinux 阻止了 Nginx 的访问。

  1. 检查 SELinux 状态:

    sestatus

    如果是 enabled,需要检查是否是 SELinux 导致的问题,可以临时设置为 permissive 模式来测试(重启后恢复):

    sudo setenforce 0

    如果网站可以打开了,SELinux 的问题,你需要为 Nginx 设置正确的 SELinux 策略,而不是直接关闭它。

  2. 对于 Ubuntu/Debian,检查 AppArmor: AppArmor 也有可能限制 Nginx,可以临时禁用 Nginx 的 AppArmor 配置来测试:

    sudo aa-complain /usr/sbin/nginx

    同样,这只是排查手段,不建议长期禁用。


总结与排查清单

当你遇到“Nginx 网站打不开”时,按以下顺序快速排查:

  1. [ ] sudo systemctl status nginx -> 服务是否在运行?
  2. [ ] sudo tail -f /var/log/nginx/error.log -> 查看最新的错误信息。
  3. [ ] sudo nginx -t -> 配置文件语法是否正确?
  4. [ ] sudo ss -tlnp | grep nginx -> 是否在监听 80 和 443 端口?
  5. [ ] ls -l /var/www/html -> 网站目录和文件的所有者、权限是否正确?
  6. [ ] 检查云服务商安全组和服务器防火墙 -> 80/443 端口是否开放?

按照这个流程,90% 以上的问题都能被定位和解决,如果问题依然存在,请提供你遇到的 错误日志信息,这样我可以给出更精确的解决方案。