Nginx - proxy_pass a otro bloque de ubicación interna

Nginx - proxy_pass a otro bloque de ubicación interna

Estoy usando Nginx para almacenar en caché algunas respuestas. El backend que genera estas respuestas establece un Cache-controlencabezado común para todas las respuestas. Sin embargo, necesito almacenar en caché algunas de las respuestas durante más tiempo que otras. Es decir, necesito modificar el cache-controlencabezado antes de que la directiva lo tenga en cuenta proxy_pass.

Estoy usando la directiva ngx_lua_moduley quiero modificar el Cache-Controlencabezado en el internalbloque de ubicación usando header_filter_by_lua_blockla directiva. La configuración prevista se parece a la siguiente:

location / {
    proxy_pass /actual;
    proxy_cache something;
}

location = /actual {
    internal;
    proxy_pass https://backend;
    proxy_cache off;
    header_filter_by_lua_block {
        -- modify cache-control header based on request/response parameters
    }
}

Sin embargo, no pude encontrar una manera de lograr esta redirección interna a través de proxy_pass. Agradecería cualquier idea que tenga para que esto funcione.

Respuesta1

No puede proxy_passacceder a una ubicación, solo puede proxy_passacceder a una dirección ascendente o a una URL (que básicamente no está declarada ascendente). Entonces, respondiendo formalmente a su pregunta, proxy_passdeberíaservidor localcon el encabezado Host establecido en el actual server_name; pero esto probablemente complicará demasiado las cosas.

En cambio- Parece que todo lo que necesitas hacer es deshacerte de lo location / {}que no necesitas y luego cambiarle el nombre location = /actuala location / {}.

También diría que no necesitas lua en absoluto; simplemente elimina el encabezado que obtienes de la web proxy proxy_hide_headery agrega el tuyo propio con add_header.

Respuesta2

En términos generales, para pasar el control a otro bloque de ubicación, debes usar redirecciones internas (volver a escribir), no proxy_pass:

location / {
    rewrite ^.*$ /actual;
}

Para modificar los encabezados ascendentes, puede utilizarencabezado_conjunto_proxy:

location /actual {
    proxy_set_header Cache-Control '<your value>';
}

Para modificar los encabezados posteriores, puede utilizarmore_set_headers. Requiere una compilación Nginx personalizada con un módulo adicional, pero en su caso es realmente poderoso:

location /actual {
    more_set_headers 'Cache-Control: <your value>';
}

Teniendo en cuenta el título de la pregunta, también puede hacer cosas difíciles como cambiar de servidor para manejar el tráfico de los clientes. NO lo recomendaría para tareas tan triviales, pero en casos excepcionales podría ayudar:

http {

    upstream internal_http_routing {
        server         unix:var/internal.sock;
    }

    server {
        # Internal interface
        listen         unix:var/internal.sock;

        location / {
            return     200;
        }
    }

    server {
        # Client-facing interface
        listen         443 ssl;

        location / {
            proxy_pass http://internal_http_routing;
        }
    }

}

tcp {

    upstream internal_tcp_routing {
        server         unix:var/internal.sock;
    }

    server {
        # Client-facing interface
        listen         8443 ssl;
        proxy_pass     internal_tcp_routing;
    }

}

información relacionada