Nginx内嵌lua连接Redis集群

在Nginx内执行lua脚本,连接redis集群;

在这里之前我们需要准备:

      1.Redis集群(请看本站文章https://blog.5858xy.xyz/index.php/Home/Index/article/aid/40); 

      2.Nginx分发层+应用层(支持lua)https://blog.5858xy.xyz/index.php/Home/Index/article/aid/42

我们使用在github上的lua的扩展包 https://github.com/steve0511/resty-redis-cluster

根据文章介绍安装相关的依赖包;

Nginx主要配置

#加载需要的LUA包 共享内存包->Redis扩展包->Redis集群包->Html模板渲染包
lua_package_path "/lua-packge/lua-resty-lock-0.07/lib/?.lua;;/lua-packge/lua-resty-redis-0.26/lib/?.lua;;
/lua-packge/resty-redis-cluster-master/lib/?.lua;;/lua-packge/lua-resty-http-0.12/lib/?.lua;;
/lua-packge/lua-resty-template-1.9/lib/?.lua;;";
#c++扩展包
lua_package_cpath "/lua-packge/resty-redis-cluster-master/lib/?.so;;";
#共享内存->上面引入了包,这里才可以使用
lua_shared_dict redis_cluster_slot_locks 100k;
#第一个work进行启动执行的文件,这个脚步主要定时从 Consul中读取Redis集群列表
init_worker_by_lua_file "/nginx-test/lua-project/init/init.lua";
 server {
        listen       80;
        server_name  localhost;
        set   $cachePATH   "/cache/";

        location / {
            default_type text/html;
            root /nginx-test/lua-project/html;
            #content_by_lua '
            #     ngx.header.content_type="text/html";
            #     ngx.say(ngx.var.cachePATH);
            #';
            content_by_lua_file "/nginx-test/lua-project/template.lua";

            #limit_req zone=two;
             #default_type text/html;
             #return 200  "$limit";
            #index  nginx.23673.html index.htm;

        }
}

template.lua文件内容

--连接集群
local config = {
    name = "testCluster",                   --Redis集群名称
    serv_list = {                           --Redis集群节点地址+端口
        { ip = "45.40.207.143", port = 6391 },
        { ip = "45.40.207.143", port = 6392 },
        { ip = "45.40.207.143", port = 6393 },
        { ip = "45.40.207.143", port = 6394 },
        { ip = "45.40.207.143", port = 6395 },
        { ip = "45.40.207.143", port = 6396 }
    },
    keepalive_timeout = 60000,              --redis connection pool idle timeout
    keepalive_cons = 1000,                  --redis connection pool size
    connection_timout = 1000,               --timeout while connecting
    max_redirection = 5,                    --maximum retry attempts for redirection,
    --auth = "pass"                           --set password while setting auth
}

local redis_cluster = require "rediscluster"
local red_c = redis_cluster:new(config)

--获取redis缓存的方法封装 如果没有获取到返回null
local function redis_get(key)
        local v, err = red_c:get(key)
        if err then
            ngx.log(ngx.ERR, "err: ", err)
            return
        end
        return v
end

--发送http请求
function read_http(url)
    local http = require("resty.http")
    local httpc = http.new()
    local resp, err = httpc:request_uri(url,{
       method = "GET"
    })
    if not resp then
      ngx.log(ngx.ERR,"request error: ", err)  --????
      return
    end
    httpc:close()
    return resp.body
end

--获取redis集群缓存
local re = redis_get("names")
--判断结果是否为空
if re==ngx.null then
   --请求php相关服务器
   --ngx.say(read_http("http://45.40.207.143:8003"))
   --请求转发给 location匹配php
    return ngx.exec('/php', 'a=3&b=5&c=6');
   else
   --获取到数据
   ngx.say(re)
end

注意:由于我的Redis集群是同一个公网,所有有时候会返回一个内网地址的ip,导致连接不上

解决方法: 3.2版本的redis集群超时(返回了容器ip),切换成redis4集群版本,声明当前可以被检测的ip地址;

MyAnswer博客


MyAnswer博客


init.lua脚步在nginx的第一个work进行启动时执行(现在只是测试定时效果)

--错误信息不会写入到erro.log当中,因为级别不够
--[[
  check = function()
    ngx.log(ngx.INFO,'111')
  end
]]
--写入错误日志函数
check = function()
   ngx.log(ngx.ERR,22222)
end
--定时执行  每隔3秒钟执行调用check函数
--只有第一个work进行才启动这个定时器,id为0,不然会导致多个定时启动
 local ok,err = ngx.timer.every(3,check)
 if not ok then
      ngx.log(ngx.err,"写入日志文件失败",err)
      return
 end


MyAnswer博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论