乐趣区

关于nginx:为-OpenResty-应用编写你自己的-Lua-模块

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

明天我就来演示一下如何在 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

咱们进行如下编辑操作:

  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 .

看起来不错。

当初启动这个 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/'

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

对于本文和关联视频

本文和相关联的视频都是齐全由咱们的 OpenResty Demo 零碎从一个极简略的剧本文件主动生成的。

对于作者

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

关注咱们

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

翻译

咱们提供了英文版原文和中译版(本文)。咱们也欢送读者提供其余语言的翻译版本,只有是全文翻译不带省略,咱们都将会思考采纳,非常感谢!

退出移动版