У меня есть установка Docker с одним контейнером Django и одним nginx, обслуживающим статические файлы. У меня nginx настроен стандартным образом:
upstream main_web {
server web:8000;
}
server {
location / {
proxy_pass http://main_web;
#...
}
}
Я использую /etc/hosts
запись, чтобы получить IP-адрес контейнера Django.
Когда я перезапускаю контейнер Django, его IP-адрес обновляется, что отражается на hosts
файл. Но nginx продолжает давать 502 Bad Gateway
ошибка. Все работает нормально, когда я вручную перезапускаю nginx.
Нет ли способа указать nginx снова разрешить IP-адрес, если он недоступен?
Когда вы используете переменную для указания имени домена в proxy_pass
директиве NGINX повторно разрешает доменное имя, когда его TTL истекает. Вы должны включить директиву преобразователя, чтобы явно указать сервер имен (NGINX не ссылается на /etc/resolv.conf). Подробнее здесь
Используя Docker, вы можете проверить свой текущий преобразователь DNS и добавить его в конфигурацию nginx. Проверьте /etc/resolv.conf
.
Например, с помощью docker-compose вы можете установить имя службы в конфигурации nginx vhost. Предположим, у нас есть такая установка:
docker-compose.yml
version: "3"
services:
my-backend-service: # we will use this name in our nginx vhost conf
image: some-image
lb:
image: nginx
volumes:
- ".docker/etc/nginx/default.conf:/etc/nginx/conf.d/default.conf"
ports:
- 80:80
Немного о приведенной выше конфигурации. Обратите внимание, что я не добавляю имя контейнера в серверную службу, поэтому я могу свободно масштабировать его. Также обратите внимание на имя службы, мы будем использовать его в Nginx vhost conf, чтобы он разрешал IP-адрес экземпляров через DNS. Наконец, Nginx прослушивает порт 80, а серверные службы прослушивают 8080 (например, может быть что угодно)
default.conf
resolver 127.0.0.11 valid=10s; # 127.0.0.1 comes from /etc/resolv.conf on the nginx container
server {
location / {
set $backend_servers my-backend-service;
proxy_pass http://$backend_servers:8080;
}
}
Чтобы проверить это:
Теперь вы можете отправлять запросы localhost
и Nginx будет использовать указанный вами преобразователь DNS для получения IP-адресов серверных служб и повторно разрешит доменное имя по истечении срока жизни.
Видеть: http://tenzer.dk/nginx-with-dynamic-upstreams/ для метода, чтобы заставить nginx повторно разрешить IP, используя переменную в настройке proxy_pass.
Это также возможно с ha_proxy 1.6 с его функцией «Разрешение IP-адреса сервера с использованием DNS во время выполнения».