当网站打开遇到Nginx 502 bad gateway的错误,造成这种错误的原因有很多,下面分别解析nginx常见的502错误。


1、nginx配置文件错误


因为nginx找不到php-fpm了,所以报错,一般是fastcgi_pass后面的路径配置错误了,后面可以是socket或者是ip:port

解决方案:

[root@bier ~]# vim/usr/local/nginx/conf/vhosts/www.conf
server
{
   listen 80;
   server_name www.222.com;       
   index index.html index.htm index.php;
   root /data/www/;
   location ~ \.php$ {
       include fastcgi_params;
       fastcgi_pass unix:/tmp/www.sock;  //修改sock
       #fastcgi_pass 127.0.0.1:8000; 
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
    }
}




检查语法是否正常

[root@bier ~]#/usr/local/nginx/sbin/nginx -t

重新加载配置文件

[root@bier ~]# /usr/local/nginx/sbin/nginx-s reload




2、php-fpm资源耗尽


lnmp架构在处理php时,nginx直接调取后端的php-fpm服务,如果nginx的请求量偏高,我们又没有给php-fpm配置足够的子进程,那么php-fpm就会资源耗尽,一旦资源耗尽nginx找不到php-fpm就会出现502错误,

解决方案:

去调整php-fpm.conf中的pm.max_children数值,使其增加,但是也不能无限增加,毕竟资源有限,一般4G内存机器如果跑php-fpm和nginx,不跑mysql可以设置为150,8G为300以此类推


[root@bier ~]# vim/usr/local/php/etc/php-fpm.conf
pm = dynamic
pm.max_children = 150
pm.start_servers = 20



还有限制php执行时间可以在php-fpm.conf中的request_terminate_timeout设置,这是为了防止php程序的bug导致php-cgi假死。


配置完之后重启php-fpm

[root@bier ~]# /etc/init.d/php-fpm restart




3、php-fpm.conf文件设置的不是nginx的主和组


解决方案:

检查nginx是那个用户跑的

[root@bier ~]# ps aux |grep nginx


编辑php-fpm文件需要在这个php-fpm文件里面设置nginx的用户主,跟组这样才不会显示502

[root@bier ~]# vim/usr/local/php/etc/php-fpm.conf
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log =/usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/www.sock
user = php-fpm
group = php-fpm
listen.owner = nobody    //定义为nginx的所属主
listen.group = nobody    //定义为nginx的所属组




4、流量***导致(有可能完全是由于***导致,把***处理掉就正常打开了)

查看php-cgi是否在运行

有时候由于网站流量过大或者其它原因,导致php-cgi直接down掉,所以我们得看php-cgi是否在运行。执行如下命令:

ps -A | grep php5-cgi


如果没有运行,手动启动

/etc/init.d/php_cgi start


5、FastCGI执行时间过长

根据实际情况调高以下参数值

fastcgi_connect_timeout 200;
fastcgi_send_timeout 200;
fastcgi_read_timeout 200;




6、除了上面的几种情况还有其他的原因,但很少有,也可以借助nginx的错误日志来进行排查

vim /usr/local/nginx/logs/nginx_error.log  这个也是最直观的可以找到一些错误的信息。