nginx 學習筆記(五)nginx_lua 如何鏈接redis

安裝redisnginx

下載redis

wget http://download.redis.io/releases/ redis-5.0-rc4.tar.gzjson

 解壓安裝配置cookie

make, sudo make installui

運行redislua

配置文件:redis.conf能夠編輯相關內容,默認端口是6379url

啓動redisspa

切換到 redis解壓的目錄的src下面執行 ./redis-server & 使其後臺運行rest

 

一、對應的nginx.conf配置以下,須要在http模塊中添加以下配置,否則在redis.lua中引入的包會報找不到對應的引用錯誤。日誌

http {
   lua_package_path 
  "/usr/local/openresty/nginx/conf/waf/?.lua;/usr/local/openresty/lualib/resty/?.lua;;";
   lua_package_cpath "/usr/local/openresty/lualib/?.so;;";
   lua_shared_dict limit 10m;
   init_by_lua_file /usr/local/openresty/nginx/conf/waf/init.lua;
   access_by_lua_file /usr/local/openresty/nginx/conf/waf/waf.lua;


......其餘省略.........
}

 

二、nginx_lua 如何鏈接redis,對應的lua腳本(redis.lua)以下。

local cjson = require "cjson"
local redis = require "resty.redis" 
-- 是否須要開啓redis的日誌
attackredislog = "on"
--log存儲目錄,該目錄須要用戶本身新建,切須要用戶的可寫權限
logdir = "/usr/local/openresty/nginx/logs/hack/"

function redislog(method,data)
    if attackredislog then
	    local servername=ngx.var.server_name
		line = ""..method.." \""..data.."\" \n"
        local filename = logdir..'/'..servername.."_"..ngx.today().."_redis.log"
        write(filename,line)
    end
end

function write(logfile,msg)
    local fd = io.open(logfile,"ab")
    if fd == nil then return end
    fd:write(msg)
    fd:flush()
    fd:close()
end

--------------------------------------------------------


local function close_redis(red)
    if not red then
        return
    end
    --釋放鏈接(鏈接池實現)
    local pool_max_idle_time = 10000 --毫秒
    local pool_size = 100 --鏈接池大小
    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
 
    if not ok then
	   redislog("redis keepalive","set redis keepalive error,"..err.."")
    end
end
 

local red = redis:new()
red:set_timeout(1000)
local ip = "127.0.0.1"
local port = 6379
local ok, err = red:connect(ip,port)
if not ok then
    return close_redis(red)
end


function setRedis(key, val)
  local ok, err = red:set(key, val)
   -- 設置值的有效期爲60秒
   ok, err = red:expire(key,60)
   if not ok then
    redislog("redis set","failed to set "..key..","..err.."")
    return
    end
end
 
function getRedis(key)
    local res, err = red:get(key)
    if not res then
	redislog("redis get","failed to get,"..err.." ")
    return 
   end
 
  if res == ngx.null then
    redislog("redis get"," "..key.." not found")
    return nil
  else
    return res
  end
end


local ck = ngx.var.http_cookie
local scheme = ngx.var.scheme  
local server_name = ngx.var.server_name
local request_uri = ngx.var.request_uri
local server_port = ngx.var.server_port
local url = scheme.."://"..server_name..":"..server_port..request_uri
local value
if (ck ~= nil) then
 value = getRedis(ck)
end


close_redis(red)
相關文章
相關標籤/搜索