使用Varnish背后的AWS ELB - 是否可能?

时间:2013-01-05 01:26:44

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

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

我想要做的是简单地通过在Elastic Load Balancer中添加或删除它们来管理后端服务器集。我已经尝试将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返回的任何内容之间进行循环。这可能吗?或者有人可以提出另一种可以完成同样事情的解决方案吗?

谢谢, 萨姆

8 个答案:

答案 0 :(得分:5)

您可以使用NGINX Web服务器来处理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

答案 1 :(得分:4)

我不建议将ELB放在Varnish之后。

  

问题在于Varnish正在解析这个名字   分配给ELB,它将缓存IP地址,直到VCL   得到了重新加载。由于ELB的动态特性,IP   链接到cname可以随时更改,从而产生Varnish   将流量路由到未链接到正确ELB的IP   了。

这篇文章很有用like to read

答案 2 :(得分:3)

是的,你可以。

你在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

答案 3 :(得分:2)

我写了这个脚本,以便有一种方法可以在新的时候自动更新vcl 实例上升或下降。

它要求.vcl有一个include to 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

答案 4 :(得分:1)

如果必须解决每个人的IP,你就不能获得10K请愿书。 Varnish在启动时解决ips并且不刷新它,除非重新启动重新加载。事实上,如果在后端定义中找到两个用于dns名称的ip,则varnish拒绝启动,就像为多az ELB返回的ip一样。

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

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

答案 5 :(得分:1)

您可以在私人VPC中制作ELB,以便它具有本地IP。这样您就不必使用任何DNS类型的Cnames或Varnish不支持的任何东西。

答案 6 :(得分:1)

Using internal ELB does not help the problem, because it usually have 2 Internal IP's!

Backend host "internal-XXX.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: 10.30.10.134 10.30.10.46 ('input' Line 13 Pos 12)

What I am not sure is if this IPs will remain always the same or they can change? anyone?

答案 7 :(得分:0)

我之前的回答(超过三年前)我没有解决这个问题,我的[nginx - varnish - nxinx] - &gt; ELB解决方案有效,直到ELB更改IP

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

所以我的想法是将一个nginx放在同一个主机上,那里的varnish就像这样配置上游:

resolver 10.0.0.2;  ## IP for the aws resolver on the subnet

upstream backend {                                                                              
    jdomain internal-elb-dns-name port=80;
}

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

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

相关问题