5 votos

Reemplazo de URI al usar hosts dinámicos en el proxy inverso Nginx

FYI - sospecho que esto tiene una muy obvia/respuesta simple (soy nuevo en el nginx)

Estoy usando dinámica de aguas arriba como parte de mi Nginx config. Esto significa que el uso de variables en la proxy_pass directiva, la cual se encarga de nginx para utilizar un resolver en lugar de estrellarse/no arranque si un arriba tiene un problema (host desconocido / no conectable).

Sin embargo, esto parece cambiar también el manejo de proxy_pass con un URI. En lugar de reemplazar con el URI de la solicitud con el URI especificado en la proxy_pass directiva, parece ignorar el URI de la solicitud. Estoy buscando un método para preservar (o reproducir) el comportamiento original que me permite seguir utilizando dinámica de hosts.

He intentado crear un mínimo ejemplo de configuración aquí:

server {
    listen 80;
    server_name my-server.com;

    # My chosen DNS server (in this case, the Docker DNS)
    resolver 127.0.0.11 valid=30s ipv6=off;

    # This works
    location / {
        set $upstream frontend:8080;
        proxy_pass http://$upstream;
    }

    # This does not work :-( 
    # The original URI (e.g. /api/users/tommy) is ignored, and 
    # all requests to api-server are directly to /api/
    location /api/ {
        set $upstream api-server:8002;
        proxy_pass http://$upstream/api/;
    }
}

Una solución es colocar el URI de la proxy_pass directiva y tener el servidor ascendente escuchar exactamente en la URI es necesario. Esto no es lo ideal, como un beneficio básico de un servidor de puerta de enlace es la adición de cierta flexibilidad para cambiar las cosas de forma independiente (reescritura de URIs si es necesario)

Por ejemplo,

    # This kind of works, but upstream must listen on /api 
    location /api {
        set $upstream api-server:8002;
        proxy_pass http://$upstream;
    }

5voto

HugoFS Puntos 313

La documentación indica que si se utilizan variables de la proxy_pass directiva y especifique un URI parte, se pasará aguas arriba "como es".

Usted necesita para capturar la parte de la URI a la que usted necesita para enviar aguas arriba. Utilizar una expresión regular location bloque, por ejemplo:

location ~ ^/api(.*)$ {
    set $upstream ...;
    proxy_pass http://$upstream$1;
}

O usar un rewrite...break a cambio de la actual URI, por ejemplo:

location /api {
    set $upstream ...;
    rewrite ^/api(.*)$ $1 break;
    proxy_pass http://$upstream;
}

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: