502 Bad Gateway错误通常发生在Nginx无法正确与PHP-FPM通信时。以下是全面的解决方案:
# 检查PHP-FPM状态
sudo systemctl status php-fpm # 或 php7.x-fpm
# 启动/重启PHP-FPM
sudo systemctl start php-fpm
sudo systemctl restart php-fpm
检查Nginx和PHP-FPM的监听配置是否匹配:
Nginx配置 (通常在/etc/nginx/sites-available/your-site
):
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 或 127.0.0.1:9000
# 其他fastcgi参数...
}
PHP-FPM配置 (通常在/etc/php/7.4/fpm/pool.d/www.conf
):
listen = /run/php/php7.4-fpm.sock # 或 listen = 9000
确保两者使用相同的通信方式(Unix套接字或TCP端口)。
# 检查套接文件权限
ls -l /run/php/php7.4-fpm.sock
# 典型修复命令
sudo chown www-data:www-data /run/php/php7.4-fpm.sock
sudo chmod 660 /run/php/php7.4-fpm.sock
在/etc/php/7.4/fpm/pool.d/www.conf
中调整:
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500
在PHP-FPM配置中增加:
request_terminate_timeout = 300s
在Nginx配置中增加:
fastcgi_read_timeout 300;
检查错误日志:
# Nginx错误日志
tail -f /var/log/nginx/error.log
# PHP-FPM错误日志
tail -f /var/log/php7.4-fpm.log
测试PHP-FPM是否响应:
# 如果使用TCP
telnet 127.0.0.1 9000
# 如果使用Unix套接字
sudo netstat -lnp | grep php-fpm
验证PHP文件处理:
创建一个简单的info.php
文件:
<?php phpinfo(); ?>
然后通过浏览器访问它,看是否能正常显示。
如果问题仍然存在,尝试:
完全重新加载配置:
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm
检查SELinux状态(如果是CentOS/RHEL):
sudo setenforce 0 # 临时禁用
sudo getenforce # 检查状态
检查防火墙设置:
sudo ufw status # Ubuntu
sudo firewall-cmd --list-all # CentOS
尝试切换到TCP连接方式(如果使用Unix套接字有问题):
# 在PHP-FPM配置中
listen = 127.0.0.1:9000
# 在Nginx配置中
fastcgi_pass 127.0.0.1:9000;
通过以上步骤,大多数502 Bad Gateway错误应该能够得到解决。如果问题仍然存在,请提供具体的错误日志内容以便进一步诊断。