Деякі конфігурації зворотного проксі nginx перестають працювати раз на день


12

У мене є nginx-реверсійний проксі-сервер, який надає проксі-запити від зовнішнього ELB Amazon до внутрішніх ELB.

У мене є 6 екземплярів, які обробляють запити. Конфігурації, що підтримуються сайтом, виглядають приблизно так, але існують різні номери портів і проксі-пропуск. Все інше ідентично:

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, всі конфігурації працюють знову. У журналі доступу, syslog чи dmesg немає нічого дивного.

Це щось відоме? Я зробив щось не так зі своїми конфігураціями проксі? Чи є інші журнали, в які я можу заглянути?



Відповіді:


22

Відповідь на це запитання полягає в тому, що 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;

Проксі_пас також потрібно визначити змінною, інакше 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;
    }
}

хтось знає, яка версія nginx підтримує змінні в налаштуваннях proxy_pass? я пробую еластичну підкладку (версія nginx 1.6.2), і все одно не хочу приймати змінну, і я вклав її.
Stephen C

Дякую за це, вже буквально змушує нас з розуму вже місяць!
Jim.R

Ця стаття про nginx-блок повторює повторення цієї конфігурації. nginx.com/blog/dns-service-discovery-nginx-plus
Морган Крістіанссон

1

Якщо ваш 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 )

Отже, якою б не була причина ваших перебоїв, розподіляючи їх на фермі вище за течією, це перетворюється на більш просту настройку.


Дякуємо за Ваш відповідь! Дивна річ у тому, що я можу зробити запит до екземпляра бекенда безпосередньо, але не через nginx. Якщо я просто перезавантажую nginx, запит знову буде проксі. Оскільки це вже є у виробничому середовищі, я дуже хочу дізнатися, чому одна з конфігурацій здається "розвантаженою" або як я можу дізнатися, що nginx насправді робить за кадром.
user202172

Тоді ви можете полювати на більше інформації про реєстрацію nginx. Це питання, коли хтось намагався, як і ви, дізнатися більше про "переривчасті проблеми [...] Я наближаюся" stackoverflow.com/questions/9914792/… Він описує спосіб витягування релевантніших журналів. Сподіваюся, це допомагає.
user18099
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.