Zum Inhalt

cache: Http-Cache zu Redis, kann veraltete Antworten bereitstellen, und verwendet "lua-resty-lock", um nur eine Anfrage zuzulassen, die einen neuen Cache befüllt

Installation

Wenn Sie das RPM-Repository-Abonnement noch nicht eingerichtet haben, melden Sie sich an. Dann können Sie mit den folgenden Schritten fortfahren.

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

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-cache v1.0.0, veröffentlicht am 07. August 2015.


eine Lua-Bibliothek, um mit srcache zu arbeiten, kann veraltete Antworten bereitstellen, und verwendet "lua-resty-lock", um nur eine Anfrage zuzulassen, die einen neuen Cache befüllt.

  1. Wenn der Cache fehlt, überspringen Sie srcache_fetch und machen Sie eine einzelne Anfrage, um einen neuen Cache zu befüllen. Die andere Anfrage mit demselben cache_key wartet einfach auf den erfolgreichen Cache-Update.
  2. Setzen Sie immer die Redis-Ablaufzeit auf (reale Ablaufzeit + veraltete Zeit), damit die veralteten Daten aus Redis gefunden werden können.
  3. Wenn veraltete Daten von Redis abgerufen werden, senden Sie einfach die veralteten Daten an den Client (unter Verwendung von ngx.eof(), der Client kann diese Verbindung schließen).
  4. Und dann machen Sie eine Unteranfrage, um einen neuen Cache zu befüllen (unter Verwendung von lua-resty-lock, sodass nur eine Anfrage an den Backend-Server gesendet wird).

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

Sie finden zusätzliche Konfigurationstipps und Dokumentation für dieses Modul im GitHub-Repository für nginx-module-cache.