Назад | Перейти на главную страницу

Некоторые конфиги обратного прокси nginx перестают работать раз в день

У меня есть обратный прокси-сервер 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)

Таким образом, какой бы ни была причина ваших прерываний, распределяя их на вышестоящей ферме, это упрощает настройку.