#注: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