2
头图

https://www.bilibili.com/vide...

今天我就来演示一下如何在 OpenResty 应用中编写自己的 Lua 模块,一步一步来。

screenshot 1

让我们把我们简单的 OpenResty 应用放到一个新的目录中,命名为 test-module

cd ~/
mkdir test-module/
cd test-module/

screenshot 2

然后我们像往常一样创建子目录结构。

mkdir logs conf lua

screenshot 3

请注意,与上一篇教程中的“Hello World”示例不同,我们在这里创建了一个 lua/ 目录来存放我们的 lua 模块文件。

现在让我们在 lua 子目录下创建我们自己的 Lua 模块文件,命名为 hello.lua

vim lua/hello.lua

我们进行如下编辑操作:

  1. 声明 Lua 模块表 _M
  2. 然后给这个 Lua 模块添加一个名为 greet 的函数。
  3. 最后,别忘了在最后返回模块表。
local _M = {}

function _M.greet(name)
    ngx.say("Greetings from ", name)
end

return _M

搞定!一个很简单的 Lua 模块就完成了。

现在是创建 nginx.conf 配置文件的时候了。

vim conf/nginx.conf

我们快速完成下列编辑操作:

  1. 我们快速写出相对固定的配置。
  2. http {} 配置块中,我们应该告诉 OpenResty 我们的 Lua 模块在哪里。
  3. 请注意,特殊变量 $prefix 在运行时被 nginx 的 -p 选项值所替代。
  4. 然后我们创建一个 HTTP 服务器,监听 8080 端口。
  5. 并在根位置配置 content_by_lua"_block
  6. 这里我们用 require 内置函数加载 Lua 模块 hello
  7. 我们用一个参数调用它的 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 .

screenshot 22

看起来不错。

现在启动这个 OpenResty 应用程序。

nginx -p $PWD/

screenshot 24
是时候用 curl 命令行工具查询我们的 HTTP 接口了。

curl 'http://127.0.0.1:8080/'

screenshot 25

酷,我们的 Lua 模块开始工作了。

我们也可以在网页浏览器中进行测试。

screenshot 28

如果你看到了 500 错误页面,那么你的 Lua 代码一定有错误。

在这种情况下,你应该检查 logs 子目录下的 error.log 文件。

tail logs/error.log

screenshot 30

这里我们没有任何错误消息,正如预期的那样。

值得注意的是,我们的 Lua 模块是在这第一个请求中加载的,后续的请求只是使用内存中缓存的 Lua 模块。
为了避免第一次请求的额外开销,我们可以在服务器启动时预加载 Lua 模块。

要做到这一点,我们需要编辑一下 nginx.conf 文件。

vim conf/nginx.conf

http {} 块里,我们添加一个 init_by_lua_block 指令。在那个上下文中,我们加载我们的 Lua 模块。

    http {
        init_by_lua_block {
            require "hello"
        }
        ...

screenshot 34

init_by_lua_block 运行在 OpenResty 服务器启动的时候。

测试一下配置是否正确。

nginx -p $PWD/ -t

screenshot 37

没有问题。

现在我们通过向 nginx 主进程发送 HUP 信号来重新加载服务器。
Now we reload the server by sending the HUP signal to the nginx master process.

kill -HUP `cat logs/nginx.pid`

screenshot 39

主进程的进程 ID 存储在这个 nginx.pid 文件中。

再次发送 HTTP 请求。

curl 'http://127.0.0.1:8080/'

screenshot 41

同样的行为,只是这次快了一点点。
如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于本文和关联视频

本文和相关联的视频都是完全由我们的 OpenResty Demo 系统从一个极简单的剧本文件自动生成的。

关于作者

章亦春是开源项目 OpenResty® 的创始人,同时也是 OpenResty Inc. 公司的创始人和 CEO。他贡献了许多 Nginx 的第三方模块,相当多 Nginx 和 LuaJIT 核心补丁,并且设计了 OpenResty XRay 等产品。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!


OpenResty技术
195 声望1.6k 粉丝

OpenResty Inc - 软件系统的实时 X 光诊断与优化。我们有顶尖技术团队,背靠快速成长的 OpenResty 开源用户群体和社区,是世界上第一家广泛应用机器编程的公司,我们的愿景是帮助所有开发与运维工程师,透视任意...