5xx
响应状态码500、502、503等类似的 5xx
状态码,是由于服务器错误而响应的状态码,当一个请求出现 5xx
状态码时;它可能来源于 APISIX
或 Upstream
。如何识别这些响应状态码的来源,是一件很有意义的事,它能够快速的帮助我们确定问题的所在。
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地址不可用)
$ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -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:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -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:9080/apisix/admin/upstreams/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -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:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -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
的响应头。