一、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_time
和php-fpm.d/www.conf
中的request_terminate_timeout
。max_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。