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.
- 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.
- Setzen Sie immer die Redis-Ablaufzeit auf (reale Ablaufzeit + veraltete Zeit), damit die veralteten Daten aus Redis gefunden werden können.
- 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).
- 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.