关于nginx bad 502 的分析以及定位

最近在做项目的过程中,经常出现502bad gateaway.上网总结了一下,发现两次发生的原因还不一样。

一般情况下有以下几种原因会出现502.

1.请求并发数很大,phpfastcgi进程数不够用。因为cgi是单线程多进程工作的,也就是说cgi处理完一个页面后继续处理下一个页面。如果进程数不够,cgi按排队处理之前的请求,队列满之后的请求只有被放弃。这个时候nginx就会不断的出现502的错误。

2、PHPFastcgi内存不够用。

当请求的页面为纯静态页面时,这个问题一般不会出现。因为nginx不需要走php解析直接返回页面。如果网页需要处理大量php数据的话,给的内存不足。就会报502的错误。比如今天我做的是一次性需要导出3万多条的功能,后来设置ini_set('memory_limit', '64M')    改问题解决。

针对以上情况作出的解决方法:

1.查看当前跑的php-fpm数量是否超过当前php-fpm配置的数量。

2.部分php执行的时间超过了nginx等待的时间。这个网上一般建议去调nginx的等待时间,fastcgi_connect_timeout 300;  fastcgi_send_timeout 300;  fastcgi_read_timeout 300什么的。个人感觉不是很推荐。http协议自身就是握手再断开,如果很耗费时间的需求可以做成异步的。

3.max-children和max-request

原来,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 或者一个比较大的值。

php的超时时间max_execution_time设为300。

如果你的服务器性能足够好,且宽带资源足够充足,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左右。

转载于:https://my.oschina.net/u/1414906/blog/417905

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值