1、安装 ngx_devel_kit
cd /usr/local/src
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
tar -zxvf v0.3.0.tar.gz
2、安装 lua-nginx-module
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
tar -zxvf v0.10.13.tar.gz
3、安装 lua 编译器
wget https://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar -zxvf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
make install PREFIX=/usr/local/luajit
# 配置环境变量,不然无法安装
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
4、安装 nginx
CentOS 6.8 编译安装 Nginx 和 echo-nginx-module 模块_tom.ma的博客-CSDN博客
# 修改编译参数
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--add-module=/usr/local/src/ngx_devel_kit-0.3.0 \
--add-module=/usr/local/src/lua-nginx-module-0.10.13
5、建立软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
ln -s /usr/local/luajit/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
6、验证
vim /usr/local/nginx/conf/nginx.conf
# 在 server 标签里填加一个
location /hello {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
7、访问
curl http://192.168.2.103/hello
# 返回结果
hello, lua
8、Nginx 调用 Lua 指令
模块语法lua指令:
set_by_lua # 设置nginx变量 可以实现复杂赋值逻辑
set_by_lua_file # 设置nginx变量 可以实现复杂赋值逻辑
access_by_lua # 请求访问阶段处理,用于访问控制
access_by_lua_file # 请求访问阶段处理,用户访问控制
content_by_lua # 内容处理器,处理接受和响应输出
content_by_lua_file # 内容处理器,处理接受和响应输出
nginx lua api
ngx.var nginx # 变量
ngx.req.get_headers # 获取请求头
ngx.req.get_uri_args # 获取url请求参数
ngx.redirect # 重定向
ngx.print # 输出响应内容体
ngx.say # 输出响应内容体,但最后会输出一个换行符
ngnx.header # 输出响应头
lua-resty-redis,是一个lua语言的redis API,使用socket(lua sock)和redis通信
git clone https://github.com/openresty/lua-resty-redis.git
mkdir /usr/local/nginx/lua
cp lua-resty-redis/lib/resty/redis.lua /usr/local/nginx/lua/
10、配置
http {
# 引入 redis.lua 包
lua_package_path "/usr/local/nginx/lua/redis.lua";
......
location /redis{
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/local/nginx/conf/conf.d/test-redis.lua;
}
...........
}
11、test-redis.lua
local function close_redis(redis_instance)
if not redis_instance then
return
end
local ok,err = redis_instance:close();
if not ok then
ngx.say("close redis error : ",err);
end
end
local redis = require("resty.redis");
-- 创建一个redis对象实例。在失败,返回nil和描述错误的字符串的情况下
local redis_instance = redis:new();
-- 设置后续操作的超时(以毫秒为单位)保护,包括connect方法
redis_instance:set_timeout(1000)
-- 建立连接
local ip = '127.0.0.1'
local port = 6379
-- 尝试连接到redis服务器正在侦听的远程主机和端口
local ok,err = redis_instance:connect(ip,port)
if not ok then
ngx.say("connect redis error : ",err)
return close_redis(redis_instance);
end
-- Redis身份验证
-- local auth,err = redis_instance:auth("");
-- if not auth then
-- ngx.say("failed to authenticate : ",err)
-- end
-- 调用API进行处理
local resp,err = redis_instance:set("msg","hello world")
if not resp then
ngx.say("set msg error : ",err)
return close_redis(redis_instance)
end
-- 调用API获取数据
local resp, err = redis_instance:get("msg")
if not resp then
ngx.say("get msg error : ", err)
return close_redis(redis_instance)
end
-- 得到的数据为空处理
if resp == ngx.null then
resp = 'this is not redis_data' --比如默认值
end
ngx.say("msg : ", resp)
close_redis(redis_instance)