在本教程中,我们将演示如何使用 OpenResty 附带的 resty 命令行工具。

1
2
3
cd ~
export PATH=/usr/local/openresty/bin:$PATH
which resty

截图 1

一般都是这个路径。

我们可以通过 -V 选项检查其版本号。

1
resty -V

截图 3

如果你使用我们预构建的 Linux 二进制包安装 OpenResty,那么你应该安装 openresty-resty 包。

1
dnf list installed openresty-resty

截图 4

因为它不在 openresty 主包中。

比如用 resty 命令来做“hello world”,就容易多了。

1
resty -e 'print("Hello World")'

截图 6

注意 -e 选项。

或者在终端上运行一个 Lua 脚本。

1
2
3
echo 'print("Hello World")' > hello.lua
cat hello.lua
resty hello.lua

截图 8

所以这也是使用 OpenResty 编写新的命令行应用程序的好方法。

这里也可以实现非阻塞 I/O。

1
time resty -e 'ngx.sleep(1) ngx.say("done")'

截图 10

让我们使用 cosocket API 连接到 openresty.com 的 443 端口。

1
resty -e 'local sock = ngx.socket.tcp() print(sock:connect("openresty.com", 443))'

截图 11

或者使用轻线程。

1
resty -e 'ngx.thread.wait(ngx.thread.spawn(function () print("in thread!") end))'

截图 12

你也可以很容易地使用 Lua 模块。让我们创建一个 test 模块。

1
2
mkdir lua/
vim lua/test.lua

lua/test.lua文件是这样的。

1
2
3
4
5
local _M = {}

function _M.hello() print("Hello") end

return _M

截图 13

然后我们使用 -I 选项将 lua/ 目录添加到 Lua 模块搜索路径中。

1
resty -I lua/ -e 'require "test".hello()'

截图 14

如果没有 -I 选项,它就找不到。

1
resty -e 'require "test".hello()'

截图 15

这是因为 lua/ 目录默认不在 Lua 模块的搜索路径中。

可以直接加载标准的 Lua 模块,比如 resty.shell

1
resty -e 'local ok, stdout = require "resty.shell".run([[echo ok]]) print(stdout)'

截图 17

该模块用于非阻塞地运行少量 shell 命令。

我们也可以通过 --shdict 选项来定义 lua 共享内存字典。

1
resty --shdict 'dogs 10m' -e 'print(ngx.shared.dogs:set("age", 11))'

截图 19

可以这样定义多个共享词典。

1
resty --shdict 'dogs 7m' --shdict 'cats 5m' -e 'print(ngx.shared.dogs, " ", ngx.shared.cats)'

截图 20

它还可以方便地注入自定义的 nginx 配置代码。

1
resty --http-conf 'lua_regex_match_limit 102400;' -e 'print "ok"'

截图 21

我们还可以玩玩 LuaJIT 的 JIT 编译器。

让我们创建一个跑得比较热的 Lua 脚本。

1
2
echo 'local a = 0 for i = 1, 1e8 do a = a + 1 end print(a)' > bench.lua
cat bench.lua

截图 23

然后完全禁用 JIT 编译器。

1
time resty -joff bench.lua

截图 24

为了比较,我们可以检查一下启用 JIT 编译器后速度有多快。

1
time resty bench.lua

截图 25

或者我们可以用 -jv 选项检查编译后的 Lua 代码路径,或者说“traces”。

1
resty -jv bench.lua

截图 26

或者有更多的细节,比如编译后的字节码转储,IR 代码转储,以及机器代码转储。

1
resty -jdump bench.lua

你可以随时通过 -h 选项找到所有支持的功能。

1
resty -h

或者通过“restydoc”工具参考其文档。

1
restydoc resty-cli

如果你通过我们预建的二进制包安装 openresty,那么你应该安装 openresty-docopenresty-restydoc 包。

1
dnf list installed openresty-doc

截图 30

我们将在另一个专门的视频教程中更深入地了解“restydoc”工具。 如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于本文和关联视频

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

关于作者

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

关注我们

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

我们的微信公众号

翻译

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