如何为每个 upstream 解决 AWS ELB 的 IP 地址

我们遇到的问题是 openresty nginx 只在启动时解析 AWS ELB 的 IP 地址,然后缓存该 IP 地址直至重新加载。(由于 AWS 负载均衡器的 IP 地址随时都可能发生变化),因此我正在寻找一种解决方法,可以为每次在 upstream 中使用时解析 ELB IP。 寻找类似于 nginx+ 中 upstream "resolve" 选项的解决方案,但是在 Openresty 中。 或者其他使 upstream DNS 缓存失效的方法。

点赞
用户2060502
用户2060502

你可以在 balancer_by_lua_block 指令内使用 balancer 模块。你可以设置任何上游 IP。

这个 Lua 代码执行上下文不支持 yielding,因此在这个上下文中禁用了可能会发生 yielding 的 Lua APIs(如 cosockets 和 “light threads”)。通常可以通过在较早的处理程序(如 access_by_lua_*)中执行这些操作,并通过 ngx.ctx 表将结果传递到此上下文中来克服此限制。

你可以在 access_by_lua_* 中使用 lua-resty-dns 并为每个请求解析你的 ELB IP(这样做的性能如何?!),将获得的 IP(s) 保存到 ngx.ctx 中,并在 balancer_by_lua_block 中使用它们。

2018-05-29 07:00:04
用户454322
用户454322

怎么样使用一个 DNS 服务器作为你的resolver,并使用一个变量作为proxy_pass的值?

看看下面这个帖子"Nginx with dynamic upstreams"中的示例,作者是 Jeppe Fihl-Pearson:

resolver 172.16.0.23;
set $upstream_endpoint http://service-1234567890.us-east-1.elb.amazonaws.com;
location /foo/ {
    rewrite ^/foo/(.*) /$1 break;
    proxy_pass $upstream_endpoint;
}
2018-07-03 06:36:01
用户221033
用户221033

将以下内容添加到服务器指令中:

resolver local=on valid=5s;

然后您可以像往常一样使用 upstream 块。

2020-09-03 01:35:39