【问题标题】:How to resolve IPs of AWS ELB in Openresty for every upstream如何在 Openresty 中为每个上游解析 AWS ELB 的 IP
【发布时间】:2020-09-03 09:35:39
【问题描述】:

我们遇到的问题是 openresty nginx 仅在启动时解析 AWS ELB 的 IP,然后永久缓存 IP(直到重新加载)。由于 AWS 负载均衡器 IP 可以随时更改,因此我正在寻找一种可以在每次上游使用时解析 ELB IP 的解决方案。 在 nginx+ 中寻找类似于上游“resolve”选项的东西,但在 Openresty 中。 或其他使上游 DNS 缓存失效的方法

【问题讨论】:

    标签: nginx amazon-elb openresty


    【解决方案1】:

    如果使用 DNS 服务器作为您的 resolver 并使用变量作为 proxy_pass 的值?

    从 Jeppe Fihl-Pearson 的这篇帖子"Nginx with dynamic upstreams" 中查看下面的示例

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

    【讨论】:

    • 是的,这也不错,但它不支持变量,例如resolver $resolver_value;
    • 目标是由解析器动态解析的,为什么解析器的变量会有用?
    • 此解决方案不适用于proxy_protocol on;
    【解决方案2】:

    您可以在balancer_by_lua_block 指令中使用balancer module。您将能够设置任何上游 IP。

    这个 Lua 代码执行上下文不支持 yielding,所以 Lua APIs 可能产生的(如 cosockets 和“轻线程”)在 这个上下文。通常可以通过做来解决这个限制 早期阶段处理程序中的此类操作(如 access_by_lua*)和 通过 ngx.ctx 表将结果传递到这个上下文中。

    您可以使用lua-resty-dns 并为access_by_lua_* 中的每个请求解析您的ELB IP(它是否有效?!),将获得的IP 保存到ngx.ctx 并在balancer_by_lua_block 中使用它。

    【讨论】:

    • 感谢您的回答。它确实帮助我解决了负载均衡器。但我最终做了一件非常简单的事情,那就是在 openresty 中加载动态模块,它做了同样的事情
    【解决方案3】:

    将此添加到服务器指令

    resolver local=on valid=5s;
    

    然后你可以像往常一样使用上游块。

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多