转载别人的,写的确实很直白明了,学习巩固了!很多人都是知其人不知所以然
nginx5xx系列状态码详解
一.502 - Bad Gateway fpm
官方解释:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
上面说到nginx收到了无法理解的响应,什么是无法理解的响应呢?
nginx无法与php-fpm进行连接。
nginx在连接php-fpm一段时间后发现与php-fpm的连接被断开。
那么什么时候会出现上面的情况呢?
php-fpm没有启动,nginx无法将请求交给php-fpm
php-fpm运行脚本超时,php-fpm终止了脚本的执行和执行脚本的Worker进程,nginx发现自己与php-fpm的连接断开
白语:
进程挂掉或者后端程序过长时间未返回。
nginx 在这里充当的是反向代理服务器的角色,是把 http 协议请求转成 fastcgi 协议的请求,通过 fastcgi_pass 指令传递给 php-fpm 进程,当 php-fpm 进程响应的内容是 nginx 无法理解的响应,就会返回 502 bad gateway。
二.503 - Service Unavailable
解释:服务临时不可用。
问题原因:
nginx配置了频率限制,client端又超过了配置的限制,比如单个ip并发设置过小。
白语:
服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。(服务不可用)。一个 http 请求占用一个 php-fpm 进程,瞬时请求量过大时,没有足够的 php-fpm 进程去处理请求,就会返回 503 service unavailable。
或者,nginx 配置了频率限制,而 client 端又超过了配置的限制后就会收到 503 的响应。
三.504 Gateway Time-out
504 即 nginx 超过了自己设置的超时时间,不等待 php-fpm 的返回结果,直接给客户端返回 504 错误。但是此时 php-fpm 依然还在处理请求(在没有超出自己的超时时间的情况下)
网关超时,客户端所发出的请求没有到达网关,在限定时间内没有得到php-fpm,或者完成php-fpm的传输数据的工作而超时 。比方说:即nginx的worker去php-fpm进程池去处理,但是没有fpm进程可以使用了,等啊等,还是没有,返回504。
白语:
nginx 的 fastcgi 模块有一个 fastcgi_read_timeout 配置,它表示从 FastCGI server 获取数据的超时时间。如果超过这个配置,客户端就是收到 504 的响应。
可以理解为,单个 php-fpm 进程阻塞超过 nginx 的时间阈值返回 504 gateway timeout。
四.502 、 504的区别
502、504问题出现的可能性,一般是web服务器故障、程序进程不够。
a、使用nginx代理,而后端服务器发生故障;或者php-cgi进程数不够用;php执行时间长,或者是php-cgi进程死掉;已经fastCGI使用情况等都会导致502、504错误。
b、502 是指请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm进程终止。一般来说,与php-fpm.conf的设置有关,也与php的执行程序性能有关,网站的访问量大,而php-cgi的进程数偏少。针对这种情况的502错误,只需增加php-fpm的进程数。具体就是修改/usr/local/php/etc/php-fpm.conf文件,将其中的max_children值适当增加。这个数据要依据你的服务器的配置进行设置。一般一个php-cgi进程占20M内存,你可以自己计算下,适量增多。然后php-fpm然后重启一下.
c、504 表示超时,也就是客户端所发出的请求没有到达网关,请求没有到可以执行的php-fpm。与nginx.conf的配置也有关系。
通俗的来说,nginx作为一个代理服务器,将请求转发到其他服务器或者php-cgi来处理,当nginx收到了无法理解的响应时,就返回502。当nginx超过自己配置的超时时间还没有收到请求时,就返回504错误。
五.总结及其他nginx错误编号
500:大多是代码问题,或者sql报错。
501:服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
505:服务器不支持请求中所用的 HTTP 协议版本。(HTTP 版本不受支持)