Saltar a contenido

cache: Caché HTTP a redis, puede servir respuestas obsoletas, y usando "lua-resty-lock" solo permite una solicitud para poblar una nueva caché

Instalación

Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.

CentOS/RHEL 7 o Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-cache

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-cache

Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.

Este documento describe lua-resty-cache v1.0.0 lanzado el 07 de agosto de 2015.


una biblioteca lua para trabajar con srcache, puede servir respuestas obsoletas, y usando "lua-resty-lock" solo permite una solicitud para poblar una nueva caché.

  1. si la caché falta, omite el srcache_fetch y realiza una única solicitud para poblar una nueva caché, la otra solicitud con el mismo cache_key, solo espera a que se actualice la caché con éxito.
  2. siempre establece el tiempo de expiración de redis a (tiempo de expiración real + tiempo obsoleto), para poder encontrar los datos obsoletos de redis.
  3. si obtienes datos obsoletos de redis, simplemente envía los datos obsoletos al cliente (usando ngx.eof(), el cliente puede cerrar esta conexión).
  4. y luego realiza una subsolicitud para poblar una nueva caché (usando lua-resty-lock, así que solo una solicitud se envía al servidor backend).

Sinopsis

upstream www {
    server 127.0.0.1:9999;
}
upstream redis {
    server 127.0.0.1:6379;
    keepalive 1024;
}
lua_shared_dict srcache_locks 1m;
location /api {
    set $cache_lock srcache_locks;
    set $cache_ttl /redisttl;
    set $cache_persist /redispersist;
    set $cache_key "$http_user_agent|$uri";
    set $cache_stale 100;
    set $cache_lock_exptime 30;
    set $cache_backend_lock_timeout 0.01;
    set $cache_lock_timeout 3;
    set $cache_lock_timeout_wait 0.06;
    set $cache_skip_fetch "X-Skip-Fetch";
    set_escape_uri $escaped_key $cache_key;

    rewrite_by_lua_file /usr/local/openresty/lualib/resty/cache.lua;

    if ($http_x_skip_fetch != TRUE){ srcache_fetch GET /redis $cache_key;}
    srcache_store PUT /redis2 key=$escaped_key&exptime=105;
    add_header X-Cache $srcache_fetch_status;
    add_header X-Store $srcache_store_status;
    #echo hello world;
    proxy_pass http://www;
}
location = /redisttl {
    internal;
    set_unescape_uri $key $arg_key;
    set_md5 $key;
    redis2_query ttl $key;
    redis2_pass redis;
}
location = /redispersist {
    internal;
    set_unescape_uri $key $arg_key;
    set_md5 $key;
    redis2_query persist $key;
    redis2_pass redis;
}
location = /redis {
    internal;
    set_md5 $redis_key $args;
    redis_pass redis;
}
location = /redis2 {
    internal;
    set_unescape_uri $exptime $arg_exptime;
    set_unescape_uri $key $arg_key;
    set_md5 $key;
    redis2_query set $key $echo_request_body;
    redis2_query expire $key $exptime;
    redis2_pass redis;
}

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-cache.