第一种原因:

在php.ini里,eaccelerator配置项一定要放在Zend Optimizer配置之前,否则也可能引起502 Bad Gateway。php一些模块之间也可能会造成502,如Zend GuardLoader与Opcache,ioncube与Zend GuardLoader等,一般可以通过注释掉一个然后重启php-fpm,然后看是否还502进行排除。

 

第二种原因:

可能因为php-cgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加,如果php已升级到5.3.*以上且使用的是dynamic模式,需要调整pm.min_spare_servers和pm.max_spare_servers的值适当增加。最大值可以按内存nMB/2/20 的整数来算,最小值可以按nMB/2/40 的整数来算,具体可以自己调整运行看看,同时pm.max_children也调整为和pm.max_spare_servers的值一样。

另外也有可能是max_requests值不够用。

 

第三种原因:

php执行超时,修改/usr/local/php/etc/php.ini 将max_execution_time 改为300 或直接改成0 不限制,同时还需要修改/usr/local/php/etc/php-fpm.conf 调整request_terminate_timeout的值
再/etc/init.d/php-fpm restart重启使其生效。

 

第四种原因:

磁盘空间不足,如服务日志占用大量空间清理一下磁盘上的文件,有部分剩余空间,重启即可恢复。

 

第五种原因:

查看php-cgi或php-fpm进程是否在运行,通过ps aux | grep php-fpm 或者 netstat -tnlp | grep 9000

 

第六种原因:

调大一点 nginx.conf 里的三个参数:
fastcgi_connect_timeout
fastcgi_send_timeout
fastcgi_read_timeout

 

第七种原因:

php-cgi子进程打开文件描述符数量超过限制,可通过php-fpm.log进行印证猜测

解决方法:

打开php-fpm.conf 找到 rlimit_files 改成:65535

编辑 /etc/security/limits.conf 加上:
* soft nofile 65535
* hard nofile 65535
编辑/etc/sysctl.conf  底部添加fs.file-max=65535
再 echo "ulimit -SHn 65535" >> /etc/rc.local

 

第八种原因:

有时候unix套接字模式下可能会502,可以尝试改成tcp/ip的方式 php 5.3及以上版本listen = /tmp/php-cgi.sock替换为listen = 127.0.0.1:9000,nginx配置文件及虚拟主机配置文件里fastcgi_pass unix:/tmp/php-cgi.sock; 替换为fastcgi_pass 127.0.0.1:9000; 之后重启试试。

 

其他检查手段:

一、php-cgi慢请求导致

编辑/usr/local/php/etc/php-fpm.conf 开启slowlog 慢日志
里面有个request_slowlog_timeout参数,后面设置多少秒就是执行超过设置时间的就会被记录下来
日志一般在/usr/local/php/var/log/slow.log,这个配置文件里都有具体的设置选项

二、php-cgi占用内存资源超过php-fpm配置,导致进程被异常终止

三、php-cgi占用CPU资源过大,进程被linux系统oom killer机制杀死

sudo tail -n 100 /var/log/messages