http申请流程:失常状况下,提交消息申请的时刻,nginx会间接把申请转交给php-fpm,而php-fpm再调配php-cgi进程来解决相干的申请,以后再顺序返回,最后由nginx把效果反应给客户端浏览器。
Nginx502BadGateway同伴是FastCGI有问题
解决设施
遇到502问题,能够优先思考遵循下列两个步调去解决。
一、检察以后的PHPFastCGI进程数是否够用(max_children值)
netstat -anpo | grep "php-cgi"| wc -l
如果实践应用的“FastCGI进程数”亲近预设的“FastCGI进程数”,那末,说明“FastCGI进程数”不足用,需要增年夜。
二、整体PHP程序的实行时日高出了Nginx的等待时日(php内存有余)
增加nginx.conf配置文件中FastCGI的timeout时日,比方:
fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;
php.ini中的memory_limit=64M,重启nginx。
如果如许修改了还解决不了问题,能够参考下面这些计划:
三、max-children以及max-requests
一台效劳器上运行着nginxphp(fpm)xcache,访问量日均300Wpv左右
最近经常会浮现如许的状况:php页面关上很慢,cpu应用率突然降至很低,系统负载突然升至很高,检察网卡的流量,也会发明突然降到了很低。这种状况只连续数秒钟就复原了
检察php-fpm的日志文件发明了一些线索:
Sep3008:32:23.289973[NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200,cur:51200Sep3008:32:23.290212[NOTICE] fpm_sockets_init_main(), line 371:using inherited socket fd=10,“127.0.0.1:9000″Sep3008:32:23.290342[NOTICE] fpm_event_init_main(), line 109: libevent:using epollSep3008:32:23.296426[NOTICE] fpm_init(), line 47: fpm is running, pid 30587
在这多少句的前面,是1000多行的敞开children以及开启children的日志
本来,php-fpm有一个参数max_requests,该参数指清晰,每一个children至多解决多少个申请后便会被敞开,默认的配置是500。因为php是把申请轮询给每一个children,在年夜流量下,每一个childre到达max_requests所用的时日都差未多少,如许就形成所有的children基础上在统临时日被敞开。
在这时代,nginx无奈将php文件转交给php-fpm解决,以是cpu会降至很低(不用处理php,更不用实行sql),而负载会升至很高(敞开以及开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无奈天生数据传输给客户端)
增加children的数目,而且将max_requests配置未0或者一个对于比年夜的值:
关上/usr/local/php/etc/php-fpm.conf
调年夜下列两个参数(依据效劳器实践状况,过年夜也不可)
5120600
而后重启php-fpm。
五、增加缓冲区容量巨细
将nginx的errorlog关上,发明“pstreamsenttoobigheaderwhilereadingresponseheaderfromupstream”如许的同伴提醒。查阅了一下资料,年夜意是nginx缓冲区有一个bug形成的,咱们网站的页面消耗占用缓冲区能够过年夜。参考老外写的修改设施增加了缓冲区容量巨细配置,502问题齐全解决。起初系统治理员又对于参数做了调解只生存了2个配置参数:clientheadbuffer,fastcgibuffersize。
六、request_terminate_timeout
如果首如果在一些post或者数据库操纵的时刻浮现502这种状况,而不是在动态页面操纵中罕见,那末能够检察一下php-fpm.conf配置中的一项:request_terminate_timeout
这个值是max_execution_time,便是fast-cgi的实行剧本时日。
0s为敞开,便是有限实行上来。(当时装的时刻没仔细看就改了一个数字)
优化fastcgi中,还能够改改这个值5s看看效果。
php-cgi进程数不足用、php实行时日长、或者是php-cgi进程去世失落,都会浮现502同伴。
扩年夜知识:
Nginx502BadGateway的含意是申请的PHP-CGI已经实行,然而因为某种原因(失常是读取资本的问题)不实行完毕而以致PHP-CGI进程停止,失常来说Nginx502BadGateway以及php-fpm.conf的配置无关。
php-fpm.conf有两个相当主要的参数,一个是max_children,另一个是request_terminate_timeout,然而这个值不是通用的,而是需要自身盘算的。在布置好应用进程中浮现502问题,失常是因为默认php-cgi进程是5个,能够因为php-cgi进程不足用而形成502,需要修改/usr/local/php/etc/php-fpm.conf将其中的max_children值适量增加。
盘算的形式下列:
如果你的效劳器性能充足好,且宽带资本充足充足,PHP剧本不系循环或者BUG的话你能够间接将request_terminate_timeout配置成0s。0s的含意是让PHP-CGI一直实行上来而没偶然日限制。而如果你做不到这一点,也就是说你的PHP-CGI能够浮现某个BUG,或者你的宽带不足充足或者其余的原因以致你的PHP-CGI假去世那末就发起你给request_terminate_timeout赋一个值,这个值能够依据效劳器的性能停止设定。失常来说性能越好你能够配置越高,20分钟-30分钟都能够。而max_children这个值又是怎么盘算进去的呢?这个值准则上是越年夜越好,php-cgi的进程多了就会解决的很快,排队的申请就会很少。配置max_children也需要依据效劳器的性能停止设定,失常来说一台效劳器失常状况下每一个php-cgi所消耗的内存在20M左右。
遵循民间的谜底,排查了相干的能够,并联合了网友的谜底,患上出了下面的解决设施。
一、检察phpfastcgi的进程数(max_children值)
netstat -anpo | grep “php-cgi” | wc -l
5(倘若显示5)
二、检察当退却程
top考察fastcgi进程数,倘若应用的进程数即是或者高于5个,说明需要增加(依据你机器实践状态而定)
三、调解/usr/local/php/etc/php-fpm.conf的相干配置
1060s
本文链接:https://addon.ciliseo.com/fu-wu-qi-nginx-bao-cuo-502-jie-jue-fang-fa-fen-xiang.html
网友评论