502错误表示Nginx作为反向代理服务器时,无法从上游服务器(PHP-FPM)获取有效响应。以下是系统性的排查和解决方案:
# 检查PHP-FPM状态
systemctl status php-fpm # 或 service php-fpm status
# 如果未运行,启动服务
systemctl start php-fpm
systemctl enable php-fpm # 设置开机自启
检查/etc/php-fpm.conf
和/etc/php-fpm.d/www.conf
:
- 确保监听方式正确(通常为socket或TCP)
- 检查用户/组权限(通常为nginx或www-data)
; 示例配置
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
user = nginx
group = nginx
检查Nginx站点配置中的PHP处理部分:
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock; # 或 127.0.0.1:9000
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
确保fastcgi_pass
与PHP-FPM的listen
设置匹配。
检查PHP-FPM进程是否耗尽:
ps aux | grep php-fpm
调整/etc/php-fpm.d/www.conf
中的:
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
增加PHP执行时间:
max_execution_time = 300
request_terminate_timeout = 300
确保socket文件或TCP端口可访问:
chown -R nginx:nginx /run/php-fpm/
chmod 660 /run/php-fpm/www.sock
查看关键日志定位问题:
# Nginx错误日志
tail -f /var/log/nginx/error.log
# PHP-FPM日志
tail -f /var/log/php-fpm.log
# 临时解决方案
setenforce 0
# 永久解决方案
semanage fcontext -a -t httpd_sys_rw_content_t "/run/php-fpm(/.*)?"
restorecon -Rv /run/php-fpm
测试PHP-FPM是否响应:
SCRIPT_NAME=/status SCRIPT_FILENAME=/status QUERY_STRING=full REQUEST_METHOD=GET \
cgi-fcgi -bind -connect /run/php-fpm/www.sock
检查端口/socket连接:
ss -pl | grep php-fpm
netstat -tulnp | grep php-fpm
验证PHP文件是否可执行:
创建一个简单的info.php
文件测试:
<?php phpinfo(); ?>
通过以上步骤,通常可以定位并解决Nginx+PHP-FPM的502错误问题。