Nginx повторяет ту же конечную точку на http_502 в службе Docker Discovery - PullRequest
0 голосов
/ 13 ноября 2018

Мы используем Docker Swarm с сервисом обнаружения для Backend REST приложения. Службы в рое настроены на endpoint_mode: vip и работают в режиме global. Nginx - это прокси, переданный с псевдонимами обнаружения службы. Когда мы обновляем сервисы Backend, иногда nginx выдает 502, поскольку обнаружение сервиса может указывать на сервис обновления.

В таком случае мы хотели бы повторить попытку с той же самой конечной точкой. Как мы можем этого добиться?

В соответствии с этим мы добавили апстрим с частным IP-адресом хоста и использовали proxy_next_upstream error timeout http_502;, но проблема все еще сохраняется.

nginx.conf

upstream servers {
    server 192.168.1.2:443; #private ip of host machine
    server 192.168.1.2:443 backup;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    proxy_next_upstream http_502;
    location /endpoint1 {
        proxy_pass http://docker.service1:8080/endpoint1;
    }
    location /endpoint2 {
        proxy_pass http://docker.service2:8080/endpoint2;
    }
    location /endpoint3 {
        proxy_pass http://docker.service3:8080/endpoint3;
    }
}

Здесь, если http://docker.service1:8080/endpoint1 бросает 502 , мы хотим снова набрать http://docker.service1:8080/endpoint1.

Дополнительные запросы:

  1. Есть ли способ в docker swarm, чтобы он перестал указывать на обновление службы при обнаружении службы до тех пор, пока эта служба не будет полностью запущена?
  2. Здесь необходим восходящий поток, поскольку мы напрямую используем обнаружение службы Docker?

1 Ответ

0 голосов
/ 13 ноября 2018

Я предлагаю вам добавить проверку работоспособности непосредственно на уровне контейнера ( здесь )

При этом докер периодически отправляет эхо-запрос на указанную вами конечную точку, если она окажется нездоровой, она 1) прекратит перенаправлять трафик на нее 2) уничтожит контейнер и перезапустит новый. Поэтому вы вверх по течению перейдете к одному из здоровых контейнеров. Нет необходимости повторять попытку.

Что касается ваших дополнительных вопросов, то первый, докер, не начнет маршрутизацию, пока не станет здоровым. Во-вторых, nginx по-прежнему полезен для распределения трафика в соответствии с URL-адресом конечной точки. Но лично nginx + swarm vip mode не лучший выбор, потому что балансировщик нагрузки swarm плохо документирован, он не поддерживает липкий сеанс, и у вас не может быть проверки работоспособности на уровне прокси, я бы использовал traefik вместо этого, у него есть свой собственный Балансировщик нагрузки.

...