proxy_pass - redirect nginx 301
Configure nginx para que no se bloquee si no se encuentra el host en sentido ascendente (4)
-
Si puede usar una IP estática, simplemente use eso, se iniciará y devolverá
503
si no responde. -
Use la directiva de
resolver
para señalar algo que pueda resolver el host, independientemente de si está activo o no. -
Resuélvelo en el nivel de
location
, si no puedes hacer lo anterior (esto permitirá que Nginx se inicie / ejecute) :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; }
Tenemos varias aplicaciones de rieles en 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
Config 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 necesitamos que todos estén activos, pero nginx falla de lo contrario. ¿Cómo hacer que nginx ignore las cadenas ascendentes fallidas?
La principal ventaja de usar
upstream
es definir
un grupo de servidores que puedan escuchar en diferentes puertos
y configurar el equilibrio de carga y la conmutación por error
entre ellos
.
En su caso, solo está definiendo 1 servidor primario por flujo ascendente, por lo que debe estar activo .
En su lugar, use variables para su (s)
proxy_pass
(s) y recuerde manejar los posibles errores (404, 503) que puede obtener cuando un servidor de destino está inactivo.
No puede usar la opción
--link
, en su lugar puede usar la asignación de puertos y vincular nginx a la dirección del host.
Ejemplo: ejecute su primer contenedor acoplable con la opción
-p 180:80
, segundo contenedor con la opción
-p 280:80
.
Ejecute nginx y configure estas direcciones para el proxy:
proxy_pass http://192.168.1.20:180/; # first container
proxy_pass http://192.168.1.20:280/; # second container
Para mí, la opción 3 de la respuesta de @ Justin / @ duskwuff resolvió el problema, pero tuve que cambiar la resolución IP a 127.0.0.11 (servidor DNS de Docker):
location /foo {
resolver 127.0.0.11 valid=30s;
set $upstream_foo foo;
proxy_pass http://$upstream_foo:80;
}
location /bar {
resolver 127.0.0.11 valid=30s;
set $upstream_bar foo;
proxy_pass http://$upstream_bar:80;
}
Pero como mencionó @ Justin / @ duskwuff, podría usar cualquier otro servidor DNS externo.