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 返回什么?

  1. 直接指向错误的ip,返回 502 。

    1
    state_code=502  state_name=failed  
  2. 让服务端主动返回502。未进行重试

  3. 配置 proxy_next_upstream error timeout http_502 http_404 non_idempotent;

    1
    2
    state_code = 502   state_name = failed 
    state_code = 404 state_name = next
  4. 把所有支持的都配置上。

proxy_next_upstream error timeout http_502 http_500 http_503 http_504 http_403 http_404 http_429 non_idempotent;

1
2
3
4
5
6
state_code = 502   state_name = failed 
state_code = 503 state_name = failed
state_code = 504 state_name = failed
state_code = 403 state_name = next
state_code = 404 state_name = next
state_code = 429 state_name = failed

结论

服务端错误会返回 failed。当服务端主动返回对应 code 时,如果配置了对应code 的重试, 403 404 返回 next ,5xx 和 429 返回 failed。 在 lua 进行转发时对这两种情况都需要做下一步的尝试。

作者

张巍

发布于

2023-06-17

更新于

2023-06-17

许可协议

评论