前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分布式--OpenResty+lua+Redis

分布式--OpenResty+lua+Redis

作者头像
aruba
发布于 2022-06-30 06:30:26
发布于 2022-06-30 06:30:26
79600
代码可运行
举报
文章被收录于专栏:android技术android技术
运行总次数:0
代码可运行

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

一、OpenResty

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

1. 添加repo
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /etc/yum.repos.d/
wget https://openresty.org/package/centos/openresty.repo
2. 安装openresty
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install openresty
3. 启动openresty

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/openresty/nginx/conf

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    server{
        listen 8080;
        location /{
                default_type text/html;
                content_by_lua 'ngx.say("hello openresty")';
        }
    }

启动openresty:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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重新加载配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-http.conf  -s reload
1.3 通过http访问
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl http://localhost/1.html

结果:

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

再次访问:

2. 设置Redis数据

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

2.1 修改nginx配置

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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重启:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./nginx -s stop
./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-http2.conf
2.2 访问测试
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl http://localhost/get
curl http://localhost/set

结果:

三、lua结合Nginx、Redis

官方介绍:https://github.com/openresty/lua-resty-redis

首先,OpenResty集成lua后,有三种调用lua的方式:

方式语法

描述

content_by_lua

最开始我们已经使用过了,它支持执行一条lua代码

content_by_lua_file

该语句支持执行一个lua脚本文件,也是用的最多的

content_by_lua_block

该语句支持执行一个lua代码块,针对一些简单场景使用

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

1. lua操作Redis数据

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

1.1 编写lua脚本

创建个目录存放lua脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir lua
vi control_redis.lua

内容为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 引入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脚本的绝对路径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./nginx -s stop
./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-lua.conf
1.3 测试
2. lua获取nginx中http的get请求参数
2.1 编写lua脚本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vi http_get.lua

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 返回的是一个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配置

新增端口监听:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    server {
        listen 8091;
        server_name localhost;

        location /get {
                default_type text/html;
                content_by_lua_file /usr/local/openresty/nginx/lua/http_get.lua;
        }
    }

重新加载配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-lua.conf -s reload
2.3 测试
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://192.168.42.4:8091/get?name=张三&age=19
3. lua获取nginx中http的post请求参数

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

3.1 编写lua脚本

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

键值对:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vi http_post_kv.lua

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 先读取下
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

请求体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vi http_post_body.lua

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 先读取下
ngx.req.read_body()
-- 再获取请求体
local body = ngx.req.get_body_data();

ngx.say(body)
3.2 修改nginx配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-lua.conf -s reload
3.3 测试

键值对:


请求体:

4. lua获取nginx中http的请求头
4.1 编写lua脚本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vi http_headers.lua

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local headers = ngx.req.get_headers()

for k,v in pairs(headers) do
        ngx.say("key:"..k.." value:"..v)
end
4.2 修改nginx配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    server {
        listen 8093;
        server_name localhost;

        location /headers {
                default_type text/html;
                content_by_lua_file /usr/local/openresty/nginx/lua/http_headers.lua;
        }
    }

重新加载配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./nginx -p /usr/local/openresty/nginx/ -c /usr/local/openresty/nginx/conf/nginx-lua.conf -s reload
4.3 测试

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nginx之Openresty基本使用解读
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
一个风轻云淡
2023/10/03
5600
4 OpenResty & Lua 处理各类Http请求
测试有不同的结果,form-data数据是混乱的,x-www-form-urlencoded才是正常的!
收心
2022/08/24
1.9K0
4 OpenResty & Lua 处理各类Http请求
OpenResty实战系列 | Nginx Lua API 接口开发
OpenResty 为开发者提供了一系列强大的API,这些API使得Lua脚本能够与Nginx紧密交互,从而高效地执行多种Web服务器任务。在处理Web服务器的核心工作流程中,主要包括三个环节:接收请求、处理请求以及输出响应。在接收请求时,我们能够获取到请求参数、请求头部以及请求体等关键信息。处理请求则涉及执行特定的Lua代码逻辑。至于输出响应,则需要设定响应状态码、自定义响应头部以及构造响应内容体。
Tinywan
2024/07/16
4010
OpenResty实战系列 | Nginx Lua API 接口开发
Openresty最佳案例 | 第4篇:OpenResty常见的api
获取请求参数 vim /usr/example/example.conf location /lua_var { default_type 'text/plain';
方志朋
2017/12/29
4.2K0
Openresty最佳案例 | 第4篇:OpenResty常见的api
大流量架构(二)之nginx篇
Nginx是一个主进程配合多个工作进程的工作模式,每个进程由单个线程来处理多个连接。
茶半香初
2021/11/26
6690
大流量架构(二)之nginx篇
亿级流量多级缓存 - Lua整合Redis/Nginx
Lua 是由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于1993年开发的一种轻量、小巧的脚本语言,用标准 C 语言编写,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Parker
2020/07/21
1.3K0
OpenResty实战系列 | Lua脚本开发 Hello World
为了方便开发,我们在本地配置一个虚拟访问域名:http://openresty.tinywan.com
Tinywan
2024/07/16
1490
OpenResty实战系列 | Lua脚本开发 Hello World
分布式--OpenResty+lua+Redis实现限流与防爬虫
上篇分布式--OpenResty+lua+Redis中,我们了解了nginx结合lua脚本的强大之处,lua结合反向代理,可以对http请求提前做一些处理,来保证业务服务器的安全性和单一职责原则,以及结合Redis提升读写缓存的效率与持久化能力
aruba
2022/09/01
9370
分布式--OpenResty+lua+Redis实现限流与防爬虫
OpenResty的安装与使用
OpenResty是一个基于Nginx与Lua的高性能Web平台,可以用于Web服务动态网关等,能够处理极高的并发。所以对于我们来说学好OpenResty是很有必要的。
杜金房
2024/05/11
7510
OpenResty的安装与使用
Nginx高级应用:lua + OpenResty
而对于首页这种,高访问,且 页面数据并不是,经常的变化! 为了减轻服务器的压力,直接将其制作成一个 静态的页面进行展示!
Java_慈祥
2024/08/06
4170
Nginx高级应用:lua + OpenResty
nginx+lua+redis+OpenResty缓存,限流
-一般采用脚本式编程。(例如:编写一个hello.lua的文件,输入文件内容,并执行lua hell.lua即可)
高大北
2022/06/14
9050
nginx+lua+redis+OpenResty缓存,限流
041. 通过 Lua 扩展 Nginx
1. ngx_lua 模块 ---- Nginx 模块需要用 C 开发,而且必须符合一系列复杂的规则,最重要的用 C 开发模块必须要熟悉 Nginx 的源代码,使得开发者对其望而生畏。 ngx_lua 模块通过将 lua 解释器集成进 Nginx,可以采用 lua 脚本实现业务逻辑。 该模块具有以下特性: 高并发、非阻塞地处理各种请求。 Lua 内建协程,这样就可以很好地将异步回调转换成顺序调用的形式。 每个协程都有一个独立的全局环境(变量空间),继承于全局共享的、只读的“comman d
山海散人
2021/03/03
8570
041. 通过 Lua 扩展 Nginx
OpenResty解决的第一个问题
可参考 http://openresty.org/en/linux-packages.html
龟仙老人
2020/12/15
1.1K0
7.Nginx实践之使用Lua-nginx模块脚本连接Redis数据库读取静态资源并隐式展现
本章目录 [TOC] 0x00 前言简述 为啥有此篇文章? 描述: 在进行公司的图片存储解决方案研究中,最开始准备使用的是FastDFS,但是经过深思熟虑,以及后期运维成本考虑还是放弃了,只能转而使用
全栈工程师修炼指南
2022/09/29
3.2K1
7.Nginx实践之使用Lua-nginx模块脚本连接Redis数据库读取静态资源并隐式展现
nginx扩展 OpenResty 实现防cc攻击教程
1、1-12行是限速功能实现,第5和第10行表示10秒钟内容最多只能请求20次。
NorthS
2023/03/21
1.6K0
Nginx+Lua+Redis实现高性能缓存数据读取
前些日子,入手了本开涛写的《亿级流量网站架构核心技术》,里面提到nginx+lua相结合开发高并发、高负载下的服务,看着手痒就立个task,有时间尝试一翻,随手也把操作步骤记录下来,有兴趣的朋友也可以试试。
MavenTalker
2023/03/08
1.3K0
Nginx+Lua+Redis实现高性能缓存数据读取
并发编程之缓存:OpenResty+lua实现一级缓存
因为缓存属于业务模块,因此需要在cache1000和cache1001两台机器上配置Nginx的缓存,如下图:
一行Java
2022/04/06
1.2K0
并发编程之缓存:OpenResty+lua实现一级缓存
Openresty最佳案例 | 第7篇: 模块开发、OpenResty连接Redis
方志朋
2017/12/29
3K0
Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
方志朋
2017/12/29
3.2K0
Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
手把手教你使用 OpenResty 搭建高性能服务端!
Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select、poll、epoll是Linux API提供的I/O复用方式,自从Linux2.6中加入了epoll之后,高性能服务器领域得到广泛的应用,Nignx就是使用epoll来实现I/O复用支持高并发。
用户2781897
2020/11/10
2.3K0
手把手教你使用 OpenResty 搭建高性能服务端!
相关推荐
Nginx之Openresty基本使用解读
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验