美文网首页分布式
分布式--OpenResty+lua+Redis

分布式--OpenResty+lua+Redis

作者: aruba | 来源:发表于2022-06-28 16:12 被阅读0次

    前面我们已经使用了nginx,它拥有丰富的模块供我们使用,由于nginx是由c语言编写而成的,所以以前编写模块就必须使用c/c++,后来,有人将lua解释器继承到了nginx中,内建了ngx_lua模块,至此,nginx支持了lua

    一、OpenResty

    OpenResty是基于nginx开源版本的一个扩展版本,集成了大量的lua库

    1. 添加repo

    cd /etc/yum.repos.d/
    wget https://openresty.org/package/centos/openresty.repo
    

    2. 安装openresty

    yum install openresty
    

    3. 启动openresty

    openresty默认安装路径为/usr/local/openresty/,其中有个nginx目录,关于openresty的启动和配置都和以前nginx相同

    cd /usr/local/openresty/nginx/conf
    

    修改openresty的http模块配置,新增server模块,使用content_by_lua执行一段lua代码:

        server{
            listen 8080;
            location /{
                    default_type text/html;
                    content_by_lua 'ngx.say("hello openresty")';
            }
        }
    

    启动openresty:

    cd /usr/local/openresty/nginx/sbin/
    ./nginx -p /usr/local/openresty/nginx/
    

    浏览器访问8080端口:

    二、http访问Redis

    上面完成了nginx执行lua语句,接下来来看nginx如何访问Redis
    Redis环境搭建可以看之前的文章:分布式--Redis的安装与数据类型的使用

    1. 获取Redis数据

    下面是通过nginx获取Redis中key对应的value

    1.1 启动Redis

    启动一个默认6379端口的Redis即可,下面还有我之前搭建的Redis集群:

    1.2 修改nginx配置
    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        server {
            listen       80;
            server_name  localhost;
    
            location / {
                    default_type text/plain;
                    # 设置获取redis中key为m的值
                    set $redis_key "m";
                    redis_pass 127.0.0.1:6379;
                    
                    # 如果发生404,就交由@fetch处理
                    error_page 404 = @fetch;
            }
                    
            location @fetch {
                    root html;
            }
    
        }
    }
    

    nginx重新加载配置:

    ./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-http.conf  -s reload
    
    1.3 通过http访问
    curl http://localhost/1.html
    

    结果:

    redis客户端设置m的键值对:

    再次访问:

    2. 设置Redis数据

    上面方式1,只是获取了Redis的数据,那么如何设置Redis键值对呢?如果nginx支持redis的指令就好了,实际上nginx是支持的

    2.1 修改nginx配置

    可以使用redis2_query后面跟上redis的指令,来设置值,同样也能使用redis指令获取值:

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        server {
            listen       80;
            server_name  localhost;
    
            location /get {
                    # 设置个变量
                    set_unescape_uri $key "n";
                    redis2_query get $key;
                    redis_pass 127.0.0.1:6379;
    
                    # 如果发生404,就交由@fetch处理
                    error_page 404 = @fetch;
            }
    
            location /set {
                    # 设置个变量
                    set_unescape_uri $key "n";
                    redis2_query set $key "hello2";
                    redis2_pass 127.0.0.1:6379;
            }
    
            location @fetch {
                    root html;
            }
    
        }
    }
    

    nginx重启:

    ./nginx -s stop
    ./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-http2.conf
    
    2.2 访问测试
    curl http://localhost/get
    curl http://localhost/set
    

    结果:

    三、lua结合Nginx、Redis

    官方介绍:https://github.com/openresty/lua-resty-redis
    首先,OpenResty集成lua后,有三种调用lua的方式:

    方式语法 描述
    xxx_by_lua 最开始我们已经使用过了,它支持执行一条lua代码
    xxx_by_lua_file 该语句支持执行一个lua脚本文件,也是用的最多的
    xxx_by_lua_block 该语句支持执行一个lua代码块,针对一些简单场景使用

    下面来使用lua与Redis进行交互

    1. lua操作Redis数据

    lua操作Redis,步骤是引入Redis模块,连接Redis,然后再操作

    1.1 编写lua脚本

    创建个目录存放lua脚本:

    mkdir lua
    vi control_redis.lua
    

    内容为:

    -- 引入redis模块
    local redis = require("resty.redis")
    -- 创建个redis对象
    local red = redis:new()
    
    -- 1. 连接redis
    -- 多参数返回
    local ok,err = red:connect("127.0.0.1",6379)
    if not ok then
            ngx.say("connect failed:",err)
            return
    end
    
    -- 2. 设置redis的键值对
    ok,err = red:set("luaKey","luaValue")
    if not ok then
            ngx.say("set faild:",err)
            return
    end
    
    -- 3. 读取redis的键值对
    ret = red:get("luaKey")
    ngx.say("read luaKey value:",ret)
    
    return
    
    1.2 修改nginx配置

    使用content_by_lua_file指定lua脚本的绝对路径:

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        server {
            listen       8090;
            server_name  localhost;
    
            location / {
                    default_type text/html;
                    content_by_lua_file /usr/local/openresty/nginx/lua/control_redis.lua;
            }
    
        }
    }
    

    重启nginx:

    ./nginx -s stop
    ./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-lua.conf
    
    1.3 测试

    2. lua获取get请求参数

    2.1 编写lua脚本
    vi http_get.lua
    

    使用ngx.req.get_uri_args()获取,内容为:

    -- 返回的是一个table类型
    local args = ngx.req.get_uri_args()
    
    
    for k,v in pairs(args) do
            ngx.say("key:"..k.."value:"..v)
    end
    
    2.2 修改nginx配置

    新增端口监听:

        server {
            listen 8091;
            server_name localhost;
    
            location /get {
                    default_type text/html;
                    content_by_lua_file /usr/local/openresty/nginx/lua/http_get.lua;
            }
        }
    

    重新加载配置文件:

    ./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-lua.conf -s reload
    
    2.3 测试
    http://192.168.42.4:8091/get?name=张三&age=19
    

    3. lua获取post请求参数

    post请求有两种:body键值对和body请求体。后者对应现在流行的json格式

    3.1 编写lua脚本

    post请求参数的获取都需要先调用ngx.req.read_body()方法

    键值对:

    vi http_post_kv.lua
    

    使用ngx.req.get_post_args()获取,内容为:

    -- 先读取下
    ngx.req.read_body()
    -- 再获取
    local params = ngx.req.get_post_args()
    
    for k,v in pairs(params) do 
            ngx.say("key:"..k.." value:"..v)
    end
    

    请求体:

    vi http_post_body.lua
    

    使用ngx.req.get_body_data()获取,内容为:

    -- 先读取下
    ngx.req.read_body()
    -- 再获取请求体
    local body = ngx.req.get_body_data();
    
    ngx.say(body)
    
    3.2 修改nginx配置
        server {
            listen 8092;
            server_name localhost;
    
            location /post_kv {
                    default_type text/html;
                    content_by_lua_file /usr/local/openresty/nginx/lua/http_post_kv.lua;
            }
            
            location /post_body {
                    default_type text/html;
                    content_by_lua_file /usr/local/openresty/nginx/lua/http_post_body.lua;
            }
        }
    

    重新加载nginx配置:

    ./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-lua.conf -s reload
    
    3.3 测试

    键值对:


    请求体:

    4. lua获取请求头

    4.1 编写lua脚本
    vi http_headers.lua
    

    请求头通过ngx.req.get_headers()获取,内容为:

    local headers = ngx.req.get_headers()
    
    for k,v in pairs(headers) do
            ngx.say("key:"..k.." value:"..v)
    end
    
    4.2 修改nginx配置
        server {
            listen 8093;
            server_name localhost;
    
            location /headers {
                    default_type text/html;
                    content_by_lua_file /usr/local/openresty/nginx/lua/http_headers.lua;
            }
        }
    

    重新加载配置文件:

    ./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-lua.conf -s reload
    
    4.3 测试

    以上就是openresty+lua+redis的基本使用

    相关文章

      网友评论

        本文标题:分布式--OpenResty+lua+Redis

        本文链接:https://www.haomeiwen.com/subject/nzruvrtx.html