深挖 502 和 504
引言
平时我们访问网站,或者在工作中请求一些接口,或者线上服务报警,经常会看见502和504这两个状态码。如果是运维同学收到502或504的问题反馈,通常第一件事就是重启服务,往往就好了,重启大法无敌,哈哈哈。本文就了解一下什么情况下会出现这两种状态码以及这遇到这两种状态码的情况下如何解决
502和504的含义
502 Bad Gateway
字面意思就是网关错误。比较官方的说法是,作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应
504 Gateway Time-out
字面意思是网关超时。官方说法,作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应
上边的解释都比较的抽象,下边通过具体实例来说明导致这两种状态的原因,从而深入理解这两个状态码的含义
导致502和504的原因
502 Bad Gateway
首先,我们都知道5开头的状态码为服务器端为问题。生活中我们会遇见这样的情况,我们在春节抢票的时候,发现出现了502,或者某个明星上热搜,某博出现了502的情况。通俗点来说,这个其实就是因为网站突然一下子有大量的请求进来,对方的服务器无法及时处理,就导致了502
那从专业上来说,当网页上有一个请求过来,nginx将请求交给php-fpm去处理,这个时候由于某些原因,请求还没执行完毕,处理这个请求的进程终止了
这种情况其实是和php-fpm的配置有关的,主要注意下边三个配置:
php.ini中的maxexecutiontime
上边的意思大概是,这个参数设置了允许脚本在解析器终止之前运行的最长时间(以秒为单位)。这有助于防止编写不正确的脚本占用服务器资源,默认设置为30。从命令行运行PHP时,默认设置为0。所以当请求超过30s没有结果,就被终止了,我们就会收到502的错误
php-fpm.conf中的requestterminatetimeout
上边是php-fpm.conf配置文件中,该配置的注释,大致意思是:
requestterminatetimeout适用于,当maxexecutiontime由于某种原因无法终止脚本的时候,php-fpm会把这个请求干掉
php-fpm.conf中的max_children
这个配置的含义在之前的文章中也有解释(全面了解CGI、FastCGI、PHP-FPM),它表示可以同时存活的子进程的最大数量。当在一个时间段内有大量的请求进来,导致达到了php-fpm最大响应数量,那么后续的请求就会出现502的情况。这里可以使用下边这个命令查看当前的连接数
上边我们说到,一遇到这种情况,运维同学做的事情就是重启,当重启php-fpm之后,php-fpm会释放资源,但是不到三分钟,发现又出现了502的情况,这种情况下,一般需要查看一下数据库是否有大量的locked的进程,也就是数据库死锁导致超时,此时需要重启数据库或者杀死死锁的SQL进程
504 Gateway Time-out
504一般都是和nginx的配置有关。比如nginx设置了超时时间,当在超时时间内,nginx没有收到php-fpm的响应,它就会给客户端返回504。当fastcgi的缓冲区太小,导致fastcgi进程被挂起,也会演变成504错误
主要涉及到nginx中的一下几个配置参数:
版权声明: 本文为 InfoQ 作者【书旅】的原创文章。
原文链接:【http://xie.infoq.cn/article/8e6a2f65d8c7f7aa73b3577e9】。文章转载请联系作者。
评论