news 2026/2/10 4:57:37

Openresty驱动下的高性能Web网关实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Openresty驱动下的高性能Web网关实战

openresty 安装

(1)下载源压缩包:

代码语言:Bash

自动换行

AI代码解释

wget https://openresty.org/download/openresty-1.21.4.1.tar.gz

(2)安装依赖:

代码语言:Bash

自动换行

AI代码解释

sudo apt-get install libpcre3-dev libssl-dev perl make build-essential curl

(3)解压源码:

代码语言:Bash

自动换行

AI代码解释

tar -xzvf openresty-1.21.4.1.tar.gz

(4)配置:默认, --prefix=/usr/local/openresty 程序会被安装到/usr/local/openresty目录。

代码语言:Bash

自动换行

AI代码解释

cd openresty-1.21.4.1 ./configure

(5)编译和安装:

代码语言:Bash

自动换行

AI代码解释

make -j2 sudo make install

(6)设置环境:

代码语言:Bash

自动换行

AI代码解释

cd ~ export PATH=/usr/local/openresty/bin:$PATH

(7)测试:

代码语言:Bash

自动换行

AI代码解释

~$ openresty -v nginx version: openresty/1.21.4.1

启动、关闭、重启 openresty:

展开

代码语言:Bash

自动换行

AI代码解释

# 指定配置启动 openresty # 需要指定工作目录,示例中的 . 表示当前目录为工作目录。 openresty -p . -c conf/nginx.conf # 优雅退出 openresty -p . -s quit # 重启 openresty openresty -p . -s reload

三、开发实践:content_by_lua 阶段

(1)新建一个项目文件夹,项目文件夹新建三个子文件夹,分别是app、conf、logs,分别用来存放编写的应用程序、配置文件、日志文件。

代码语言:Bash

自动换行

AI代码解释

mkdir my_openresty cd my_openresty mkdir app mkdir conf mkdir logs

(2)在conf下创建nginx.conf文件,输入以下内容:

展开

代码语言:Bash

自动换行

AI代码解释

worker_processes 2; events { worker_connections 10240; } ####################### # 以下为配置块 ####################### # http 协议 http { #虚拟主机 server { listen 8989; # 处理http请求 # 捕获和处理 location / { # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } } } # # tcp 使用stream # # stream{ # #}

(3)openresty启动nginx:

代码语言:Bash

自动换行

AI代码解释

openresty -p . -c conf/nginx.conf

(4)查看nginx启动状态:

代码语言:Bash

自动换行

AI代码解释

ps aux | grep nginx

执行结果:

代码语言:JavaScript

自动换行

AI代码解释

fly 15341 0.0 0.0 33264 1272 ? Ss 17:23 0:00 nginx: master process openresty -p . -c conf/nginx.conf fly 15342 0.0 0.3 37516 7276 ? S 17:23 0:00 nginx: worker process fly 15343 0.0 0.3 37516 7276 ? S 17:23 0:00 nginx: worker process fly 15345 0.0 0.0 15984 968 pts/2 S+ 17:23 0:00 grep --color=auto nginx

(5)在浏览器输入服务器IP和端口,可以看到如下的结果:

四、开发实践:rewrite_by_lua 阶段

rewrite_by_lua阶段是 Nginx 请求处理的早期阶段,主要是 URL 重写或执行内部/外部重定向。在access阶段之前执行,所以非常适合进行请求的预处理。

nginx.conf文件,输入以下内容:

展开

代码语言:Bash

自动换行

AI代码解释

worker_processes 2; events { worker_connections 10240; } ####################### # 以下为nginx配置块 ####################### # http 协议 http { #虚拟主机 server { listen 8989; # 处理http请求 # 捕获和处理 location / { # 初始化数据,可以在此阶段加载耗时模块、设置全局变量 # init_by_lua_block { # gloabl_a=100 # } # 用于执行内部url重写或外部重定向 rewrite_by_lua_block { local args = ngx.req.get_uri_args() if args["jump"] == "1" then return ngx.redirect("http://baidu.com") elseif args["jump"] == "2" then return ngx.redirect("/jump_here") end } # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } # rewrite_by_lua不止能跳转到外部,也可以内部跳转 location /jump_here { # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello, jump_here","\t",ngx.var.remote_addr) } } } } # # tcp 使用stream # # stream{ # #}

没有启动openresty,则输入如下命令启动:

代码语言:Bash

自动换行

AI代码解释

openresty -p . -c conf/nginx.conf

如果是之前已经启动了,只需要reload即可:

代码语言:Bash

自动换行

AI代码解释

openresty -p . -s reload

五、开发实践:body_filter_by_lua 阶段

body_filter_by_lua阶段在 Nginx 将响应体发送给客户端之前执行,可以对响应体的内容进行修改。进行内容替换、压缩、加密等操作。

nginx.conf文件,输入以下内容:

展开

代码语言:Bash

自动换行

AI代码解释

worker_processes 2; events { worker_connections 10240; } ####################### # 以下为nginx配置块 ####################### # http 协议 http { #虚拟主机 server { listen 8989; # 处理http请求 # 捕获和处理 location / { # 用于执行内部url重写或外部重定向 rewrite_by_lua_block { local args = ngx.req.get_uri_args() if args["jump"] == "1" then return ngx.redirect("http://baidu.com") elseif args["jump"] == "2" then return ngx.redirect("/jump_here") end } # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } # rewrite_by_lua不止能跳转到外部,也可以内部跳转 location /jump_here { # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello, jump_here","\t",ngx.var.remote_addr) } # 用于修改应答body的内容 body_filter_by_lua_block { local chunk=ngx.arg[1] ngx.arg[1]=chunk:gsub("hello","FLY.") } } } } # # tcp 使用stream # # stream{ # #}

执行效果:

六、开发实践:黑名单

黑名单功能一般在access_by_lua阶段实现,该阶段在请求被处理之前执行,非常适合进行访问控制、认证等逻辑。

6.1、基础版

新建nginx_new.conf文件,输入以下内容:

展开

代码语言:Bash

自动换行

AI代码解释

worker_processes 2; events { worker_connections 10240; } ####################### # 以下为nginx配置块 ####################### # http 协议 http { #虚拟主机 server { listen 8989; location / { access_by_lua_block { local block_list={ ["192.168.0.105"]=true } if block_list[ngx.var.remote_addr] then return ngx.exit(403) end } # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } } }

没有启动openresty,则输入如下命令启动:

代码语言:Bash

自动换行

AI代码解释

openresty -p . -c conf/nginx_new.conf

如果是之前已经启动了,只需要reload即可:

代码语言:Bash

自动换行

AI代码解释

openresty -p . -s reload

执行效果:

注意,示例中的IP是写死在代码中的,在实际使用中不会这样来,一般存储在其他地方,比如redis。

6.2、进阶版

修改nginx_new.conf文件内容:

展开

代码语言:Bash

自动换行

AI代码解释

worker_processes 2; events { worker_connections 10240; } ####################### # 以下为nginx配置块 ####################### # http 协议 http { #虚拟主机 server { listen 8989; location / { # 用于访问控制 access_by_lua_block { local block_list={ ["192.168.0.105"]=true } if block_list[ngx.var.remote_addr] then return ngx.exit(403) end } # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } location /black_v1 { # 用于访问控制,通过文件 access_by_lua_file ./app/black_v1.lua; # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } } }

black_v1.lua文件内容为:

展开

代码语言:Lua

自动换行

AI代码解释

local redis = require "resty.redis" local red=redis:new() local ok,err=red:connect("127.0.0.1",6379) if not ok then return ngx.exit(301) end local ip=ngx.var.remote_addr local exists,err=red:sismember("black_list",ip) if exists ==1 then return ngx.exit(403) end

只需要reload即可:

代码语言:Bash

自动换行

AI代码解释

openresty -p . -s reload

注意,要记得先运行redis,同时添加IP地址到KEY中。

展开

代码语言:Bash

自动换行

AI代码解释

127.0.0.1:6379> SADD black_list 192.168.0.105 (integer) 1 127.0.0.1:6379> keys * 1) "black_list" 127.0.0.1:6379> SMEMBERS black_list 1) "192.168.0.105" 127.0.0.1:6379>

执行效果:

如果不知道有哪些接口可以使用,可以通过如下命令查询:

代码语言:Bash

自动换行

AI代码解释

restydoc resty.redis

虽然把IP存储在了redis中,没有写死在代码里,但是每一次请求都要访问redis,这会导致整个系统的吞吐量降低;可以将这些数据写到共享内存中。

6.3、高阶版

redis+共享内存方式。而且为了保证数据有效性,需要定期将redis中的数据拉取到共享内存中;那么就需要在init_worker_by_lua阶段添加定时器。

修改nginx_new.conf文件内容:

展开

代码语言:Bash

自动换行

AI代码解释

worker_processes 2; events { worker_connections 10240; } ####################### # 以下为nginx配置块 ####################### # http 协议 http { # 创建共享内存 lua_shared_dict bklist 1m; # 初始化数据,定时器 init_worker_by_lua_file ./app/init_worker.lua; #虚拟主机 server { listen 8989; location / { # 用于访问控制 access_by_lua_block { local block_list={ ["192.168.0.105"]=true } if block_list[ngx.var.remote_addr] then return ngx.exit(403) end } # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } location /black_v1 { # 用于访问控制,通过文件 access_by_lua_file ./app/black_v1.lua; # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } location /black_v2 { # 用于访问控制,通过文件 access_by_lua_file ./app/black_v2.lua; # 内容处理,在配置中写代码 content_by_lua_block { ngx.say("hello","\t",ngx.var.remote_addr) } } } }

black_v2.lua文件内容为:

展开

代码语言:Lua

自动换行

AI代码解释

local bklist=ngx.shared.bklist local ip=ngx.var.remote_addr if bklist:get(ip) then return ngx.exit(403) end

init_worker.lua文件内容为:

展开

代码语言:Lua

自动换行

AI代码解释

-- 只需要一个进程拉取数据即可。 if ngx.worker.id() ~=0 then return end -- 获取共享内存 local bklist =ngx.shared.bklist local redis=require "resty.redis" local function update_blacklist() local red=redis:new() local ok,err=red:connect("127.0.0.1",6379) if not ok then return end local black_list,err=red:smembers("black_list") bklist:flush_all() for _, v in pairs(black_list) do bklist:set(v,true); end ngx.timer.at(5,update_blacklist) end ngx.timer.at(5,update_blacklist)

只需要reload即可:

代码语言:Bash

自动换行

AI代码解释

openresty -p . -s reload

注意,要记得先运行redis,同时添加IP地址到KEY中。

展开

代码语言:Bash

自动换行

AI代码解释

127.0.0.1:6379> SADD black_list 192.168.0.105 (integer) 1 127.0.0.1:6379> keys * 1) "black_list" 127.0.0.1:6379> SMEMBERS black_list 1) "192.168.0.105" 127.0.0.1:6379>

执行效果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 17:27:55

百度网盘下载工具终极指南:快速突破限速的完整教程

百度网盘下载工具终极指南:快速突破限速的完整教程 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘的下载限速问题一直困扰着众多用户,官方客户…

作者头像 李华
网站建设 2026/2/9 6:32:42

C语言实现hashmap(附带源码)

一、项目背景详细介绍哈希表(Hash Table)是计算机科学中最重要的数据结构之一,用于在平均 O(1) 时间内实现插入、删除和查找操作。几乎所有现代语言的字典/映射(Map)都由哈希表或基于树的结构实现。理解哈希表的实现不…

作者头像 李华
网站建设 2026/2/8 16:48:59

jsonnet介绍和使用

文章目录Jsonnet介绍一、Jsonnet 的核心特点二、基本语法示例1. 变量与局部作用域2. 函数3. 条件表达式4. 对象继承与覆盖5. 数组与列表推导三、典型使用场景✅ 配置文件管理(如 Kubernetes、Terraform)✅ 生成结构化数据(JSON/YAML&#xff…

作者头像 李华
网站建设 2026/2/8 2:40:43

喜马拉雅音频数据采集:API接口分析与加密音频链接解密实战

目录 引言 项目目标 效果展示 网站抓包分析过程 抓包分析:探索喜马拉雅API的多层结构 第一步:打开网络监控,观察数据流动 第二步:分析请求参数,理解数据交换规则 第三步:解密认证机制,掌握访问控制策略 第四步:理解音频链接加密机制,掌握解密流程 第五步:解…

作者头像 李华
网站建设 2026/2/9 7:11:35

角色影像生成新纪元:Pony V7-Base引领AI创作革命

在人工智能驱动的视觉创作领域,角色生成技术正经历前所未有的突破。PurpleSmartAI最新发布的Pony V7-Base模型,凭借创新的AuraFlow架构和千万级精选训练数据,重新定义了角色影像生成的品质标准。这款集解剖学精准度、风格多样性与操作便捷性于…

作者头像 李华
网站建设 2026/2/6 12:02:39

论文格式修改排名:9大平台+在线一键优化

论文格式修改排名:9大平台在线一键优化 论文格式优化工具核心对比 工具名称 核心功能 适用场景 处理速度 特色优势 aibiye 全自动格式规范 毕业论文格式标准化 5-10分钟 支持中英文混排自动调整 aicheck 智能排版查重 学术论文格式优化 15-20分钟 图表…

作者头像 李华