proxy_redirect proxy_pass mod_rewrite example nginx url-rewriting proxypass

proxy_pass - redirect nginx 301



Configure nginx para que no se bloquee si no se encuentra el host en sentido ascendente (4)

  1. Si puede usar una IP estática, simplemente use eso, se iniciará y devolverá 503 si no responde.

  2. Use la directiva de resolver para señalar algo que pueda resolver el host, independientemente de si está activo o no.

  3. 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.