在 OpenResty 中跨请求共享数据
本教程将逐步演示如何在 OpenResty 应用程序服务的不同 HTTP 请求中共享数据。
cd ~/
mkdir data-share
cd data-share/
mkdir conf logs lua
tree
我们首先准备测试应用程序的目录树。
在请求之间共享数据的简单方法是使用一个名为 lua/my-module.lua
的自定义 Lua 模块。
我们进行以下编辑:
- 我们在这个模块的顶层增加一个全局计数器变量。
- 然后我们总是在一个名为
main
的模块函数中递增这个计数器。 - 并返回新的计数器值。
local _M = {}
local counter = 0
function _M.main()
counter = counter + 1
return counter
end
return _M
现在让我们快速制作 nginx 配置文件,conf/nginx.conf
。
我们进行以下编辑:
- 在这里,我们指定在哪里寻找我们的 Lua 模块。
- 然后在本地 8080 端口上定义一个监听服务器。
- 而根位置下有
content_by_lua_block
。 - 加载我们的 Lua 模块并调用它的
main
函数。 - 并将返回的计数器值作为响应体输出。
worker_processes 1;
events {
worker_connections 1024;
}
http {
lua_package_path "$prefix/lua/?.lua;;";
server {
listen 8080;
location / {
default_type text/plain;
content_by_lua_block {
local mod = require "my-module"
local cnt = mod.main()
ngx.say("counter = ", cnt)
}
}
}
}
我们再来检查一下目录树。
tree .
看起来不错。
在没有 sudo
的情况下启动这个 OpenResty 应用程序。
openresty -p $PWD/
在这里,我们只启用一个工作进程。
ps aux|grep nginx|grep -v tmp
使用 curl
向服务器发送 HTTP 请求。
curl 'http://127.0.0.1:8080/'
计数器的值是 1。
再来一次:
酷,现在是 2。
它只会不断增长。
这个 counter
Lua变量是共享的,因为它是 Lua 模块函数的 “up value”(upvalue)。
cat lua/my-module.lua
而 Lua 模块在全局 LuaJIT 虚拟机中被缓存和共享。
resty -Ilua -e 'require "my-module" print(package.loaded["my-module"].main)'
看到了吗?我们也可以直接访问缓存的 Lua 模块。
package.load
全局表保存了所有加载的 Lua 模块。
resty -e 'for k, v in pairs(package.loaded) do print(k) end'
在这里,大部分的模块都是那些标准的模块。
但是有一个限制。这些数据不能在不同的 nginx 工作进程之间共享。
这里没有问题,因为只配置了 1 个工作进程。
但通常我们会通过启用多个工作进程来利用多个 CPU 核心。
worker_processes 4;
那么每个工作进程都会有自己的计数器。
让我们测试配置,然后重新加载服务器。
openresty -p $PWD/ -t
kill -HUP `cat logs/nginx.pid`
现在我们应该有 4 个工作进程。
ps aux|grep nginx|grep -v tmp
所以这种 Lua 模块数据共享的方式主要是用于 Lua 级别的数据缓存。
与 OpenResty 一起提供的 resty.lucache Lua 模块就是为这样的场景设计的。
restydoc resty.lrucache
我们将在以后的教程中介绍这个模块。
如果我们想在所有工作进程中共享数据,我们应该使用 Lua 共享内存字典来代替。
restydoc -s lua_shared_dict
restydoc -s ngx.shared.DICT
我们将在另一个专门的教程中介绍这个话题。
今天我想介绍的就这么多。祝编程愉快! 如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道 或 B 站频道。谢谢!
关于本文和关联视频
本文和相关联的视频都是完全由我们的 OpenResty Showman 产品从一个简单的剧本文件自动生成的。
关于作者
章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。
章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!