Comprender la directiva nginx proxy_cache_path

30

Supongamos que tengo este archivo de configuración nginx

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
  • ¿Qué significa keys_zone=myCache:8meso? No hay mucho que decir en los documentos:

Además, todas las claves activas y la información sobre los datos se almacenan en una zona de memoria compartida, cuyo nombre y tamaño están configurados por el parámetro keys_zone.

  • ¿Qué sucede si proxy_cache_valid( 12h) es mayor que el inactivevalor especificado ( 1h) en proxy_cache_path? ¿Qué regla seguirá? p.ej

    proxy_cache_valid 200 302 12h;
    proxy_cache_valid 404 302 1h;
    

¡Gracias!

Jürgen Paul
fuente

Respuestas:

39

¿Qué significa keys_zone = myCache: 8m?

Como dice la documentación , nginx mantendrá todas las claves activas y la información sobre los datos se almacena en una zona de memoria compartida, namey sizeestá configurada por el parámetro keys_zone. Como cuestión de exhaustividad, analicemos por parte

  • /var/cache/nginxes el lugar donde se almacena el caché real. Dentro de la carpeta, el archivo de caché era un archivo binario pero puede detectar fácilmente la etiqueta html dentro de él.
  • levels=1:2 Este parámetro de niveles establece el número de niveles de subdirectorio en caché.
  • keys_zone=myCache:8mestaba definiendo una zona de memoria compartida llamada myCache con un tamaño máximo de 8 MB. Contiene todas las claves y metadatos activos de la memoria caché. Por lo tanto, cada vez que nginx comprueba si una página se almacenó en caché, primero consulta la zona de memoria compartida, luego busca la ubicación de la caché real /var/cache/nginxsi existe caché.
  • max_sizeera el tamaño máximo de caché, por ejemplo, el tamaño de los archivos en /var/cache/nginx.
  • inactive=1hespecificar el tiempo máximo de inactividad que se puede almacenar en caché. Los datos en caché a los que no se accede durante el tiempo especificado por el inactiveparámetro se eliminan de la memoria caché independientemente de su actualización.

Cómo funciona la validación y eliminación de caché

Tomado de las listas de correo nginx

  • La directiva proxy_cache_valid especifica durante cuánto tiempo la respuesta se considerará válida (y se devolverá sin ninguna solicitud de back-end). Después de este tiempo, la respuesta se considerará "obsoleta" y no se devolverá o dependerá de la configuración proxy_cache_use_stale .

  • El argumento inactivo de proxy_cache_path especifica cuánto tiempo se almacenará la respuesta en caché después del último uso. Tenga en cuenta que incluso las respuestas obsoletas se considerarán utilizadas recientemente si hay solicitudes para ellas.

Según tengo entendido, aquí el pseudocódigo cómo funciona nginx

Cuando la solicitud viene

if cache.exist AND (now() - cache.first_retrieved) < proxy_cache_valid:
    use it
else:
    retrieve from backend
    replace the old ones

En otro proceso, el administrador de caché realiza esta lógica

if (now() - cache.last_used) > inactive:
    del cache

if all-cache.size > max-size:
    del *the most inactive cache* until size < max-size

¿Qué sucede si proxy_cache_valid (12h) es mayor que el valor inactivo especificado (1h) en proxy_cache_path?

Mientras la solicitud y el acceso a la caché en particular, ese objeto de caché seguirá siendo válido hasta 12 h después de que el objeto se haya guardado en la caché. Después de eso, el caché se consideró inválido, por lo que nginx buscará desde el backend y restablecerá el temporizador válido. Pero si el objeto estuvo inactivo (no se accedió) más de una hora, incluso en un período de 12 horas de caché válido, nginx lo eliminará debido al inactiveparámetro.

masegaloeh
fuente
"Después de eso, la memoria caché se consideró inválida, por lo que nginx buscará desde el servidor y restablecerá el temporizador válido". - eso es interesante. Entonces, ¿nginx obtiene la solicitud incluso si ningún usuario la obtiene? Entonces, por ejemplo, si inactivo es 365dy válido es 1dentonces nginx buscará las solicitudes en el caché todos los días durante un año, incluso si nadie hace esa solicitud.
Martin Thoma
1
Buena respuesta, pero parece que no puedo encontrar ninguna documentación sobre las unidades de medida que usamos con algunos de estos parámetros. Por ejemplo, los inactiveparámetros toman valores de tiempo, pero no veo qué valores puedo usar aparte de h(¿qué tal 1 mes? O 1 día? Etc.). ¿Y con qué deberíamos estar especificando max_size? Bytes? ¿Puedo usar 1M por 1 megabyte?
Sunil D.
44
@SunilD. - aquí tienes: nginx.org/en/docs/syntax.html
adamczi