Использование AWS ELB за лаком - возможно ли это?
Я пытаюсь поместить набор экземпляров EC2 за пару серверов Varnish. Конфигурация нашего лака очень редко изменяется (один или два раза в год), но мы всегда добавляем/удаляем/заменяем веб-серверы по всем причинам (обновления, проблемы, всплески нагрузки). Это создает проблемы, потому что нам всегда нужно обновлять нашу конфигурацию 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-имя. Набор IP-адресов: это DNS-имя разрешает изменения со временем и с нагрузкой.
В этом случае я предпочел бы НЕ указывать один точный адрес - я хотел бы объединить все, что вернется из DNS. Это возможно? Или кто-то может предложить другое решение, которое выполнит одно и то же?
Спасибо,
Сэм
Ответы
Ответ 1
Вы можете использовать веб-сервер 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
Хуан
Ответ 2
Я бы не рекомендовал поставить ELB за лак.
Проблема заключается в том, что Ларниш разрешает имя присвоенный ELB, и его кеширование IP-адресов до тех пор, пока VCL перезагружается. Из-за динамического характера ELB, IPs связанный с cname, может измениться в любое время, в результате чего Лак маршрутизация трафика на IP-адрес, который не связан с правильным ELB больше.
Это интересная статья, которую вы могли бы читать.
Ответ 3
Я написал этот script, чтобы иметь возможность автоматически обновлять vcl как только новый
экземпляр появляется вверх или вниз.
он требует, чтобы .vcl имел include для backend.vcl
Этот script является лишь частью решения, задачи должны быть:
1. получить новое имя сервера, а IP (автомасштабирование) может использовать cmds API AWS для этого, также через bash
2. Обновление vcl (это script)
3. перезагрузите лак
script здесь
http://felipeferreira.net/?p=1358
Другой pepole сделал это по-разному
http://blog.cloudreach.co.uk/2013/01/varnish-and-autoscaling-love-story.html
Ответ 4
Да, вы можете.
в вашем default.vcl put:
include "/etc/varnish/backends.vcl";
и установите backend на:
set req.backend = default_director;
поэтому запустите этот script, чтобы создать 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
Ответ 5
Вы могли бы сделать ELB в своем приватном VPC, чтобы он имел локальный ip. Таким образом, вам не нужно использовать какой-либо DNS-тип Cnames или что-либо, что Лак не поддерживает так легко.
Ответ 6
Использование внутреннего ELB не помогает проблеме, потому что обычно имеет 2 внутренних IP-адреса!
Внутренний хост "internal -XXX.us-east-1.elb.amazonaws.com": разрешает несколько адресов IPv4.
Разрешен только один адрес.
Укажите, какой именно адрес вы хотите использовать, мы нашли следующее: 10.30.10.134 10.30.10.46
('ввод' Строка 13 Поз 12)
Я не уверен, что если эти IP-адреса останутся неизменными или они могут измениться? кто-нибудь?
Ответ 7
Вы не получаете 10 тысяч петиций, если должны были разрешить ip на каждом из них. Лак разрешает ips при запуске и не обновляет его, если его перезапуск не перезагружен. Действительно, лак отказывается начинать, если обнаружил два ip для имени dns в определении бэкэнд, например ip, возвращенный для ELB с несколькими АЗ.
Таким образом, мы решили проблему с размещением лака перед nginx. Nginx может определить ELB в качестве backend, так что Varnish backend является локальным nginx, а бэкендом nginx является ELB.
Но я не чувствую себя комфортно с этим решением.
Ответ 8
I мой предыдущий ответ (более трех лет назад) я не решал эту проблему, мой [nginx-лак - nxinx] → ELB-решение работало до тех пор, пока ELB не изменит IP-адреса
Но с некоторого времени назад мы используем одну и ту же настройку, но с nginx, скомпилированным с плагин jdomain
Итак, идея состоит в том, чтобы поместить nginx в тот же хост, что и лак, чтобы настроить вверх по потоку, как это:
resolver 10.0.0.2; ## IP for the aws resolver on the subnet
upstream backend {
jdomain internal-elb-dns-name port=80;
}
чтобы восходящий поток автоматически перенастроил восходящий IP-адрес, если ELB изменяет свои адреса
Это может быть не решение, использующее лак, но оно работает как ожидалось