
¡Tengo este código en la configuración de barniz y no estoy seguro de qué hace! ¿Esta configuración almacenará en caché o no las solicitudes de mis clientes? ¿Qué tiene de malo?
sub vcl_backend_response {
if (beresp.status != 200) {
return (pass);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.cookie;
unset beresp.http.Set-Cookie;
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.http.Cache-Control = "no-store";
}
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
return (pass);
}
return (deliver);
}
Respuesta1
Este bloque de código VCL parece especificar algunas reglas sobre cuándo omitir el caché. Sin embargo, la forma en que está escrito no tiene mucho sentido.
Omitir el caché
return(pass)
no es la forma adecuada de evitar el almacenamiento en caché en el vcl_backend_response
contexto. return(pass)
se utiliza vcl_recv
cuando una solicitud entrante omite el caché.
Omitir vcl_backend_response
el caché significa evitar almacenar el objeto entrante en el caché. Las mejores prácticas dictan que usted debe set beresp.uncacheable = true
asignar un TTL y luego return(deliver)
. Esto garantiza que este objeto omita el caché durante un cierto período de tiempo hasta que la siguiente respuesta del backend cumpla con los criterios requeridos.
Mi habilitación beresp.uncacheable
garantiza que el objeto termine en la lista de espera y se convierta en candidato para la fusión de solicitudes.
Quitar cookies
Eliminar las cookies a menudo tiene sentido para mejorar su tasa de aciertos. En el contexto del backend, eliminará el Set-Cookie
encabezado. Esto se hace correctamente a vcl_backend_response
través de unset beresp.http.Set-Cookie
, sin embargo, se hace incondicionalmente.
Esto significa que Set-Cookie
no se llevará a cabo ninguna acción, lo que podría resultar en un comportamiento inconsistente. No estoy seguro de si se requieren condiciones previas para la eliminación de estas cookies.
También puedes eliminar las cookies entrantes a través de unset req.http.Cookie
. Pero parece haber una llamada similar en vcl_backend_response
ese sentido unset beresp.http.Cookie
.
Esto indicaría que Cookie
se recibiría un encabezado de respuesta. Eso parece poco probable.
Reescribiendo el VCL
Así es como reescribiría este código VCL sin ningún otro contexto:
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "80";
}
sub vcl_recv {
unset req.http.Cookie;
}
sub vcl_backend_response {
if(beresp.status != 200) {
set beresp.ttl = 120s;
set beresp.uncacheable = true;
return(deliver);
}
set beresp.http.X-Backend = beresp.backend.name;
unset beresp.http.Set-Cookie;
set beresp.http.Cache-Control = "no-store";
if (bereq.http.x-render-type == "test" && beresp.http.Content-Type ~ "text/html") {
set beresp.ttl = 120s;
set beresp.uncacheable = true;
return(deliver);
}
return (deliver);
}
Advertencia: No recomendaría copiar/pegar esto en su entorno de producción. Tengo la sensación de que se tomaron algunos atajos al escribir este VCL. Como no tengo ningún contexto adicional, no quiero recomendar el uso de esto.