调试功能
5xx
响应状态码#
500、502、503 等类似的 5xx
状态码,是由于服务器错误而响应的状态码,当一个请求出现 5xx
状态码时;它可能来源于 APISIX
或 Upstream
。如何识别这些响应状态码的来源,是一件很有意义的事,它能够快速的帮助我们确定问题的所在。(当修改 conf/config.yaml
的配置 show_upstream_status_in_response_header
为 true
时,会返回所有上游状态码,不仅仅是 5xx
状态。)
5xx
响应状态码的来源#
如何识别 在请求的响应头中,通过 X-APISIX-Upstream-Status
这个响应头,我们可以有效的识别 5xx
状态码的来源。当 5xx
状态码来源于 Upstream
时,在响应头中可以看到 X-APISIX-Upstream-Status
这个响应头,并且这个响应头的值为响应的状态码。当 5xx
状态码来源于 APISIX
时,响应头中没有 X-APISIX-Upstream-Status
的响应头信息。也就是只有 5xx
状态码来源于 Upstream
时,才会有 X-APISIX-Upstream-Status
响应头。
#
示例示例 1:502
响应状态码来源于 Upstream
(IP 地址不可用)
note
您可以这样从 config.yaml
中获取 admin_key
并存入环境变量:
admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')
$ curl http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $admin_key" -X PUT -d '
{
"methods": ["GET"],
"upstream": {
"nodes": {
"127.0.0.1:1": 1
},
"type": "roundrobin"
},
"uri": "/hello"
}'
测试:
$ curl http://127.0.0.1:9080/hello -v
......
< HTTP/1.1 502 Bad Gateway
< Date: Wed, 25 Nov 2020 14:40:22 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 154
< Connection: keep-alive
< Server: APISIX/2.0
< X-APISIX-Upstream-Status: 502
<
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>openresty</center>
</body>
</html>
具有 X-APISIX-Upstream-Status: 502
的响应头。
示例 2:502
响应状态码来源于 APISIX
$ curl http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $admin_key" -X PUT -d '
{
"plugins": {
"fault-injection": {
"abort": {
"http_status": 500,
"body": "Fault Injection!\n"
}
}
},
"uri": "/hello"
}'
测试:
$ curl http://127.0.0.1:9080/hello -v
......
< HTTP/1.1 500 Internal Server Error
< Date: Wed, 25 Nov 2020 14:50:20 GMT
< Content-Type: text/plain; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Server: APISIX/2.0
<
Fault Injection!
没有 X-APISIX-Upstream-Status
的响应头。
示例 3:Upstream
具有多节点,并且所有节点不可用
$ curl http://127.0.0.1:9180/apisix/admin/upstreams/1 -H "X-API-KEY: $admin_key" -X PUT -d '
{
"nodes": {
"127.0.0.3:1": 1,
"127.0.0.2:1": 1,
"127.0.0.1:1": 1
},
"retries": 2,
"type": "roundrobin"
}'
$ curl http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $admin_key" -X PUT -d '
{
"uri": "/hello",
"upstream_id": "1"
}'
测试:
$ curl http://127.0.0.1:9080/hello -v
< HTTP/1.1 502 Bad Gateway
< Date: Wed, 25 Nov 2020 15:07:34 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 154
< Connection: keep-alive
< Server: APISIX/2.0
< X-APISIX-Upstream-Status: 502, 502, 502
<
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>openresty</center>
</body>
</html>
具有 X-APISIX-Upstream-Status: 502, 502, 502
的响应头。