resty 命令行工具演示
在本教程中,我们将演示如何使用 OpenResty 附带的 resty
命令行工具。
1 | cd ~ |
一般都是在这条路上。
我们可以通过 -V
选项检查其版本号。
1 | resty -V |
如果你使用我们预构建的 Linux 二进制包安装 OpenResty,那么你应该安装 openresty-resty
包。
1 | dnf list installed openresty-resty |
因为它不在 openresty
主包中。
比如用 resty
命令来做“hello world”,就容易多了。
1 | resty -e 'print("Hello World")' |
注意 -e
选项。
或者在终端上运行一个 Lua 脚本。
1 | echo 'print("Hello World")' > hello.lua |
所以这也是使用 OpenResty 编写新的命令行应用程序的好方法。
这里也可以实现非阻塞 I/O。
1 | time resty -e 'ngx.sleep(1) ngx.say("done")' |
让我们使用 cosocket API 连接到 openresty.com 的 443 端口。
1 | resty -e 'local sock = ngx.socket.tcp() print(sock:connect("openresty.com", 443))' |
或者使用轻线程。
1 | resty -e 'ngx.thread.wait(ngx.thread.spawn(function () print("in thread!") end))' |
你也可以很容易地使用 Lua 模块。让我们创建一个 test
模块。
1 | mkdir lua/ |
lua/test.lua
文件是这样的。
1 | local _M = {} |
然后我们使用 -I
选项将 lua/
目录添加到 Lua 模块搜索路径中。
1 | resty -I lua/ -e 'require "test".hello()' |
如果没有 -I
选项,它就找不到。
1 | resty -e 'require "test".hello()' |
这是因为 lua/
目录默认不在 Lua 模块的搜索路径中。
可以直接加载标准的 Lua 模块,比如 resty.shell
。
1 | resty -e 'local ok, stdout = require "resty.shell".run([[echo ok]]) print(stdout)' |
该模块用于非阻塞地运行少量 shell 命令。
我们也可以通过 --shdict
选项来定义 lua 共享内存字典。
1 | resty --shdict 'dogs 10m' -e 'print(ngx.shared.dogs:set("age", 11))' |
可以这样定义多个共享词典。
1 | resty --shdict 'dogs 7m' --shdict 'cats 5m' -e 'print(ngx.shared.dogs, " ", ngx.shared.cats)' |
它还可以方便地注入自定义的 nginx 配置代码。
1 | resty --http-conf 'lua_regex_match_limit 102400;' -e 'print "ok"' |
我们还可以玩玩 LuaJIT 的 JIT 编译器。
让我们创建一个跑得比较热的 Lua 脚本。
1 | echo 'local a = 0 for i = 1, 1e8 do a = a + 1 end print(a)' > bench.lua |
然后完全禁用 JIT 编译器。
1 | time resty -joff bench.lua |
为了比较,我们可以检查一下启用 JIT 编译器后速度有多快。
1 | time resty bench.lua |
或者我们可以用 -jv
选项检查编译后的 Lua 代码路径,或者说“traces”。
1 | resty -jv bench.lua |
或者有更多的细节,比如编译后的字节码转储,IR 代码转储,以及机器代码转储。
1 | resty -jdump bench.lua |
你可以随时通过 -h
选项找到所有支持的功能。
1 | resty -h |
或者通过“restydoc”工具参考其文档。
1 | restydoc resty-cli |
如果你通过我们预建的二进制包安装 openresty
,那么你应该安装 openresty-doc
或 openresty-restydoc
包。
1 | dnf list installed openresty-doc |
我们将在另一个专门的视频教程中更深入地了解“restydoc”工具。 如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道 或 B 站频道。谢谢!
关于本文和关联视频
本文和相关联的视频都是完全由我们的 OpenResty Demo 系统从一个极简单的剧本文件自动生成的。
关于作者
章亦春是开源项目 OpenResty® 的创始人,同时也是 OpenResty Inc. 公司的创始人和 CEO。他贡献了许多 Nginx 的第三方模块,相当多 Nginx 和 LuaJIT 核心补丁,并且设计了 OpenResty XRay 等产品。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!