
Estoy usando Nginx para almacenar en caché algunas respuestas. El backend que genera estas respuestas establece un Cache-control
encabezado 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-control
encabezado antes de que la directiva lo tenga en cuenta proxy_pass
.
Estoy usando la directiva ngx_lua_module
y quiero modificar el Cache-Control
encabezado en el internal
bloque de ubicación usando header_filter_by_lua_block
la 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_pass
acceder a una ubicación, solo puede proxy_pass
acceder a una dirección ascendente o a una URL (que básicamente no está declarada ascendente). Entonces, respondiendo formalmente a su pregunta, proxy_pass
deberí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 = /actual
a location / {}
.
También diría que no necesitas lua en absoluto; simplemente elimina el encabezado que obtienes de la web proxy proxy_hide_header
y 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;
}
}