了解 OpenResty XRay 是如何做到帮助企业定位应用程序存在的问题以及优化其效率的。

了解更多 LIVE DEMO

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

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

截图 1

一般都是这个路径。

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

resty -V

截图 3

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

dnf list installed openresty-resty

截图 4

因为它不在 openresty 主包中。

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

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

截图 6

注意 -e 选项。

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

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

截图 8

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

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

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

截图 10

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

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

截图 11

或者使用轻线程。

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

截图 12

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

mkdir lua/
vim lua/test.lua

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

local _M = {}

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

return _M

截图 13

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

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

截图 14

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

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

截图 15

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

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

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

截图 17

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

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

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

截图 19

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

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

截图 20

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

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

截图 21

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

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

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

截图 23

然后完全禁用 JIT 编译器。

time resty -joff bench.lua

截图 24

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

time resty bench.lua

截图 25

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

resty -jv bench.lua

截图 26

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

resty -jdump bench.lua

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

resty -h

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

restydoc resty-cli

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

dnf list installed openresty-doc

截图 30

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

关于本文和关联视频

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

关于作者

章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。

章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,并编写过 60 多个开源软件库。

关注我们

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

我们的微信公众号

翻译

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