网站 502/403?从 0 到 1 快速定位 Web 问题全流程
502 和 403 是运维人最常碰到的状态码,别慌,主机选这篇 Linux 教程教你从零开始定位。直接给答案:先看 Nginx 日志,再查 PHP-FPM 状态,最后检查防火墙和权限。按这个顺序来,90% 的问题十分钟内解决。

第一步:查 Nginx 错误日志,锁定 502 根因
502 Bad Gateway 通常是上游服务(PHP-FPM 或反向代理)挂了或超时。别问为什么,先跑这条命令:
tail -f /var/log/nginx/error.log
实时滚动日志,看到 "connect() failed" 就是 PHP-FPM 挂了
常见报错模式:
• `connect() failed (111: Connection refused)` — PHP-FPM 没启动或端口不对。
• `upstream timed out (110: Connection timed out)` — 后端处理超时,调整 `fastcgi_read_timeout`。
• `no live upstreams` — 反向代理后端全挂了。
排障操作:如果日志显示连接被拒,立即检查 PHP-FPM 进程:
systemctl status php7.4-fpm
换成你自己的版本,比如 php8.1-fpm
ps aux | grep php-fpm
看进程数,如果没有或为 0,启动它
万一报错了别慌,重启 PHP-FPM 试试:
systemctl restart php7.4-fpm
重启后再次访问,如果还报 502,继续往下查
第二步:检查 PHP-FPM 配置和资源,避免 502 反复
502 频繁出现,往往是 PHP-FPM 进程数耗尽或内存不足。老手才知道的坑:默认 `pm.max_children` 可能太小。
cat /etc/php/7.4/fpm/pool.d/www.conf | grep -E 'pm.max_children|pm.start_servers'
查看当前配置,通常 VPS 1G 内存建议设 10-15
如果日志出现 `WARNING: [pool www] seems busy`,说明并发超了。直接改配置:
sudo sed -i 's/pm.max_children = 5/pm.max_children = 15/' /etc/php/7.4/fpm/pool.d/www.conf
调大进程数,别超过内存上限
systemctl reload php7.4-fpm
重载配置,不用重启
老鸟叮嘱:调大进程数前,先看内存余量。用 `free -m` 检查,确保每个 PHP 进程占用 30-50MB 内存,别把 VPS 撑爆。
第三步:排查 403 Forbidden,常见于权限和防火墙
403 是权限拒绝,和 502 原因完全不同。先用 curl 确认状态:
curl -I http://你的域名
返回 403,说明 Nginx 拒绝了访问
然后查 Nginx 日志(access.log 比 error.log 更直接):
tail -f /var/log/nginx/access.log | grep 403
看请求路径和客户端 IP
403 三大原因:
1.目录权限不够:Nginx 运行用户(通常是 www-data)没有读取网站文件权限。
2.防火墙或安全模块:比如 `mod_security` 或 `iptables` 拦截了。
3.索引文件缺失:目录下没有 `index.html` 或 `index.php`。
排障操作:修复权限最快的方法:
sudo chown -R www-data:www-data /var/www/html
把网站目录所有者改成 Nginx 用户
sudo find /var/www/html -type f -exec chmod 644 {} \;
文件权限 644,目录 755
sudo find /var/www/html -type d -exec chmod 755 {} \;
如果还是 403,检查防火墙:
sudo iptables -L -n | grep 80
看 80 端口是否放行,如果没规则,用 ufw 或 firewalld 放行
sudo ufw allow 80/tcp
Ubuntu 用 ufw,CentOS 用 firewalld
第四步:排查反向代理或缓存问题,处理复杂场景
如果你用了 CDN 或 Nginx 反向代理,502 可能来自上游。检查代理配置:
cat /etc/nginx/sites-enabled/default | grep proxy_pass
看代理后端地址,比如 http://127.0.0.1:8080
然后测试后端是否可达:
curl -I http://127.0.0.1:8080
如果返回空或超时,说明后端服务没启动
常见报错:`upstream sent invalid header` — 后端返回了错误格式的响应,检查后端应用日志。
老鸟叮嘱:修改 Nginx 配置后,务必先 `nginx -t` 测试语法,再 `systemctl reload nginx`。直接重启可能造成服务中断。
FAQ
Q: Linux SSH 连不上怎么办?
A: 先检查网络:`ping 你的服务器IP`。如果能 ping 通,看 SSH 服务:`systemctl status sshd`。如果没启动,用 VPS 控制台重启。还不行,检查防火墙是否放行 22 端口。
Q: VPS 防火墙端口放行后还是访问不了是什么原因?
A: 可能是云平台安全组没放行。登录云服务商控制台,检查入站规则。另外,服务器内部防火墙(如 ufw、iptables)也要放行。双保险。
Q: Linux 小白可以直接用 root 账号操作吗?
A: 不建议。日常操作用普通用户加 sudo,避免误删系统文件。只有安装软件、修改系统配置才用 root。万一手滑,恢复成本很高。
Q: BBR 开启后为什么速度没有明显提升?
A: BBR 优化的是网络拥堵场景,不是带宽本身。如果服务器到客户端路径没有丢包,BBR 效果不明显。可以用 `ping -c 100 你的IP` 看丢包率,高于 1% 才值得开。
Q: 网站 502 但 PHP-FPM 正常运行,怎么排查?
A: 检查 Nginx 的 `fastcgi_pass` 配置,确保 IP 和端口匹配 PHP-FPM 的监听地址。用 `ss -tlnp | grep 9000` 确认 PHP-FPM 在 9000 端口监听。
Q: 403 错误日志显示“directory index of "/var/www/html" is forbidden”怎么解决?
A: 目录下缺少默认索引文件(如 index.html)。创建文件或修改 Nginx 配置:`index index.php index.html;` 加到 server 块里。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9554.html 商家投稿邮箱:zhujixuanblog@qq.com
