CentOS7利用openresty和Redis通过lua脚本动态配置Nginx反向代理地址

1 篇文章 0 订阅
1 篇文章 0 订阅

#注:openresty 自带Nginx,所以要先卸载或者停掉原来系统的Nginx

1. 安装openresty

简单,通过官方教程安装数据源,然后执行命令安装即可

# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/

# update the yum index:
sudo yum check-update

sudo yum install openresty

2. 安装Redis

建议通过docker 安装,最简单,网上很多教程

3.Nginx配置.conf中的lua脚本编写

location /videos/ {
            
            set $target '';--全局变量定义
            set $access_token '';
            access_by_lua '
            function Split(szFullString, szSeparator) --定义字符串拆分函数
  local nFindStartIndex = 1
  local nSplitIndex = 1
  local nSplitArray = {}
  while true do
   local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
   if not nFindLastIndex then
    nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
    break
   end
   nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
   nFindStartIndex = nFindLastIndex + string.len(szSeparator)
   nSplitIndex = nSplitIndex + 1
  end
  return nSplitArray
  end
            local rq=ngx.var.request_uri --从请求中解析出对应redis 的key ,请求格式示例:Http://domain.com/xxx/key/da.jpg
                local arr=Split(rq,"/")
            local key = arr[3]-- 取第三个为key(index 从1开始)
                local redis = require "resty.redis"  --引入redis模块
            local function close_redis(red)  --定义关闭Redis连接函数
    if not red then  
        return  
    end  
    local ok, err = red:close()  
    if not ok then  
        ngx.say("close redis 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  
    ngx.say("connect to redis error : ", err)  
    return close_redis(red)  
 end
 ok, err = red:auth("*******") --Redis认证,如果没有设置密码就不需要
if not ok then
    ngx.say("failed to auth: ", err)
    return close_redis(red)
end
--调用API获取key值  
local resp, err = red:get(key)  --根据上面的key开始读取Redis数据
if not resp then  
    ngx.say("get msg error : ", err)  
    return close_redis(red)  
end
                
                local path="" --构建url key后部分的链接
                for i = 4,#arr do
                    if(arr[i]~="")
                    then
                   path=path.."/"..arr[i]
                   end
                end
                local cjson = require "cjson" --解析Redis里的json数据
                local data = cjson.decode(resp);
                local url=data["url"]
                local token=data["token"]
                
                ngx.var.target =url..path;--复制到全局变量
                ngx.var.access_token =token;
                --ngx.say(server..path)
            ';
            proxy_set_header Authorization $access_token;--开始动态设置反代参数
           
            proxy_hide_header Strict-Transport-Security; #隐藏协议头,避免因为反向代理开启hsts
            proxy_pass $target;
            add_header content-type "video/mpeg4";
        }

Redis 中的json数据格式为(注意url后面不能带“/”):

{
"url":"http://dasdas/dasd/adada",
"token":"****"
}

示例:
Redis中配置key为 s0,key对应的json数据为

{
"url":"http://domain/vvv/aaa",
"token":"****"
}

假如服务地址为http://service.com/,则当我们访问 http://service.com/videos/s0/a.jpg,系统生成的反向代理地址为 http://domain/vvv/aaa/a.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值