Tengo un PHP CMS como servidor ascendente/de origen que sirve contenido. Se coloca detrás de un servidor web Nginx configurado como un caché de proxy inverso con proxy_pass y proxy_cache .
Mientras implementaba la respuesta 304 Not Modified en el servidor ascendente/de origen, noté que a veces recibo una respuesta 304 Not Modified del proxy sin que se llame a mi servidor ascendente/de origen.
Mi configuración de proxy se ve así (tenga en cuenta que no guardo en caché las respuestas 304):
http { #... proxy_cache_path /usr/share/nginx/cache/ levels=1:2 keys_zone=microcache:10m max_size=1024m inactive=1h; } server { server_name _; #... location / { proxy_cache microcache; proxy_cache_revalidate on; add_header X-Cache-Status $upstream_cache_status; #... proxy_cache_valid 200 301 302 1m; proxy_pass http://upstream; } } Cuando presiono una URL por primera vez, obtengo un 200 con X-Cache-Status: MISS y los ETag y Last-Modified devueltos por el origen.
La segunda vez que presiono la URL, obtengo un X-Cache-Status: HIT y no se llama a mi origen, ¡así que todo es genial!
Sin embargo, si vuelvo a presionar la URL, esta vez con los encabezados If-Modified-Since y If-None-Match con los valores recibidos con la primera llamada, obtengo un 304 Not Modified , con X-Cache-Status: HIT y ¡Aún no hay llamadas en mi servidor de origen!
Entonces, parece que Nginx tiene el contenido en su caché y, con los encabezados entrantes, debería devolver un 304. Lo que significa que mi origen nunca puede devolver el 304 si el contenido está en el caché de Nginx.
¿Tengo razón? No puedo encontrar ninguna documentación sobre este comportamiento. Sin embargo, encontré un módulo en el código fuente de Nginx que parece estar manejando algo similar: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_not_modified_filter_module.c#L78
¿Podría brindarme información sobre este comportamiento, cómo funciona y qué lo habilita en mi configuración?
¡Muchos gracias!
proxy_cache_path /usr/share/nginx/cache/ levels=1:2 keys_zone=microcache:10m max_size=1024m inactive=1h; proxy_cache microcache; Lo que significa que el servidor nginx almacena datos de caché en /usr/share/nginx/cache/
y
proxy_cache_valid 200 301 302 1m; Esto significa que cualquier llamada a la API HTTP que tenga los estados HTTP 200, 301 o 302 usa el caché local de nginx (que se almacena en /usr/shre/nginx/cache ) durante un minuto.