一些运行在Nginx上的网站有时候会呈现“502 BadGateway”错误,有些时候甚至频繁的呈现。有些站长是在方才转移到Nginx之后就呈现了这个问题,所以常常会猜疑这是不是Nginx的问题,但事实上这是个误区。
以下是从张宴和Ayou的博客汇集整理的一些Nginx 502错误的排查要领,供各人参考:
序列号 | CPU | RAM | HDD | 带宽 | 售价(美元) | 免费试用 |
---|---|---|---|---|---|---|
香港服务器1 | E5-2620 | 32G | 1T HDD | 50M/无限流量 | $196.00 | 立即申请 |
香港服务器2 | E5-2650 | 32G | 1T HDD | 50M/无限流量 | $256.00 | 立即申请 |
香港服务器3 | E5-2680 | 32G | 1T HDD | 50M/无限流量 | $316.00 | 立即申请 |
香港服务器4 | E5-2690 | 32G | 1T HDD | 50M/无限流量 | $336.00 | 立即申请 |
香港服务器5 | E5-2697 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器6 | E5-2620*2 | 32G | 1T HDD | 50M/无限流量 | $376.00 | 立即申请 |
香港服务器7 | E5-2650*2 | 32G | 1T HDD | 50M/无限流量 | $436.00 | 立即申请 |
香港服务器8 | E5-2680*2 | 32G | 1T HDD | 50M/无限流量 | $476.00 | 立即申请 |
香港服务器9 | E5-2690*2 | 32G | 1T HDD | 50M/无限流量 | $556.00 | 立即申请 |
香港服务器10 | E5-2697*2 | 32G | 1T HDD | 50M/无限流量 | $596.00 | 立即申请 |
香港服务器11 | E5-2680v4*2 | 32G | 1T HDD | 50M/无限流量 | $696.00 | 立即申请 |
香港服务器12 | E5-2698v4*2 | 32G | 1T HDD | 50M/无限流量 | $796.00 | 立即申请 |
Nginx502错误的原因较量多,是因为在署理模式下后端处事器呈现问题引起的。这些错误一般都不是nginx自己的问题,必然要从后端找原因!但nginx把这些堕落都揽在本身身上了,着实让nginx的推广者备受置疑,究竟从字眼上领略,badgateway?不就是badnginx吗?让不相识的人看到,会直接把责任推在nginx身上,但愿nginx下一个版本会把堕落提示写稍微友好一些,至少不会是此刻简朴的一句502Bad Gateway,别的还不忘附上本身的台甫。
Nginx 502的触发条件
502错误最凡是的呈现环境就是后端主机当机。在upstream设置里有这么一项设置:proxy_next_upstream,这个设置指定了nginx在从一个后端主机取数据碰着何种错误时会转到下一个后端主机,里头写上的就是会呈现502的所有环境拉,默认是errortimeout。error就是当机、断线之类的,timeout就是读取堵塞超时,较量容易领略。我一般是全写上的:
proxy_next_upstreamerrortimeoutinvalid_headerhttp_500http_503;
不外此刻大概我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp堕落的话,原来会打印一堆stacktrace的错误信息,此刻被502代替了。但公司的措施员可不这么认为,他们认定是nginx呈现了错误,我实在没空跟他们表明502的道理了……
503错误就可以保存,因为后端凡是是apacheresin,假如apache死机就是error,但resin死机,仅仅是503,所以照旧有须要保存的。
办理步伐
碰着502问题,可以优先思量凭据以下两个步调去办理。
1、查察当前的PHP FastCGI历程数是否够用:
netstat-anpo|grep"php-cgi"|wc-l
假如实际利用的“FastCGI历程数”靠近预设的“FastCGI历程数”,那么,说明“FastCGI历程数”不足用,需要增大。
2、部门PHP措施的执行时间高出了Nginx的期待时间,可以适当增加nginx.conf设置文件中FastCGI的timeout时间,譬喻:
......http{......fastcgi_connect_timeout300;fastcgi_send_timeout300;fastcgi_read_timeout300;......}......
php.ini中memory_limit设低了会堕落,修改了php.ini的memory_limit为64M,重启nginx,发明好了,本来是PHP的内存不敷了。
假如这样修改了还办理不了问题,可以参考下面这些方案:
一、max-children和max-requests
一台处事器上运行着nginx php(fpm) xcache,会见量日均 300W pv阁下
最近常常会呈现这样的环境:php页面打开很慢,cpu利用率溘然降至很低,系统负载溘然升至很高,查察网卡的流量,也会发明溘然降到了很低。这种环境只一连数秒钟就规复了
查抄php-fpm的日志文件发明白一些线索
Sep3008:32:23.289973[NOTICE]fpm_unix_init_main(),line271:getrlimit(nofile):max:51200,cur:51200Sep3008:32:23.290212[NOTICE]fpm_sockets_init_main(),line371:usinginheritedsocketfd=10,“127.0.0.1:9000″Sep3008:32:23.290342[NOTICE]fpm_event_init_main(),line109:libevent:usingepollSep3008:32:23.296426[NOTICE]fpm_init(),line47:fpmisrunning,pid30587
在这几句的前面,是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