
Estou usando o Nginx para armazenar em cache algumas respostas. O backend que gera essas respostas define um Cache-control
cabeç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-control
cabeçalho antes que ele seja levado em consideração pela proxy_pass
diretiva.
Estou usando ngx_lua_module
e quero modificar o Cache-Control
cabeçalho no internal
bloco de localização usando header_filter_by_lua_block
a 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_pass
para um local, só pode proxy_pass
ir para um upstream ou URL (que basicamente é upstream não declarado). Então, respondendo formalmente à sua pergunta, você proxy_pass
deveriahost 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 = /actual
para 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_header
e 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;
}
}