Temos vários aplicativos rails sob domínio comum no Docker e usamos o nginx para direcionar solicitações a aplicativos específicos.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
A configuração é semelhante a esta:
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...
}
Se um desses aplicativos não for iniciado, o nginx falhará e para:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
Não precisamos que todos estejam ativados, mas o nginx falha de outra forma. Como fazer o nginx ignorar upstreams com falha?
resolver
( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) funcionaria no seu caso?
proxy.sh
script que lê as variáveis de ambiente e adiciona upstream
entradas dinamicamente para cada uma e, em seguida, inicia o Nginx. Isso funciona muito bem, pois quando executamos nosso contêiner de proxy, podemos passar os upstreams necessários em tempo de execução. Você poderia fazer algo semelhante para habilitar / desabilitar certos upstreams no lançamento (ou como minha configuração, apenas adicionar os necessários no tempo de execução)
upstream
bloco não resolver, em tempo de execução, então o Nginx sairá com o erro acima ...