LNMP出现502 Bad Gateway的定位与修复指南
一、快速判断与定位
/usr/local/nginx/logs/error.log/usr/local/php/var/log/php-fpm.logps -ef | grep php-fpm;若未运行,启动服务并观察日志。listen 与 Nginx 的 fastcgi_pass unix:/path.sock; 必须一致;listen = 127.0.0.1:9000;,Nginx 对应 fastcgi_pass 127.0.0.1:9000;。nginx -t 检查配置;nginx -s reload 或 service nginx reload 平滑重载。二、常见原因与对应修复
SCRIPT_FILENAME 指向错误目录。SCRIPT_FILENAME 为站点真实根目录(如:/data/www$fastcgi_script_name)。listen.owner/listen.group 与 Nginx 运行用户一致;或统一使用 TCP 方式规避权限。pm.max_children;动态模式下同步调整 pm.start_servers、pm.min_spare_servers、pm.max_spare_servers;可按内存经验值:4GB≈150、8GB≈300(需结合实际负载与内存)。php.ini 提高 max_execution_time(如 300 秒或按需);在 PHP-FPM 调整 request_terminate_timeout;必要时同步调大 Nginx 的 fastcgi_read_timeout。df -h、du -sh 清理无用文件,释放空间后重启服务。nofile 65535、rlimit_files),并重启 PHP-FPM。三、关键配置示例
server {
listen 80;
server_name example.com;
root /data/www;
index index.php index.html;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/tmp/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
}
}
[www]
listen = /tmp/www.sock
user = php-fpm
group = php-fpm
listen.owner = nobody
listen.group = nobody
pm = dynamic
pm.max_children = 150
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
nginx -t && nginx -s reload && service php-fpm restart。四、临时兜底与长期优化
#!/bin/bash
url="https://yourdomain.com"
code=$(curl -o /dev/null -m 10 -s -w "%{http_code}" "$url")
if [ "$code" = "502" ]; then
/etc/init.d/php-fpm restart
echo "$(date) $url $code 重启PHP-FPM" >> /var/log/502_monitor.log
fi
crontab 每 2 分钟执行一次。