[nominatim-web] Use lua-resty-redis instead of ngx_redis and ngx_redis2



commit 5569078758153243673f7f820b8e0fbe9cbb9ecd
Author: Bartłomiej Piotrowski <bpiotrowski gnome org>
Date:   Wed May 27 11:20:55 2020 +0200

    Use lua-resty-redis instead of ngx_redis and ngx_redis2

 Dockerfile |  1 +
 nginx.conf | 26 +++++++++-----------------
 redis.lua  | 43 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 53 insertions(+), 17 deletions(-)
---
diff --git a/Dockerfile b/Dockerfile
index 5289888..37b7b32 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,2 +1,3 @@
 FROM openresty/openresty:1.15.8.3-2-buster
 ADD nginx.conf /usr/local/openresty/nginx/conf/nginx.conf
+ADD redis.lua /usr/local/openresty/nginx/redis.lua
diff --git a/nginx.conf b/nginx.conf
index 60edd5c..9689a11 100644
--- a/nginx.conf
+++ b/nginx.conf
@@ -34,9 +34,8 @@ http {
         server nominatim-int.gnome.org:80;
     }
 
-    upstream redis {
-        server redis.nominatim-web.svc.cluster.local:6379;
-        keepalive 300;
+    init_by_lua_block {
+        redis_svc = "redis.nominatim-web.svc.cluster.local"
     }
 
     server {
@@ -53,24 +52,17 @@ http {
             return ngx.req.get_uri_args()["accept-language"]
         }
 
-        location /redis-fetch {
+        location /redis {
             internal;
+            resolver local=on ipv6=off;
             set_md5 $redis_key $args;
-            redis_pass redis;
-        }
-
-        location /redis-store {
-            internal;
-            set_md5 $key $arg_key;
-            redis2_query set $key $echo_request_body;
-            redis2_query expire $key 2592000;
-            redis2_pass redis;
+            content_by_lua_file /usr/local/openresty/nginx/redis.lua;
         }
 
         location = /search {
             set $cache_key search_$lang$arg_limit$arg_q$arg_country$arg_state$arg_city$arg_street;
-            srcache_fetch GET /redis-fetch $cache_key;
-            srcache_store PUT /redis-store key=$cache_key;
+            srcache_fetch GET /redis key=$cache_key;
+            srcache_store PUT /redis key=$cache_key;
             srcache_store_no_cache on;
             srcache_response_cache_control off;
 
@@ -95,8 +87,8 @@ http {
             ';
 
             set $cache_key "reverse_$lang${arg_lat}x${arg_lon}";
-            srcache_fetch GET /redis-fetch $cache_key;
-            srcache_store PUT /redis-store key=$cache_key;
+            srcache_fetch GET /redis key=$cache_key;
+            srcache_store PUT /redis key=$cache_key;
             srcache_store_no_cache on;
             srcache_response_cache_control off;
 
diff --git a/redis.lua b/redis.lua
new file mode 100644
index 0000000..a444ecc
--- /dev/null
+++ b/redis.lua
@@ -0,0 +1,43 @@
+local method = ngx.req.get_method()
+local key = ngx.var.redis_key
+
+local redis = require "resty.redis"
+local red = redis:new()
+local ok, err = red:connect(redis_svc, 6379)
+
+if not ok then
+    ngx.log(ngx.ERR, err)
+    ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
+end
+
+if method == "GET" then
+    local res, err = red:get(key)
+
+    if err then
+        ngx.log(ngx.ERR, err)
+        ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
+    end
+
+    if res == ngx.null then
+        ngx.exit(ngx.HTTP_NOT_FOUND)
+    end
+
+    ngx.print(res)
+
+elseif method == "PUT" then
+    local value = ngx.req.get_body_data()
+
+    local ok, err = red:set(key, value, "EX", 2592000, "NX")
+    if not ok then
+        ngx.log(ngx.ERR, err)
+        ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)
+    end
+else
+    ngx.exit(ngx.HTTP_NOT_ALLOWED)
+end
+
+red:set_keepalive(30000, 128)
+if not ok then
+    ngx.log(ngx.ERR, err)
+    return
+end


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]