[alibaba/tengine]tengine2.2.0--proxy_upstream_tries 与官方的proxy_next_upstream_tries重叠

2024-07-10 349 views
5

后端服务器设置了3个server且设置proxy_next_upstream 504。

  1. 当只设置的是proxy_upstream_tries 2,则后端两台发送504,则在前端nginx的upstream_status是502,502。没有正确返回最后server的响应码
  2. 当只设置的是proxy_next_upstream_tries 2,则后端两台发送504,则在前端nginx的upstream_status是502,504。
  3. 同时设置proxy_upstream_tries 2和proxy_next_upstream_tries 2,与只设置proxy_next_upstream_tries 2情况一样

看了下debug日志,ngx_peer_connection_t里的tries不同,proxy_upstream_tries的情况是3,proxy_next_upstream_tries是2.

问题:

是否应该取消proxy_upstream_tries? 为什么第一个upstream_status都是502,C语言不怎么懂找了一圈ngx_http_upstream.c没有找到,关键代码段

回答

5

proxy_upstream_tries这个功能是

"Tengine has many useful features before Nginx"

的典型例子之一,proxy_next_upstream_tries的实现和其基本一致,所以其实它们不算功能重叠,只是同一个功能的官方和非官方配置指令,后面我们会考虑是否在这种情况下尽量和官方保持一致,thks to @wu0407

该指令的代码在

配置见:src/http/modules/ngx_http_proxy_module.c
实现见:src/http/ngx_http_upstream.c -> ngx_http_upstream_next()

static void
ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u,
    ngx_uint_t ft_type)
{
    ...

    switch (ft_type) {

    case NGX_HTTP_UPSTREAM_FT_TIMEOUT:
        status = NGX_HTTP_GATEWAY_TIME_OUT;
        break;

    case NGX_HTTP_UPSTREAM_FT_HTTP_500:
        status = NGX_HTTP_INTERNAL_SERVER_ERROR;
        break;

    case NGX_HTTP_UPSTREAM_FT_HTTP_403:
        status = NGX_HTTP_FORBIDDEN;
        break;

    case NGX_HTTP_UPSTREAM_FT_HTTP_404:
        status = NGX_HTTP_NOT_FOUND;
        break;

    /*
     * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING
     * never reach here
     */

    default:
        status = NGX_HTTP_BAD_GATEWAY;
     }
     ...
}

状态码可参考见如上代码

0

ok, thanks