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

nginx обновляет IP-адрес восходящего сервера

У меня есть установка 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;
    }
}

Чтобы проверить это:

  • docker-compose up -d
  • масштабирование docker-compose my-backend-service = 5
  • docker-compose logs -f мой-backend-service

Теперь вы можете отправлять запросы localhost и Nginx будет использовать указанный вами преобразователь DNS для получения IP-адресов серверных служб и повторно разрешит доменное имя по истечении срока жизни.

Видеть: http://tenzer.dk/nginx-with-dynamic-upstreams/ для метода, чтобы заставить nginx повторно разрешить IP, используя переменную в настройке proxy_pass.

Это также возможно с ha_proxy 1.6 с его функцией «Разрешение IP-адреса сервера с использованием DNS во время выполнения».