网站502错误原因排查解决方案:网站502错误原因排查全攻略
认清502错误:你的网站和服务器之间断了线
很多新手站长打开网站看到白屏或“502 Bad Gateway”时容易慌。
其实502本质是你的Web服务器(如Nginx或Apache)成功接收了请求,但在往后端应用服务器(如PHP-FPM)转发时,对方没有及时响应。
原因通常是PHP服务挂了、资源耗尽、代理配置错误或超时设置过短。
排查方向很明确:先看服务是否活着,再看配置是否合理,最后从日志里抓线索。
第一步:检查PHP-FPM或Apache是否在运行
90%的502都因PHP-FPM(负责处理PHP脚本的进程管理器)意外停止。
登录服务器后执行:
# 查看PHP-FPM状态
systemctl status php-fpm
# 如果没启动,看到红色dead字样
# 立即启动并设置开机自启
systemctl start php-fpm
systemctl enable php-fpm
如果你用的是Apache mod_php,则检查Apache:
systemctl status httpd
重点:启动后立刻刷新网站,如果恢复,说明问题根源就是PHP服务挂了。
如果还没好,继续下一步。
第二步:核对Web服务器反向代理配置
502常见于反向代理将请求转发到错误的地址或端口。
以Nginx为例,检查站点配置文件(通常在/etc/nginx/sites-available/或/usr/local/nginx/conf/):
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 确保地址和端口与PHP-FPM监听一致
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
如果PHP-FPM配置监听的是Unix socket而不是端口,比如listen = /var/run/php-fpm/php-fpm.sock,那么Nginx里也要换成:
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
验证:修改后执行nginx -t检查语法,无报错后systemctl reload nginx,再刷新网站。
第三步:从日志里揪出真实报错
如果服务都正常,配置也没改过,那就要看日志。
日志路径一般在:
- Nginx 错误日志:
/var/log/nginx/error.log - PHP-FPM 慢日志:
/var/log/php-fpm/slow.log - PHP-FPM 错误日志:
/var/log/php-fpm/error.log
用tail命令实时查看最新报错:
tail -f /var/log/nginx/error.log
常见的日志线索:
connect() failed (111: Connection refused) while connecting to upstream—— PHP-FPM没监听该端口upstream timed out (110: Connection timed out) while reading response header—— PHP执行超时,需要调整fastcgi_read_timeout或request_terminate_timeoutPrimary script unknown—— 文件路径不对,检查root和fastcgi_param SCRIPT_FILENAME
避坑指南:三个最容易忽略的配置点
- 内存耗尽:PHP-FPM子进程太多吃满内存,导致新请求502。调整
pm.max_children,比如VPS 1G内存设为5-10。查看当前进程数:ps aux | grep php-fpm | wc -l。 - 防火墙或SELinux:某些云服务器开启了SELinux,阻止Nginx连接PHP-FPM socket。临时关闭:
setenforce 0,如果解决需永久配置或放行规则。 - 代理缓冲区太小:如果上游返回内容较大,
proxy_buffer_size或fastcgi_buffer_size太小也会502。在http或location块增加:
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
重启Nginx测试。
验证修复效果:从测试页到线上功能
修复后别只看首页,建议逐个测试以下场景:
- 刷新首页和几个深层页面
- 登录后台(通常涉及PHP Session)
- 提交表单或执行查询
- 用
curl -I yoursite.com查看返回状态码是否为200
如果问题偶尔复现,
建议在PHP-FPM配置中开启慢日志记录:slowlog = /var/log/php-fpm/slow.log,
并设置request_slowlog_timeout = 5s,
这样可以找出哪些PHP脚本执行过慢导致超时。
总结:502不是大毛病,按“查服务→看配置→读日志→调参数”这个顺序走一遍,基本都能解决。
怕的是乱改一气,建议每次只改一个地方、验证一次效果。
如果你按上述步骤仍未修复,下次可以专门讲如何通过调整PHP-FPM进程池彻底根治502。