PHP 502bad gateway原因及解决方案
nginx+php出现502badgateway,一般这都不是nginx的问题,而是由于fastcgi或者php的问题导致的,常见的有以下几种。
1.php.ini的memory_limit过小(如果有个别php程序进程需要占用极大内存时这个必须注意)
2.php-fpm.conf中max_children或者max_requests设置不合理(设置过小会因为没有足够的cgi进程处理请求,设置过大会出现一会儿有响应正常,一会儿等很久才有响应的情况,一般情况下children按照内存计算,比如说1G设置64,2G128。这个根据实际情况自行调整。另外查看当前的PHPFastCGI进程数是否够用的命令为:netstat-anpo|grep“php-cgi”|wc-l如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。)
3.查看nginx错误日志,发现pstreamsenttoobigheaderwhilereadingresponseheaderfromupstream,则检查clientheadbuffer,fastcgibuffersize是否过小,可设置为32K。
4.php程序执行时间过长而超时,检查nginx和fastcgi中各种timeout设置。(nginx中的fastcgi_connect_timeout300;fastcgi_send_timeout300:fastcgi_read_timeout300;keepalive_timeout;php-fpm中的request_terminate_timeout,php.ini中的max_execution_time)
5.php-fpm有一个参数max_requests,该参数指明了每个children最多处理多少个请求后便会被关闭。在大量处理请求下,如果该值设置过小会导致children频繁的自杀和建立而浪费大量时间,若所有的children差不多都在这个时候自杀,则重建前将没有children响应请求,于是出现502。可以将该值设置大一些或者是0[无限]。
以上差不多是比较常见的502的问题原因以及解决办法,其实解决问题的最好的方式还是自己去看nginx和fastcgi的errorlog。
最后借用网上的万金油说法做个总结:php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。
502错误是所有用nginx跑php的运维人员不愿意看见的
nginx出现502有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端php-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题导致不能正确解析php代码,最终返回给了客户端502错误。
服务器出现502的原因是连接超时我们向服务器发送请求由于服务器当前链接太多,导致服务器方面无法给于正常的响应,产生此类报错
因此如果你服务器并发量非常大,那只能先增加机器,然后按以下方式优化会取得更好效果;但如果你并发不大却出现502,一般都可以归结为配置问题,脚本超时问题。
1.php-fpm进程数不够用
使用netstat-napo|grep"php-fpm"|wc-l查看一下当前fastcgi进程个数,如果个数接近conf里配置的上限,就需要调高进程数。
但也不能无休止调高,可以根据服务器内存情况,可以把php-fpm子进程数调到100或以上,在4G内存的服务器上200就可以。
2.调高调高linux内核打开文件数量
可以使用这些命令(必须是root帐号)
echo'ulimit-HSn65536'>>/etc/profile
echo'ulimit-HSn65536'>>/etc/rc.local
source/etc/profile
3.脚本执行时间超时
如果脚本因为某种原因长时间等待不返回,导致新来的请求不能得到处理,可以适当调小如下配置。
nginx.conf里面主要是如下
fastcgi_connect_timeout300;
fastcgi_send_timeout300;
fastcgi_read_timeout300;
php-fpm.conf里如要是如下
request_terminate_timeout=10s
4.缓存设置比较小
修改或增加配置到nginx.conf
proxy_buffer_size64k;
proxy_buffers512k;
proxy_busy_buffers_size128k;
5.recv()failed(104:Connectionresetbypeer)whilereadingresponseheaderfromupstream
可能的原因机房网络丢包或者机房有硬件防火墙禁止访问该域名
但最重要的是程序里要设置好超时,不要使用php-fpm的request_terminate_timeout,
最好设成request_terminate_timeout=0;
因为这个参数会直接杀掉php进程,然后重启php进程,这样前端nginx就会返回104:Connectionresetbypeer。这个过程是很慢,总体感觉就是网站很卡。
May0110:50:58.044162[WARNING][poolwww]child4074,script'/usr/local/nginx/html/quancha/sameip/detail.php'executiontimedout(15.129933sec),terminating
May0110:50:58.045725[WARNING][poolwww]child4074exitedonsignal15SIGTERMafter90.227060secondsfromstart
May0110:50:58.046818[NOTICE][poolwww]child4082started
说一千道一万最重要的就是程序里控制好超时,gethostbyname、curl、file_get_contents等函数的都要设置超时时间。
另一个就是多说,这个东西是增加了网站的交互性,但是使用的多了反应就慢了,如果你网站超时且使用了多说是,可以关闭它。
6、自己遇到502的解决办法:
调整增大php和Nginx的backlog数。
PHP-FPM高负载的解决办法
Postedon2011/09/02
这里只是介绍了php-fpm的优化方法的,但一般情况下和nginx组合使用的时候,单独优化其中一项的话,作用不是特别的大,同时还需要对nginx进行优化
NGINX频爆502BADGATEWAY的错误,看了网上的教程,仍没有彻底解决。
目前我总结的解决502BADGATEWAY的方式有:1.视服务器的性能,在php-fmp.conf里增加max_children的值,我目前用reload参数定时重载php-fpm。这个主要原因是php脚本执行时间过长造成的,重载php-fpm能杜绝这个问题。如何彻底解决php-cgi脚本占用大量内存从而导致502错误的产生还值得进一步探讨,目前该做法不失为一种好办法。
具体的做法是,用crontab让php-fpm平滑重启,从而不影响PHP脚本的运行。
*/10****/usr/local/php/sbin/php-fpmreload
优化设置
WhenyourunningahighloadwebsitewithPHP-FPMviaFastCGI,thefollowingtipsmaybeusefultoyou:)
如果您高负载网站使用PHP-FPM管理FastCGI,这些技巧也许对您有用:)
1.CompilePHP'smodulesaslessaspossible,thesimplethebest(fast);
1.尽量少安装PHP模块,最简单是最好(快)的
2.IncreasPHPFastCGIchildnumberto100andevenmore.Sometime,200isOK!(On4GBmemoryserver);
2.把您的PHPFastCGI子进程数调到100或以上,在4G内存的服务器上200就可以
注:我的1g测试机,开64个是最好的,建议使用压力测试获取最佳值
3.UsingSOCKETPHPFastCGI,andputinto/dev/shmonLinux;
3.使用socket连接FastCGI,linux操作系统可以放在/dev/shm中
注:在php-fpm.cnf里设置
location~.*\.(php|php5)?$
将Nginx与FastCGI的通信方式由TCP改为UnixSocket。TCP在高并发访问下比UnixSocket稳定,但UnixSocket速度要比TCP快。
fastcgi_passunix:/tmp/php-cgi.sock;
#fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
includefcgi.conf;
}
4.IncreaseLinux“maxopenfiles”,usingthefollowingcommand(mustberoot):
#echo‘ulimit-HSn65536′>>/etc/profile
#echo‘ulimit-HSn65536>>/etc/rc.local
#source/etc/profile
4.调高linux内核打开文件数量,可以使用这些命令(必须是root帐号)
echo‘ulimit-HSn65536′>>/etc/profile
echo‘ulimit-HSn65536′>>/etc/rc.local
source/etc/profile
注:我是修改/etc/rc.local,加入ulimit-SHn51200的
5.IncreasePHP-FPMopenfiledescriptionrlimit:
#vi/path/to/php-fpm.conf
Find“
1024” Change1024to4096orhighernumber.
RestartPHP-FPM.
5.增加PHP-FPM打开文件描述符的限制:
#vi/path/to/php-fpm.conf
找到
“
把1024更改为4096或者更高.
重启PHP-FPM.
6.UsingPHPcodeaccelerator,e.geAccelerator,XCache.Andset“cache_dir”to/dev/shmonLinux.
6.使用php代码加速器,例如eAccelerator,XCache.在linux平台上可以把`cache_dir`指向/dev/shm
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。