OpenResty 的发展
OpenResty 并不像其他的开发语言一样从零开始搭建,而是基于成熟的开源组件——NGINX 和 LuaJIT。
OpenResty 诞生于 2007 年,不过,它的第一个版本并没有选择 Lua,而是用了 Perl,这跟作者章亦春的技术偏好有很大关系。
但 Perl 的性能远远不能达到要求,于是,在第二个版本中,Perl 就被 Lua 给替换了。
不过,在 OpenResty 官方的项目中,Perl 依然占据着重要的角色,OpenResty 工程化方面都是用 Perl 来构建,比如测试框架、Linter、CLI 等。
OpenResty 安装后的目录结构
安装后主要包含了 bin、luajit、lualib、nginx、pod 这几个子目录
bin
openresty,它其实是 nginx 的一个软链接。
opm 是包管理工具,可以通过它来管理各类第三方包。
resty 是 OpenResty CLI,安装完 OpenResty 后,会默认安装。
restydoc 可以查看帮助文档。
目录里面其他的一些工具,和 resty 一样,都是 Perl 脚本。
pod
pod 是 Perl 里面的一种标记语言,用于给 Perl 的模块编写文档。
pod 目录中存放的就是 OpenResty、 NGINX、lua-resty-*、LuaJIT 的文档, 和刚才提到的 restydoc 联系在一起。
nginx 和 luajit
主要存放 NGINX 和 LuaJIT 的可执行文件和依赖,是 OpenResty 的基石。
早期的 OpenResty 同时带有 Lua 和 LuaJIT,可以通过编译选项,来决定使用 Lua 还是 LuaJIT。
不过到了现在,Lua 逐渐被淘汰,就只支持更高性能的 LuaJIT 了。
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 模块
--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,可以找出全局变量等潜在的问题。