Мы используем NGINX в Docker Swarm, как обратный прокси.NGINX находится в оверлейной сети и передает внешние запросы в соответствующую службу роя.
Однако у нас есть проблема: каждый раз, когда мы перезапускаем / обновляем или иным образом отключаем службу роя, NGINX возвращает 502 Bad Gateway
.Затем NGINX продолжает обслуживать 502
даже после перезапуска службы, и это не исправляется до тех пор, пока мы не перезапустим службу NGINX, которая, очевидно, не в состоянии полностью использовать балансировщик нагрузки и службы, работающие в нескольких местах.
Вот наш NGINX CONF:
events {}
http {
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
client_max_body_size 20M;
large_client_header_buffers 8 256k;
client_header_buffer_size 256k;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
map $host $client {
default clientname;
}
#Healthcheck
server {
listen 443;
listen 444;
location /is-healthy {
access_log off;
return 200;
}
}
#Example service:
server {
listen 443;
server_name scheduler.clientname.com;
location / {
resolver 127.0.0.11 ipv6=off;
proxy_pass http://$client-scheduler:60911;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
#catchll
server {
listen 443;
listen 444;
server_name _;
location / {
return 404 'Page not found';
}
}
}
Мы используем заполнитель $ client, так как в противном случае мы даже не сможем запустить nginx, когда одна из служб не работает.
Другой альтернативой является использование вышестоящей директивы с проверками работоспособности, которая может хорошо работать.Проблема в том, что если какая-либо из служб недоступна, NGINX даже не запустится!
Что мы делаем не так?
ОБНОВЛЕНИЕ Похоже, что мы хотимздесь невозможно (пожалуйста, докажите, что я не прав!).Кажется сумасшедшим упустить такую возможность в мире докеров и микросервисов!
В настоящее время мы рассматриваем HAPROXY в качестве альтернативы, поскольку его можно настроить с помощью default-server init-addr none
, чтобы остановить сбой при запуске.