第零步:确认基本问题
在开始深入排查之前,先确认几个最基本的问题:
- 域名/IP是否正确? 确保你输入的网址(域名或IP地址)是正确的。
- 其他网站能打开吗? 如果你的服务器上还运行着其他网站(Apache),看看它们是否正常,如果所有网站都打不开,那问题很可能出在 Nginx 服务本身或系统网络层面。
- 浏览器问题? 尝试换个浏览器(如 Chrome, Firefox, Edge)或者使用手机流量访问,排除本地浏览器或网络运营商的问题。
- 防火墙/安全组? 检查服务器的防火墙(如
ufw,firewalld)和云服务商(如阿里云、腾讯云、AWS)的安全组设置,确保 80 (HTTP) 和 443 (HTTPS) 端口是开放的。
第一步:检查 Nginx 服务状态
这是最核心的第一步,确认 Nginx 是否正在运行。
-
检查 Nginx 进程是否存在:
ps aux | grep nginx
- 如果看到类似
nginx: master process和nginx: worker process的行,说明 Nginx 正在运行。 - 如果只看到
grep nginx这一行,说明 Nginx 没有运行。
- 如果看到类似
-
检查 Nginx 服务状态(推荐使用
systemd):sudo systemctl status nginx
- 如果显示
active (running),说明服务正在运行。 - 如果显示
failed或inactive,说明服务没有运行或启动失败。
- 如果显示
-
如果服务没有运行,尝试启动它:
sudo systemctl start nginx
启动后,再次用
sudo systemctl status nginx检查。 -
查看启动失败的错误信息: 如果服务启动失败,可以用以下命令查看详细的错误日志:
sudo journalctl -u nginx -n 50 # 查看最近50行Nginx的系统日志
这里的
-n 50是显示最近的50行,你可以根据需要调整数字。
第二步:检查 Nginx 错误日志
Nginx 服务在运行,但网站依然打不开,那么问题很可能出在配置文件或网站本身上。错误日志是排查问题的最佳线索。
Nginx 的默认错误日志路径通常是 /var/log/nginx/error.log。
-
查看错误日志:
sudo tail -f /var/log/nginx/error.log
(使用
tail -f可以实时查看日志,方便你在浏览器访问时观察新产生的错误信息) -
常见的错误日志信息及含义:
-
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)有权限访问。
- 原因:Nginx worker 进程没有权限连接到后端服务(如 PHP-FPM),通常是因为 Nginx 运行在
-
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 找不到你请求的文件(如
-
第三步:检查 Nginx 配置文件
错误的配置是导致网站无法访问的常见原因。
-
检查配置文件语法是否正确:
sudo nginx -t
- 如果显示
syntax is ok和test is successful,说明配置文件语法没有问题。 - 如果显示错误信息,会明确指出是哪个文件、哪一行出了问题,根据提示去修改配置文件,然后重新加载 Nginx。
- 如果显示
-
重新加载/重启 Nginx 使配置生效: 修改配置后,需要让 Nginx 重新加载配置。
# 重新加载配置(推荐,不会中断现有连接) sudo nginx -s reload # 如果reload失败,可以尝试重启 sudo systemctl restart nginx
第四步:检查网站目录和文件权限
即使 Nginx 在运行,如果它没有权限读取你的网站文件,也会返回 403 Forbidden 错误。
-
检查网站根目录的所有者: 假设你的网站根目录是
/var/www/html。ls -l /var/www/html
确保所有者和组是 Nginx 的运行用户,通常是
www-data。# 如果不是,修改所有者 sudo chown -R www-data:www-data /var/www/html
-
检查目录和文件的权限:
- 目录权限通常应该是
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)。
-
使用
netstat或ss命令检查:# 使用 netstat sudo netstat -tlnp | grep nginx # 或者使用 ss (更现代) sudo ss -tlnp | grep nginx
- 你应该能看到类似
0.0.0:80和0.0.0:443的监听地址和端口。 nginx没有出现在结果中,说明 Nginx 没有成功绑定到端口。
- 你应该能看到类似
第六步:检查 SELinux 或 AppArmor
如果你在使用 CentOS/RHEL 等系统,可能是 SELinux 阻止了 Nginx 的访问。
-
检查 SELinux 状态:
sestatus
如果是
enabled,需要检查是否是 SELinux 导致的问题,可以临时设置为permissive模式来测试(重启后恢复):sudo setenforce 0
如果网站可以打开了,SELinux 的问题,你需要为 Nginx 设置正确的 SELinux 策略,而不是直接关闭它。
-
对于 Ubuntu/Debian,检查 AppArmor: AppArmor 也有可能限制 Nginx,可以临时禁用 Nginx 的 AppArmor 配置来测试:
sudo aa-complain /usr/sbin/nginx
同样,这只是排查手段,不建议长期禁用。
总结与排查清单
当你遇到“Nginx 网站打不开”时,按以下顺序快速排查:
- [ ]
sudo systemctl status nginx-> 服务是否在运行? - [ ]
sudo tail -f /var/log/nginx/error.log-> 查看最新的错误信息。 - [ ]
sudo nginx -t-> 配置文件语法是否正确? - [ ]
sudo ss -tlnp | grep nginx-> 是否在监听 80 和 443 端口? - [ ]
ls -l /var/www/html-> 网站目录和文件的所有者、权限是否正确? - [ ] 检查云服务商安全组和服务器防火墙 -> 80/443 端口是否开放?
按照这个流程,90% 以上的问题都能被定位和解决,如果问题依然存在,请提供你遇到的 错误日志信息,这样我可以给出更精确的解决方案。
