gpt4 book ai didi

nginx 反向代理未检测到负载均衡器丢失

转载 作者:行者123 更新时间:2023-12-02 17:19:16 29 4
gpt4 key购买 nike

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

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;
}

现在,所有这些都有效......直到real_storage轮换服务器。例如,假设 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() reported that client prematurely closed connection, so upstream connection is closed too while connecting to upstream, client: ..., server: ..., request: "GET ... HTTP/1.1", upstream: "https://1.1.1.1:443/...", host: "..."

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

[debug] 1888#1888: *570837 connect to 1.1.1.1:443, fd:60 #570841

这是否是我们这边或我们的 real_storage 主机配置错误?

*我能找到的最接近我的问题的是 https://mailman.nginx.org/pipermail/nginx/2013-March/038119.html ...

更多详细信息

我们添加了proxy_next_upstream 错误超时 invalid_header http_500 http_502 http_503 http_504;但它仍然失败了。我现在开始怀疑,既然它是两个 ELB(我们的和他们的),那么我们使用的解析器就是问题所在 - 因为它是亚马逊特定的(每个 https://serverfault.com/a/929517/443939)...and 亚马逊仍然认为它是有效的,但它不会解析外部(我们的服务器试图攻击他们的服务器..)

我已经从一个配置中完全删除了解析器,并将看看它会去哪里。我们无法使用内部服务器重现此情况,因此我们必须依靠等待第三方服务器循环(大约每周一次)。

我有点不确定这个解析器是否是问题所在,因为重新启动 nginx 将解决问题并获取最新的 IP 对:/

我是否必须在没有 https 的情况下设置 dns 变量?:

    set $backend real_storage$2;
proxy_pass https://$backend;

我知道你必须使用一个变量,否则重新解析将不会发生,但也许变量的哪一部分是非常具体的 - 因为我只在我的查询中看到过它的设置。 ...但没有给出任何原因...我将在第二台服务器上进行设置,看看会发生什么...

对于我的第三台服务器,我正在尝试 this comment并将设备移出位置。当然,如果其他人有具体的想法,那么我愿意改变我的测试:D

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

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

最佳答案

正如 @cnst 所正确指出的那样,在 proxy_pass 中使用变量使 nginx 为每个请求解析 real_storage 的地址,但还有更多详细信息:

版本 1.1.9 之前 nginx 用于 cache DNS answers for 5 minutes .

版本 1.1.9 之后,nginx 缓存 DNS 答案的持续时间等于其 TTL,Amazon ELB 的默认 TTL 为 60 seconds .

因此,轮换后 nginx 继续使用旧地址一段时间是非常合法的。根据文档,可以覆盖 DNS 缓存的过期时间:

resolver 127.0.0.1 [::1]:5353 valid=10s;

resolver 127.0.0.1 ipv6=off valid=10s;

关于nginx 反向代理未检测到负载均衡器丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58795973/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com