proxy_next_upstream 和 get_last_failure 的关系
proxy_next_upstream
用来指定什么情况需要做重试的操作。
default: proxy_next_upstream error timeout;
默认情况,出现了 error 或者 timeout 的情况触发重试。
invalid_header : 服务器返回了空或者无效的响应
http_500 503 503 504 403 404 429 : 返回指定代码时的响应
non_idempotent: 对非幂等情况也会重试,如果需要对 POST 等请求重试,需要加上。
get_last_failure
openresty 的 balancer.get_last_failure 函数,用来获取上一次请求的结果。
当 next_upstream 重试起作用时,检索上一次失败的详细信息。 当上一次失败时,它返回一个描述该尝试的字符串,以及描述该尝试状态码。
返回值: state_name,state_code
stage_name可能会有
- next: 由于后端服务器发送的错误状态码而失败,源端的响应市相同的,这意味着后端连接还可以重复使用。
- failed: 与后端服务器通信出现错误。这种情况下,后端连接不能被重用。
当 proxy_next_upstream 配置不同的值, get_last_failure 返回什么?
直接指向错误的ip,返回 502 。
1
state_code=502 state_name=failed
让服务端主动返回502。未进行重试
配置 proxy_next_upstream error timeout http_502 http_404 non_idempotent;
1
2state_code = 502 state_name = failed
state_code = 404 state_name = next把所有支持的都配置上。
proxy_next_upstream error timeout http_502 http_500 http_503 http_504 http_403 http_404 http_429 non_idempotent;
1 | state_code = 502 state_name = failed |
结论
服务端错误会返回 failed。当服务端主动返回对应 code 时,如果配置了对应code 的重试, 403 404 返回 next ,5xx 和 429 返回 failed。 在 lua 进行转发时对这两种情况都需要做下一步的尝试。
proxy_next_upstream 和 get_last_failure 的关系
https://beixiu.net/openresty-proxy-next-upstream-and-get-last-failure-relationship/