Tenemos varias aplicaciones de rieles bajo un dominio común en Docker, y usamos nginx para dirigir solicitudes a aplicaciones específicas.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
La configuración se ve así:
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...
}
Si una de estas aplicaciones no se inicia, nginx falla y se detiene:
host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6
No los necesitamos todos para estar activos, pero nginx falla de lo contrario. ¿Cómo hacer que nginx ignore los upstreams fallidos?
resolver
( nginx.org/en/docs/http/ngx_http_core_module.html#resolver ) en su caso?
proxy.sh
script que lee variables de entorno y agrega upstream
entradas dinámicamente para cada una, luego inicia Nginx. Esto funciona muy bien porque cuando ejecutamos nuestro contenedor de proxy podemos pasar los flujos ascendentes necesarios en tiempo de ejecución. Puede hacer algo similar para habilitar / deshabilitar ciertas corrientes ascendentes en el lanzamiento (o como mi configuración, simplemente agregue las necesarias en tiempo de ejecución)
upstream
bloque no se resuelve, en tiempo de ejecución, Nginx saldrá con el error anterior ...