为 OpenResty 应用编写你自己的 Lua 模块
今天我就来演示一下如何在 OpenResty 应用中编写自己的 Lua 模块,一步一步来。
让我们把我们简单的 OpenResty 应用放到一个新的目录中,命名为 test-module
。
cd ~/
mkdir test-module/
cd test-module/
然后我们像往常一样创建子目录结构。
mkdir logs conf lua
请注意,与上一篇教程中的“Hello World”示例不同,我们在这里创建了一个 lua/
目录来存放我们的 lua 模块文件。
现在让我们在 lua
子目录下创建我们自己的 Lua 模块文件,命名为 hello.lua
。
vim lua/hello.lua
我们进行如下编辑操作:
- 声明 Lua 模块表
_M
。 - 然后给这个 Lua 模块添加一个名为
greet
的函数。 - 最后,别忘了在最后返回模块表。
local _M = {}
function _M.greet(name)
ngx.say("Greetings from ", name)
end
return _M
搞定!一个很简单的 Lua 模块就完成了。
现在是创建 nginx.conf
配置文件的时候了。
vim conf/nginx.conf
我们快速完成下列编辑操作:
- 我们快速写出相对固定的配置。
- 在
http {}
配置块中,我们应该告诉 OpenResty 我们的 Lua 模块在哪里。 - 请注意,特殊变量
$prefix
在运行时被 nginx 的-p
选项值所替代。 - 然后我们创建一个 HTTP 服务器,监听 8080 端口。
- 并在根位置配置
content_by_lua"_block
。 - 这里我们用
require
内置函数加载 Lua 模块hello
。 - 我们用一个参数调用它的
greet
函数。
worker_processes 1;
events {
worker_connections 1024;
}
http {
lua_package_path "$prefix/lua/?.lua;;";
server {
listen 8080 reuseport;
location / {
default_type text/plain;
content_by_lua_block {
local hello = require "hello"
hello.greet("a Lua module")
}
}
}
}
我们现在就来检查整个目录树。
tree .
看起来不错。
现在启动这个 OpenResty 应用程序。
nginx -p $PWD/
是时候用 curl
命令行工具查询我们的 HTTP 接口了。
curl 'http://127.0.0.1:8080/'
酷,我们的 Lua 模块开始工作了。
我们也可以在网页浏览器中进行测试。
如果你看到了 500 错误页面,那么你的 Lua 代码一定有错误。
在这种情况下,你应该检查 logs
子目录下的 error.log
文件。
tail logs/error.log
这里我们没有任何错误消息,正如预期的那样。
值得注意的是,我们的 Lua 模块是在这第一个请求中加载的,后续的请求只是使用内存中缓存的 Lua 模块。 为了避免第一次请求的额外开销,我们可以在服务器启动时预加载 Lua 模块。
要做到这一点,我们需要编辑一下 nginx.conf
文件。
vim conf/nginx.conf
在 http {}
块里,我们添加一个 init_by_lua_block
指令。在那个上下文中,我们加载我们的 Lua 模块。
http {
init_by_lua_block {
require "hello"
}
...
init_by_lua_block
运行在 OpenResty 服务器启动的时候。
测试一下配置是否正确。
nginx -p $PWD/ -t
没有问题。
现在我们通过向 nginx 主进程发送 HUP
信号来重新加载服务器。
Now we reload the server by sending the HUP
signal to the nginx master process.
kill -HUP `cat logs/nginx.pid`
主进程的进程 ID 存储在这个 nginx.pid
文件中。
再次发送 HTTP 请求。
curl 'http://127.0.0.1:8080/'
同样的行为,只是这次快了一点点。
关于作者
章亦春是开源 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!