【问题标题】:Using an AWS ELB behind Varnish - is it possible?在 Varnish 后面使用 AWS ELB - 有可能吗?
【发布时间】:2012-12-19 12:09:29
【问题描述】:

我正在尝试将一组 EC2 实例放在几个 Varnish 服务器后面。我们的 Varnish 配置很少更改(一年一次或两次),但我们总是出于各种原因(更新、问题、负载峰值)添加/删除/替换 Web 后端。这会产生问题,因为我们总是必须更新 Varnish 配置,这会导致错误和心碎。

我想做的是管理一组后端服务器,只需在弹性负载均衡器中添加或删除它们即可。我尝试将 ELB 端点指定为后端,但出现此错误:

Message from VCC-compiler:
Backend host "XXXXXXXXXXX-123456789.us-east-1.elb.amazonaws.com": resolves to multiple IPv4 addresses.
Only one address is allowed.
Please specify which exact address you want to use, we found these:
123.123.123.1
63.123.23.2
31.13.67.3
('input' Line 2 Pos 17)
.host = "XXXXXXXXXXX-123456789.us-east-1.elb.amazonaws.com";

ELB 提供的唯一一致的公共接口是它的 DNS 名称。此 DNS 名称解析为随时间和负载而变化的 IP 地址集。

在这种情况下,我宁愿不指定一个确切的地址 - 我想在从 DNS 返回的任何内容之间进行循环。这可能吗?或者有人可以提出另一个解决方案来完成同样的事情吗?

谢谢, 山姆

【问题讨论】:

    标签: amazon-web-services varnish amazon-elb


    【解决方案1】:

    我不建议在 Varnish 后面放置 ELB。

    问题在于 Varnish 正在解析名称这一事实 分配给 ELB,它会缓存 IP 地址,直到 VCL 重新加载。由于 ELB 的动态特性,IP 链接到的 cname 可以随时更改,导致 Varnish 将流量路由到未链接到正确 ELB 的 IP 没有了。

    这是一篇有趣的文章,你可能会like to read

    【讨论】:

    • 实际上,我遇到的主要问题是让它接受 ELB DNS 名称。事实上,Varnish 甚至不会加载配置。我意识到 IP 地址可以经常更改,但如果 DNS ttl 较低,这应该不是什么大问题。然而!尽管您在这里描述的并不是我遇到的问题,但您引用的文章中的解决方案似乎对我有用。所以,谢谢!
    【解决方案2】:

    我编写这个脚本是为了有一种方法来自动更新 vcl 一次新的 实例上升或下降。

    它要求 .vcl 包含到 backend.vcl

    这个脚本只是解决方案的一部分,任务应该是: 1. 获取新的服务器名称和 IP(自动缩放)可以使用 AWS API cmds 来做到这一点,也可以通过 bash 2.更新vcl(这个脚本) 3.重新加载清漆

    脚本在这里 http://felipeferreira.net/?p=1358

    其他人以不同的方式做到这一点 http://blog.cloudreach.co.uk/2013/01/varnish-and-autoscaling-love-story.html

    【讨论】:

      【解决方案3】:

      如果必须为每个请求解析一个 ip,您将无法获得 10K 请求。 Varnish 在启动时解析 ips,除非重新启动或重新加载,否则不要刷新它。事实上,如果在后端定义中发现两个 ip 用于一个 dns 名称,varnish 会拒绝启动,例如为多 az ELB 返回的 ip。

      所以我们解决了在 nginx 前面放置清漆的类似问题。 Nginx 可以将 ELB 定义为后端,因此 Varnish 后端是本地 nginx,而 nginx 后端是 ELB。

      但我对这个解决方案感到不舒服。

      【讨论】:

        【解决方案4】:

        您可以使用 NGINX 网络服务器来处理 CNAME 解析问题:

        User-> Varnish -> NGNIX -> ELB -> EC2 Instances
                (Cache Section)        (Application Section)
        

        您在这篇文章中有一个配置示例:http://blog.domenech.org/2013/09/using-varnish-proxy-cache-with-amazon-web-services-elastic-load-balancer-elb.html

        胡安

        【讨论】:

          【解决方案5】:

          是的,你可以。

          在你的 default.vcl 中:

          include "/etc/varnish/backends.vcl";
          

          并将后端设置为:

          set req.backend = default_director;
          

          所以,运行这个脚本来创建 backends.vcl:

          #!/bin/bash
          FILE_CURRENT_IPS='/tmp/elb_current_ips'
          FILE_OLD_IPS='/tmp/elb_old_ips'
          TMP_BACKEND_CONFIG='/tmp/tmp_backends.vcl'
          BACKEND_CONFIG='/etc/varnish/backends.vcl'
          
          ELB='XXXXXXXXXXXXXX.us-east-1.elb.amazonaws.com'
          IPS=($(dig +short $ELB | sort))
          
          if [ ! -f $FILE_OLD_IPS ]; then
              touch $FILE_OLD_IPS
          fi
          
          echo ${IPS[@]} > $FILE_CURRENT_IPS
          
          DIFF=`diff $FILE_CURRENT_IPS $FILE_OLD_IPS | wc -l`
          
          cat /dev/null > $TMP_BACKEND_CONFIG
          
          if [ $DIFF -gt 0 ]; then
          
              COUNT=0
          
              for i in ${IPS[@]}; do
                  let COUNT++
                  IP=$i
                  cat <<EOF >> $TMP_BACKEND_CONFIG
          backend app_$COUNT {
              .host = "$IP";
              .port = "80";
              .connect_timeout = 10s;
              .first_byte_timeout = 35s;
              .between_bytes_timeout = 5s;
          }
          
          EOF
              done
          
              COUNT=0
          
              echo 'director default_director round-robin {' >> $TMP_BACKEND_CONFIG
          
              for i in ${IPS[@]}; do
                  let COUNT++
                  cat <<EOF >> $TMP_BACKEND_CONFIG
              { .backend = app_$COUNT; }
          EOF
              done
          
              echo '}' >> $TMP_BACKEND_CONFIG
          
              echo 'NEW BACKENDS'
              mv -f $TMP_BACKEND_CONFIG $BACKEND_CONFIG
          
          fi
          
          mv $FILE_CURRENT_IPS $FILE_OLD_IPS
          

          【讨论】:

          【解决方案6】:

          您可以在您的私有 VPC 中创建 ELB,以便它具有本地 IP。这样您就不必使用任何 DNS 类型的 Cname 或 Varnish 不那么容易支持的任何东西。

          【讨论】:

            【解决方案7】:

            使用内部 ELB 无济于事,因为它通常有 2 个内部 IP!

            后端主机“internal-XXX.us-east-1.elb.amazonaws.com”:解析为多个 IPv4 地址。 只允许一个地址。 请指定您要使用的确切地址,我们找到了这些: 10.30.10.134 10.30.10.46 ('输入'第 13 行第 12 行)

            我不确定这些 IP 是否会始终保持不变或可以更改?有人吗?

            【讨论】:

              【解决方案8】:

              我之前的回答(三年多前)我还没有解决这个问题,我的 [nginx - varnish - nxinx ] -> ELB 解决方案一直有效,直到 ELB 更改 IP

              但从前一段时间我们使用相同的设置,但使用 jdomain plugin 编译的 nginx

              所以想法是将 nginx 放置在清漆的同一主机中,然后像这样配置上游:

              resolver 10.0.0.2;  ## IP for the aws resolver on the subnet
              
              upstream backend {                                                                              
                  jdomain internal-elb-dns-name port=80;
              }
              

              如果 ELB 更改其地址,上游将自动重新配置上游 ips 的 IP

              它可能不是使用清漆的解决方案,但它可以按预期工作

              【讨论】:

              • 老兄! , 4 年后你节省了很多时间:) 谢谢。顺便说一句,即使在 4-5 年后,ELB 和清漆都没有最佳解决方案,这真的很奇怪
              猜你喜欢
              • 2017-06-14
              • 1970-01-01
              • 2021-03-19
              • 2019-12-11
              • 1970-01-01
              • 2017-03-05
              • 1970-01-01
              • 1970-01-01
              • 2015-07-25
              相关资源
              最近更新 更多