我正在尝试在一些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返回的任何内容之间进行循环。这可能吗?或者有人可以提出另一种可以完成同样事情的解决方案吗?
谢谢, 萨姆
答案 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
它可能不是使用清漆的解决方案,但它按预期工作