nginx反向代理未检测到已删除的负载均衡器

Jus*_*ony 6 nginx nginx-reverse-proxy

我们的反向代理具有以下配置:

location ~ ^/stuff/([^/]*)/stuff(.*)$ {
    set $sometoken $1;
    set $some_detokener "foo";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Authorization "Basic $do_token_decoding";
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_redirect https://place/ https://place_with_token/$1/;
    proxy_redirect http://place/ http://place_with_token/$1/;
    resolver 10.0.0.2 valid=10s;
    set $backend https://real_storage$2;
    proxy_pass $backend;
}
Run Code Online (Sandbox Code Playgroud)

现在,所有这些工作都可以进行,直到real_storage旋转服务器为止。例如,say real_storage来自foo.com。这是一个负载均衡器,可直接连接到两个服务器:1.1.1.1和1.1.1.2。现在,将1.1.1.1删除并替换为1.1.1.3。但是,nginx继续尝试1.1.1.1,导致:

epoll_wait()报告客户端过早关闭了连接,因此在连接到上游时,上游连接也关闭了,客户端:...,服务器:...,请求:“ GET ... HTTP / 1.1”,上游:“ https: // 1.1.1.1:443 / ...“,主持人:” ...“

请注意,上游是旧服务器,如先前的日志所示:

[调试] 1888#1888:* 570837连接到1.1.1.1:443,FD:60#570841

这是在我们这边还是为我们的主机配置错误的东西real_storage

*我能发现的最接近我的问题的地方是https://mailman.nginx.org/pipermail/nginx/2013-March/038119.html ...

更多详情

我们添加了 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; ,但仍然失败。我现在开始怀疑,因为它是两个ELB(我们和他们的),所以我们正在使用的解析器是问题-因为它是特定于亚马逊的(根据https://serverfault.com/a/929517/443939)。 。and amazon仍然认为它是有效的,但是它不会在外部解析(我们的服务器试图访问它们。)

我已经从一种配置中完全删除了解析器,将看到它的去向。我们无法使用内部服务器来重现此消息,因此我们必须依靠等待第三方服务器循环运行(大约每周一次)。

我不确定这个解析器是不是一个问题,仅仅是因为重新启动nginx可以解决问题并获得最新的IP对:/

是否可能必须设置没有https的dns变量?:

    set $backend real_storage$2;
    proxy_pass https://$backend;
Run Code Online (Sandbox Code Playgroud)

我知道您必须使用一个变量,否则重新解析将不会发生,但是也许很具体地说明了变量的哪一部分-正如我在查询中仅见到的那样,...但没有给出任何理由...我将其设置在第二台服务器上,看看会发生什么...

对于我的第三台服务器,我正在尝试此注释并将集合移到位置之外。当然,如果其他人有具体的想法,那么我愿意改变我的测试方法:D

set $rootbackend https://real_storage;
location ~ ^/stuff/([^/]*)/stuff(.*)$ {
    set $backend $rootbackend$2;
    proxy_pass $backend;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我必须将其设置在内部,因为它使用了动态变量。

cns*_*nst 0

在http://nginx.org/r/proxy_pass \xe2\x80\x94中使用变量没有什么特别的,任何变量的使用都会使 nginx 在每个请求上涉及解析器(如果在服务器组 \xe2\ 中找不到) x80\x94 也许你有冲突?),$backend如果你已经$2在那里使用,你甚至可以摆脱它。

\n\n

至于解释错误消息 \xe2\x80\x94,您必须弄清楚发生这种情况是否是因为现有连接被删除,或者是否是因为 nginx 仍在尝试连接到旧地址。

\n\n

您可能还想考虑降低http://nginx.org/en/docs/http/ngx_http_proxy_module.html_time中的值;它们似乎都设置为 60 秒,这对于您的用例来说可能太长:

\n\n\n\n

对于您无法重现此问题,我并不感到惊讶,因为您现有的配置似乎没有任何问题;也许这个问题在早期的修订中就已经体现出来了?

\n