[实践OK]一边制造,一边讲解http状态码502|504|499|500

jackxiang 2018-12-1 00:02 | |
实践来自:https://mp.weixin.qq.com/s/TFRv2wfaNpje_5rrELBEgA

定义
==============================================================================================
502,Bad Gateway,网关错误,它往往表示网关从上游服务器中接收到的响应是无效的,主要是PHP执行时间大于PHP超时,于是给Nginx返回为空引起的。
502并不是指网关本身出了问题,而是
1)从上游接收响应出了问题,比如由于上游服务自身超时导致不能产生响应数据,
2)或者上游不按照协议约定来返回数据导致网关不能正常解析。


情况1:关掉PHP-FPM进程:
"123.115.119.90" "up.levoo.com" "-" "[30/Nov/2018:22:51:52 +0800]" "GET /hello.php HTTP/1.1" "502" "552" "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" "0.000" "0.000"
2018/11/30 22:51:52 [crit] 29084#0: *124 connect() to unix:/dev/shm/php-fcgi.sock failed (2: No such file or directory) while connecting to upstream, client: 123.115.119.90, server: up.levoo.com, request: "GET /hello.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "up.levoo.com"

情况2:

php-fpm.conf配置:

request_terminate_timeout=5
nginx配置:
fastcgi_read_timeout 10;

php-fpm.conf设置的最大执行时间是5s,但是php脚本需要的执行时间大于7s,所以php-fpm进程执行5s时就回退出,此时php脚本没有正常执行完,返回给网关Nginx的数据为空,于是导致502。
502日志:
"123.115.119.90" "up.levoo.com" "-" "[30/Nov/2018:22:53:14 +0800]" "GET /hello.php HTTP/1.1" "502" "552" "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" "5.287" "5.288"
2018/11/30 22:53:14 [error] 29084#0: *188 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 123.115.119.90, server: up.levoo.com, request: "GET /hello.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:", host: "up.levoo.com"

在实际的实践中发现当在EasySwoole里传大于设置的图片也会出现 Nginx的代理机上出现104: Connection reset by peer的情况。

==============================================================================================

504:nginx则以为上游php-fpm没有按照设置时间超过Nginx的等待时间,返回响应数据就会返回504。
504,Gateway Timeout,网关超时。

它表示网关没有从上游及时获取响应数据。注意它和502在超时场景下的区别,502是指上游php-fpm因为超过自身允许的执行时间而不能正常生成响应数据,而504是指在php-fpm还未执行完成的某一时刻,由于超过了nginx自身的超时时间,nginx则以为上游php-fpm没有按照设置时间返回响应数据就会返回504, 此时对于php-fpm而言还会继续执行下去,直到执行完成。

<?php

sleep(7);

echo 'hello world';

error_log("hello", 3, "/tmp/hello.log");

?>

vi php-fpm.d/www.conf
request_terminate_timeout = 30s

vi nginx.conf
fastcgi_read_timeout         5s;


504 Gateway Time-out
nginx

"123.115.119.90" "up.levoo.com" "-" "[30/Nov/2018:23:52:04 +0800]" "GET /hello.php HTTP/1.1" "504" "562" "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" "5.005" "5.005"
2018/11/30 23:52:0


==============================================================================================
499, Client Closed Request, 客户端主动断开连接。
是指一次http请求在客户端指定的时间内没有返回响应,此时,客户端会主动断开连接,此时表象为客户端无响应返回,而nginx的日志中会status code 为499。

此状态码在浏览器请求时几乎不可见,因为浏览器默认的超时时间会很长。多见于服务之间的调用,在业务架构中常常会分层设计,拆分为不同的子系统或者微服务,这样系统之间就会常常通过http方式来请求,并且会设置每次请求的超时时间,当请求在请求时间内所调用的上游服务无返回,则会主动关闭连接,上游服务日志中会记录一条499。

php代码

<?php

sleep(7);

echo 'hello world';

error_log("hello", 3, "/tmp/hello.log");

?>
php-fpm.conf配置:

request_terminate_timeout=30
nginx配置:

fastcgi_read_timeout 5;
我们在linux终端使用curl命令来请求,-m 表示超时时间,单位为秒

curl -i -m 3 http://127.0.0.1/hello.php
返回为:

curl: (28) Operation timed out after 3004 milliseconds with 0 bytes received
nginx的access日志的code为499,如下:

"HEAD /hello.php HTTP/1.1" 499 0


#curl -I -m 3 http://up.levoo.com/hello.php
curl: (28) Operation timed out after 3022 milliseconds with 0 bytes received
Nginx日志:
"47.94.88.237" "up.levoo.com" "-" "[30/Nov/2018:23:55:38 +0800]" "GET /hello.php HTTP/1.1" "499" "0" "-" "curl/7.55.1" "2.888" "-"

==============================================================================================
500
500, Internal Server Error , 服务器内部错误,服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。

日常开发中500错误几乎都是由于php脚本语法出现错误导致php-fpm无法正常执行。

复现路径
php代码:

<?php
echo 'hello '
echo ' world';
?>
由于php代码语法错误,php-fpm执行失败,然后告诉nginx这一结果,nginx则返回500。
该网页无法正常运作 up.levoo.com 目前无法处理此请求。
HTTP ERROR 500

Nginx错误日志:
"123.115.119.90" "up.levoo.com" "-" "[30/Nov/2018:23:57:42 +0800]" "GET /hello.php HTTP/1.1" "500" "5" "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" "0.022" "0.022"

php错误日志:
hello.php on line 3

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/9967/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2019-9-6 16:36
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]