模拟502和504

一、504 Gateway Timeout

官方解释:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。
通俗地讲:在LNMP中,nginx没及时从php-fpm那里收到信息返回。我nginx等你php-fpm太久了你不回复我,我就告诉浏览器504。

这个模拟起来也很简单,设定fastcgi_read_timeout参数。
例: 设定5s超时后,重加载nginx配置,php脚本 sleep(6) 测试。

server {
	...
	fastcgi_read_timeout 	5; 
}
二、502 Bad Gateway

官方解释:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
通俗地讲:在LNMP中,nginx没在php-fpm那里得到有效响应。常见可能有两种情况,一是php-fpm没启动,二是phpcgi执行脚本超时,php-fpm将进程杀掉。(另外php-fpm每个进程在接受一定请求数后会重启防止内存泄漏会引起间歇性502)

第一种,直接关闭php-fpm即可出现502。

第二种设定超时时间,涉及两个参数,分别是php.ini中的max_execution_timephp-fpm.d/www.conf中的request_terminate_timeoutmax_execution_time是脚本执行时间,超过脚本执行时间后,会报错。request_terminate_timeout是请求超时时间,默认被注释掉,使用max_execution_time的时间。

(1) 首先我们测试脚本执行超时报错。
在脚本里使用set_time_limit()函数临时修改max_execution_time参数。值得注意的是,set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间,执行之外的时间都不会计算在内,例如sleep函数,http请求等待响应的时间等。所以我们不能写sleep()这样来验证。

<?php

set_time_limit(2);

var_dump('start');

$start = time();
for($i = 0;;$i++) {
    
    
	if(time() - $start > 2) {
    
    
		break;
	}
}

var_dump('end');

此时两参数相等,会出现报错
在这里插入图片描述

(2) 然后我们修改request_terminate_timeout参数,将注释去掉,默认的0代表无限制,改为1。重启php-fpm,出现502。


总结:504是nginx的超时时间小于php-fpm的超时时间和php.ini的脚本执行时间;502是php-fpm的超时时间小于nginx的超时时间和php.ini的脚本执行时间。
思考:页面调用一个很耗时的接口以更新数据,出现504,那数据有没有被更新呢?请修改不同参数自己去测试一下吧,会印象深刻一些的。
提示:上边参数设置的太小,测试后别忘记改回来哦

猜你喜欢

转载自blog.csdn.net/z772532526/article/details/105341140
今日推荐