Openresty 生产布署漏掉 Lua 源文件咋办,openrestylua


以下摘自OpenResty微信群的聊天记录, 中英文中间要有空格,春哥的习惯的确好。

怕生产布署漏掉 Lua 源文件,我有一个推荐的办法:即把所有的 Lua 源文件都做成 Lua module 的形式,即可以被 require 加载的形式。然后在 nginx.conf 里面都使用 *_by_lua_block { require("foo").go() } 这样的形式。

特别地,在 init_by_lua_block { ... } 里面 require 所有会用到的 Lua 模块,这样如果找不到模块文件,nginx 会拒绝加载新的配置,避免造成事故。

这样其实性能也更好, 相比 *_by_lua_file也更省内存,
因为 init_by_lua* 运行在 master 进程中, 之后fork 出来的 worker 进程不必再各自加载一遍,已加载的模块也有机会享受操作系统的 COW 优化

我记得 OR 官方开源的 opm server 和 openresty.org 站都使用了这种方法。

一般 init_by_lua_block { ... } 里面的 require 语句也不会太多,因为 Lua 模块之间一般有 require 关系。把那一两个根模块 require 了,其他依赖项也就自动 require 了。

require() 函数有缓存,每个 Lua 模块只会加载一次,后续的 require() 调用都会直接返回第一次加载好的结果。缓存发生在全局的 package.loaded 表里。

除非你在 nginx.conf 里面禁掉了 lua_code_cache.

话说,后面我打算让 nginx.conf 里的绝大部分配置都可以直接在 Lua 里面生成。

以后 openresty app 的 nginx.conf 将是极为短小和固定的。因为几乎所有重要的逻辑都可以放进 Lua 代码基里去, 甚至可以完全省去 nginx.conf。届时 nginx 就真成了 OR 的一个大 lib 了,哈哈

nginx 的那些 phase 和 hook 都可以变成 Lua 世界里的 phase 和 hook.

这样未来发布的 OpenResty WAF、OpenResty Edge、OpenResty Analytics 和 OpenResty Trace 这些上层产品的配置界面就可以极大简化了,不再受制于 nginx.conf 的结构。

新动态

我两个月前在 Lua Workshop 2016 聚会上的演讲视频终于出来了,主办方放在了 YouTube 上面:https://www.youtube.com/watch?v=FfhEdF40nhQ 当时使用的幻灯片 PDF 在这里:http://openresty.org/slides/Optimizing-Lua-Applications-for-LuaJIT-and-OpenResty.pdf 我那次演讲的主题是“Optimizing Lua Applications for
LuaJIT and OpenResty”

相关内容

    暂无相关文章