Aller au contenu

cache: Cache Http vers redis, peut servir des réponses obsolètes, et en utilisant "lua-resty-lock" permet seulement une requête pour peupler un nouveau cache

Installation

Si vous n'avez pas encore configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

CentOS/RHEL 7 ou 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

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-cache v1.0.0 publié le 07 août 2015.


une bibliothèque lua pour travailler avec srcache, peut servir des réponses obsolètes, et en utilisant "lua-resty-lock" permet seulement une requête pour peupler un nouveau cache.

  1. si le cache est manquant, sautez le srcache_fetch, et faites une seule requête pour peupler un nouveau cache, l'autre requête avec le même cache_key, attend juste la mise à jour réussie du cache.
  2. définissez toujours l'expiration redis à (temps d'expiration réel + temps obsolète), afin de pouvoir trouver les données obsolètes dans redis.
  3. si vous obtenez des données obsolètes de redis, envoyez simplement les données obsolètes au client (en utilisant ngx.eof(), le client peut fermer cette connexion.)
  4. puis faites une sous-requête pour peupler un nouveau cache (en utilisant lua-resty-lock, donc une seule requête envoyée au serveur backend).

Synopsis

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

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-cache.