1.安装lua
1.1安装LuaJIT
[root@lab233 testzpynginx]# wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
[root@lab233 testzpynginx]# tar -zxvf LuaJIT-2.0.5.tar.gz
[root@lab233 testzpynginx]# cd LuaJIT-2.0.5
[root@lab233 LuaJIT-2.0.5]# make PREFIX=/usr/local/luajit
[root@lab233 LuaJIT-2.0.5]# make install PREFIX=/usr/local/luajit
1.2配置LuaJIT环境变量
[root@lab233 LuaJIT-2.0.5]# vim /etc/profile
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
1.3 lua安装测试
2.ngx_devel_kit和lua-nginx-module
ngx_devel_kit简称NDK,提供函数和宏处理一些基本任务,减轻第三方模块开发的代码量。
lua-nginx-module是nginx的lua模块
下载ngx_devel_kit(NDK)模块
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
tar -xzvf v0.2.19.tar.gz
lua-nginx-module 模块
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.2.tar.gz
tar -xzvf v0.10.2.tar.gz
3.查看已安装好的nginx
nginx -V可查看已经编译的配置(可在nginx -V得到的配置下重新安装,下面还是采用的默认配置)
[root@lab233 testzpynginx]# cd nginx-1.6.2
[root@lab233 nginx-1.6.2]# /home/sms/zhupy/testzpynginx/nginx-1.6.2/sbin/nginx -V
把原来的参数配置保留
进入nginx目录,安装扩展 加上 lua-nginx-module ,ngx_devel_kit
./configure --prefix=/home/sms/zhupy/testzpynginx/nginx-1.6.2 --with-http_stub_status_module --with-http_ssl_module --with-pcre=/home/sms/zhupy/pcre-8.35 --add-module=/home/sms/zhupy/testzpynginx/ngx_devel_kit-0.2.19 --add-module=/home/sms/zhupy/testzpynginx/lua-nginx-module-0.10.2
重新编译安装 执行命令
[root@lab233 nginx-1.6.2]# make
[root@lab233 nginx-1.6.2]# make install
4. nginx引入lua调试
在nginx.conf中加入
server {
listen 5801;
server_name localhost;
location /hello_lua {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
}
重启nginx 访问
代表配置成功
5.实现lua连接redis 集群
下载lua-redis-cluster(连接redis-cluster集群)
下载地址https://github.com/onlonely/lua-redis-cluster
然后解压
(这个lua-redis-cluster连接的时候没有密码的连接,故需要修改源码)
源码已经修改 可以直接用修改后的这个包 集群jq.lua脚本也在里面
下载地址 https://download.csdn.net/download/qq_39477018/13611698
Nginx配置
location /h5html {
default_type 'text/plain';
#lua_code_cache off;
content_by_lua_file '/home/sms/zhupy/nginx-1.6.2/conf/lua/jq.lua'; #jq.lua脚本的存放地址
}
编写连接redis集群jq.lua脚本
--引入redis-cluster扩展包
package.path ="/home/sms/zhupy/lua-redis-cluster-master/?.lua;;" --扩展包的路径按自己的路径进行修改
ngx.header.content_type="text/plain";
-- 构建redis集群
local function redis_cluster_init ()
local redis_cluster = require "resty.redis_cluster"
local cluster_id = "mymaster"
local startup_nodes = {
{"192.168.150.131",6000},--集群 主机
{"192.168.150.132",6000}--集群 从机
}
local opt = {
timeout = 1000,--执行超时时间
keepalive_size = 50,--长连接数量
keepalive_duration = 60000, --长连接保持时间
auth="aaa", --设置密码
}
rc = redis_cluster:new(cluster_id, startup_nodes, opt)
return rc
end
local redis = redis_cluster_init();
--字符串按指定符号分割的方法
function string.split(input, delimiter)
input = tostring(input)
delimiter = tostring(delimiter)
if (delimiter=='') then return false end
local pos,arr = 0, {}
-- for each divider found
for st,sp in function() return string.find(input, delimiter, pos, true) end do
table.insert(arr, string.sub(input, pos, st - 1))
pos = sp + 1
end
table.insert(arr, string.sub(input, pos))
return arr
end
--得到请求地址的url 并分割
local res = string.split(ngx.var.uri, "/")
--ngx.say(res)
--ngx.say("====res1",res[1])
--ngx.say("====res2",res[2])
--ngx.say("===res3",res[3])
--ngx.say("===res3",res[4])
local key=res[3];--得到appShortName
local field=res[4];-- 得到主键id
local url,err=redis:hget(key,field)--获取hash格式的值
if not url then
url=""
end
if url == ngx.null then
url = "";
end
--获取到redis中的文件地址后直接进行跳转
return ngx.redirect(url)
重启nginx 访问重定向跳转
6.实现lua连接redis单机
下载lua-redis-cluster(连接单机redis)
下载地址 https://github.com/openresty/lua-resty-redis
然后解压
编辑nginx.conf脚本 增加
location /zpy {
default_type 'text/html';
#lua_code_cache off;
content_by_lua_file /home/sms/zhupy/nginx-1.6.2/conf/lua/zpy.lua; #lua文件的地址
}
编写zpy.lua 脚本
package.path = "/home/sms/zhupy/lua-resty-redis-master/lib/?.lua;;"; --引入 下载的单机lua-resty-redis-master 的包
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
ngx.say("set keepalive error : ", err)
end
end
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(1000)
local ip = "127.0.0.1"
local port = 6370
local ok, err = red:connect(ip, port)
if not ok then
ngx.say("connect to redis error : ", err)
return close_redis(red)
end
local res, err = red:auth("zpy")
if not res then
ngx.say("failed to authenticate: ", err)
return
end
ok, err = red:set("msg", "hello world")
if not ok then
ngx.say("set msg error : ", err)
return close_redis(red)
end
local resp, err = red:get("zpy")
if not resp then
ngx.say("get msg error : ", err)
return close_redis(red)
end
if resp == ngx.null then
resp = ''
end
ngx.say("msg : ", resp)
close_redis(red)