Nginx - proxy_pass para outro bloco de localização interno

Nginx - proxy_pass para outro bloco de localização interno

Estou usando o Nginx para armazenar em cache algumas respostas. O backend que gera essas respostas define um Cache-controlcabeçalho comum para todas as respostas. No entanto, preciso armazenar em cache algumas das respostas por um período mais longo do que outras. Preciso modificar o cache-controlcabeçalho antes que ele seja levado em consideração pela proxy_passdiretiva.

Estou usando ngx_lua_modulee quero modificar o Cache-Controlcabeçalho no internalbloco de localização usando header_filter_by_lua_blocka diretiva. A configuração pretendida é semelhante a esta:

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
    }
}

No entanto, não consegui descobrir uma maneira de conseguir esse redirecionamento interno via proxy_pass. Eu apreciaria qualquer visão que você tenha para fazer isso funcionar.

Responder1

Você não pode ir proxy_passpara um local, só pode proxy_passir para um upstream ou URL (que basicamente é upstream não declarado). Então, respondendo formalmente à sua pergunta, você proxy_passdeveriahost localcom o cabeçalho Host definido como atual server_name; mas isso provavelmente complicará as coisas.

Em vez de- parece que tudo que você precisa fazer é se livrar do location / {}que você não precisa e renomear location = /actualpara location / {}.

Eu também diria que você não precisa de lua - apenas remova o cabeçalho que você está obtendo da web com proxy proxy_hide_headere adicione o seu próprio com add_header.

Responder2

De modo geral, para passar o controle para outro bloco de localização, você deve usar redirecionamentos internos (reescrever), não proxy_pass:

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

Para modificar cabeçalhos upstream você pode usarproxy_set_header:

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

Para modificar cabeçalhos downstream você pode usarmais_set_headers. Requer construção Nginx personalizada com módulo adicional, mas é realmente poderoso no seu caso:

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

Levando em consideração o título da pergunta, você também pode fazer coisas difíceis, como trocar de servidor para lidar com o tráfego de clientes. Eu NÃO o recomendaria para tarefas tão triviais, mas em casos raros poderia ajudar:

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;
    }

}

informação relacionada