0%

《OpenResty精华整理》1.安装后的目录结构以及 GitHub 项目概览

OpenResty 的发展

OpenResty 并不像其他的开发语言一样从零开始搭建,而是基于成熟的开源组件——NGINX 和 LuaJIT。

OpenResty 诞生于 2007 年,不过,它的第一个版本并没有选择 Lua,而是用了 Perl,这跟作者章亦春的技术偏好有很大关系。

但 Perl 的性能远远不能达到要求,于是,在第二个版本中,Perl 就被 Lua 给替换了。

不过,在 OpenResty 官方的项目中,Perl 依然占据着重要的角色,OpenResty 工程化方面都是用 Perl 来构建,比如测试框架、Linter、CLI 等。


OpenResty 的主要组成

OpenResty 安装后的目录结构

安装后主要包含了 bin、luajit、lualib、nginx、pod 这几个子目录


OpenResty 安装后的目录结构

bin


bin 目录

openresty,它其实是 nginx 的一个软链接。

opm 是包管理工具,可以通过它来管理各类第三方包。

resty 是 OpenResty CLI,安装完 OpenResty 后,会默认安装。


resty 示例

restydoc 可以查看帮助文档。


restydoc 示例

目录里面其他的一些工具,和 resty 一样,都是 Perl 脚本。

pod

pod 是 Perl 里面的一种标记语言,用于给 Perl 的模块编写文档。
pod 目录中存放的就是 OpenResty、 NGINX、lua-resty-*、LuaJIT 的文档, 和刚才提到的 restydoc 联系在一起。


pod 目录

nginx 和 luajit


nginx 和 luajit 目录

主要存放 NGINX 和 LuaJIT 的可执行文件和依赖,是 OpenResty 的基石。

早期的 OpenResty 同时带有 Lua 和 LuaJIT,可以通过编译选项,来决定使用 Lua 还是 LuaJIT。

不过到了现在,Lua 逐渐被淘汰,就只支持更高性能的 LuaJIT 了。

lualib


lualib 目录

里面存放的是 OpenResty 中使用到的 Lua 库,主要分为 ngx 和 resty 两个子目录。

前者存放的是 lua-resty-core 这个官方项目中的 Lua 代码,里面都是基于 FFI 重新实现的 OpenResty API。

resty 目录中存放的则是各种 lua-resty-* 项目包含的 Lua 代码。

OpenResty GitHub 项目概览

OpenResty 在 GitHub 的项目主页:openresty

大概分为以下 7 类:

NGINX C 模块

OpenResty 的项目命名都是有规范的,以 *-nginx-module命名的就是 NGINX 的 C 模块。
openresty -V 中,可以看到这些 C 模块


openresty -V

--add-module=后面跟着的,就是 OpenResty 的 C 模块。其中,最核心的就是 lua-nginx-module 和 stream-lua-nginx-module,前者用来处理七层流量,后者用来处理四层流量。

这些 C 模块中,有些是需要特别注意的,虽然默认编译进入了 OpenResty,但并不推荐使用。
比如 redis2-nginx-module、redis-nginx-module 和 memc-nginx-module,它们是用来和 redis 以及 memcached 交互使用的。
这些 C 库是 OpenResty 早期推荐使用的,但在 cosocket 功能加入之后,它们都已经被 lua-resty-redis 和 lua-resty-memcached 替代,处于疏于维护的状态。
OpenResty 后面也不会开发更多的 NGINX C 库,而是专注在基于 cosocket 的 Lua 库上,后者才是未来。

lua-resty- 周边库

官方自带
在 OpenResty 世界中,如果使用 cosocket 实现了一个包,那么就要使用 lua-resty- 这个前缀,算是一个不成文的规定。

除了官方自带的之外,还有更多的第三方库。

自己维护的 LuaJIT 分支

OpenResty 除了维护自己的 OpenSSL patch 外,还维护了自己的 LuaJIT 分支。
在 2015 年,LuaJIT 的作者 Mike Pall 宣布退休,寻找新的 LuaJIT 维护者,但 Mike 并没有找到合适的维护者,他现在主要是做 bugfix 的维护工作,新功能的开发也已经暂停,所以 OpenResty 维护着自己的 LuaJIT 分支。
相对于 Lua,LuaJIT 增加了不少独有的函数,这些函数非常重要

测试框架

OpenResty 的测试框架是test-nginx,同样也是用 Perl 语言来开发的,从名字上就能看出来,它是专门用来测试 NGINX 相关的项目。
OpenResty 官方的所有 C 模块和 lua-resty 库的测试案例,都是由 test-nginx 驱动的。

调试工具链

OpenResty 项目在如何科学和动态地调试代码上,花费了大量的精力。

OpenResty 的作者章亦春专门写了一篇文章,来介绍动态追踪技术。
强烈推荐,看完也有助于理解对应的工具链以及系统性能优化 动态追踪技术漫谈

openresty-systemtap-toolkit 和 stapxx 这两个 OpenResty 的项目,都基于 systemtap 这个动态调试和追踪工具。

使用 systemtap 最大的优势,便是实现活体分析,同时对目标程序完全无侵入。
打个比方,systemtap,就像是我们去医院照了个 CT,无痛无感知。更棒的是,systemtap 可以生成直观的火焰图来做性能分析,这里先放一个火焰图,直观上有个感性的认识。


火焰图

打包相关

OpenResty 在不同发行操作系统(比如 CentOS、Ubuntu、MacOS 等)版本中的打包脚本

工程化工具

比如 openresty-devel-utils 就是开发 OpenResty 和 NGINX 的工具集。它们也都使用 Perl 开发,其中大部分的工具都是没有文档的。
但对于 OpenResty 的开发者来说,这些工具又是非常有用的。

lj-releng 是一个简单有效的 LuaJIT 代码检测工具,类似 luacheck,可以找出全局变量等潜在的问题。