У меня есть обратный прокси-сервер nginx, который передает запросы от внешнего ELB Amazon к внутренним ELB.
У меня есть 6 внутренних экземпляров, которые обрабатывают запросы. Конфиги с поддержкой сайта выглядят так, но есть разные номера портов и proxy_pass. В остальном все идентично:
server {
listen 3000;
location / {
proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
include /etc/nginx/proxy.conf;
}
}
Примерно каждые 24 часа одна из конфигураций перестает работать. Все остальные прокси работают нормально. Если я перезапущу nginx, все конфигурации снова будут работать. В error.log ничего нет, ничего странного в журнале доступа, syslog или dmesg.
Это что-то известно? Я что-то не так сделал с конфигурациями прокси? Могу ли я посмотреть какие-нибудь другие журналы?
Ответ на этот вопрос заключается в том, что ELB иногда меняют IP-адреса, а nginx выполняет разрешение имен во время запуска.
Чтобы исправить это, в вашем VPC всегда есть DNS-сервер на уровне 0.2. Итак, если локальный IP-адрес CIDR - 10.0.0.0/16, DNS-сервер - 10.0.0.2.
Добавьте это в конфигурацию nginx.
resolver 10.0.0.2 valid=10s;
Proxy_pass также необходимо определить как переменную в противном случае nginx разрешит его только один раз. Итак, исходя из конфигурации выше, это правильная конфигурация:
server {
listen 3000;
location / {
resolver 10.0.0.2 valid=10s;
set $backend "http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000"
proxy_pass $backend;
include /etc/nginx/proxy.conf;
}
}
Если ваш proxy_pass не прошел напрямую на один URL-адрес, как показывает ваш пример (http://amazonaws.com), а вместо этого на вышестоящую прокси-ферму, например:
upstream my_upstream {
server1 127.0.0.1:1337;
server2 127.0.0.1:1338;
}
location / {
proxy_pass http://my_upstream;
}
Тогда вы будете меньше беспокоиться о временном отказе одного из восходящих потоков. Потому что все они будут выполнять одну и ту же работу. Если один не отвечает, то следующий будет проксирован для этого ответа. Спокойствие духа.
Nginx автоматически пропустит отказавший компьютер на x секунд. Пока вы его не отремонтируете, или пока он не вернется сам. (http://wiki.nginx.org/HttpUpstreamModule)
Таким образом, какой бы ни была причина ваших прерываний, распределяя их на вышестоящей ферме, это упрощает настройку.