Nginx 安装 Lua + Redis

羊舌炯
2023-12-01

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)

 类似资料: