Установка nginx не сбой, если хост в восходящем потоке не найден
У нас есть несколько рельсовых приложений под общим доменом в Docker, и мы используем nginx для прямых запросов к конкретным приложениям.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
Конфигурация выглядит так:
upstream foo {
server foo:3000;
}
upstream bar {
server bar:3000;
}
# and about 10 more...
server {
listen *:80 default_server;
server_name our_dev_server.com;
location /foo {
# this is specific to asset management in rails dev
rewrite ^/foo/assets(/.*)$ /assets/$1 break;
rewrite ^/foo(/.*)$ /foo/$1 break;
proxy_pass http://foo;
}
location /bar {
rewrite ^/bar/assets(/.*)$ /assets/$1 break;
rewrite ^/bar(/.*)$ /bar/$1 break;
proxy_pass http://bar;
}
# and about 10 more...
}
Если одно из этих приложений не запущено, nginx выходит из строя и останавливается:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
Нам не нужны все они, но nginx терпит неудачу.
Как заставить nginx игнорировать неудачные восходящие потоки?
Ответы
Ответ 1
-
Если вы можете использовать статический IP-адрес, просто используйте его, он запустится и просто вернет 503
, если он не отвечает.
-
Используйте директиву resolver
, чтобы указать на то, что может разрешить хост, независимо от того, в настоящее время оно или нет.
-
Отремонтируйте его на уровне location
, если вы не можете сделать это (это позволит Nginx запускать/запускать):
location /foo {
resolver 127.0.0.1 valid=30s;
# or some other DNS (you company/internal DNS server)
#resolver 8.8.8.8 valid=30s;
set $upstream_foo foo;
proxy_pass http://$upstream_foo:80;
}
location /bar {
resolver 127.0.0.1 valid=30s;
# or some other DNS (you company/internal DNS server)
#resolver 8.8.8.8 valid=30s;
set $upstream_bar foo;
proxy_pass http://$upstream_bar:80;
}
Ответ 2
Основным преимуществом использования upstream
является определение группы серверов, чем возможность прослушивания на разных портах, и настройка балансировки нагрузки и переключение между ними.
В вашем случае вы определяете только 1 первичный сервер для восходящего потока, поэтому он должен быть вверх.
Вместо этого используйте переменные для proxy_pass
(es) и не забудьте обработать возможные ошибки (404s, 503s), которые вы можете получить, когда целевой сервер не работает.
Ответ 3
Вы не можете использовать опцию --link
, вместо этого вы можете использовать сопоставление портов и привязать nginx к адресу узла.
Пример. Запустите свой первый контейнер докеров с опцией -p 180:80
, второй контейнер с опцией -p 280:80
.
Запустите nginx и установите эти адреса для прокси:
proxy_pass http://192.168.1.20:180/; # first container
proxy_pass http://192.168.1.20:280/; # second container