分布式--OpenResty+lua+Redis

前面我们已经使用了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的基本使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容