Nginx、Openresty、Luajit 联系

一、lua-nginx-module

NGINX 有 11 个执行阶段,可以从 ngx_http_core_module.h 的源码中看到:

typedef enum {
    NGX_HTTP_POST_READ_PHASE = 0,
    NGX_HTTP_SERVER_REWRITE_PHASE,
    NGX_HTTP_FIND_CONFIG_PHASE,
    NGX_HTTP_REWRITE_PHASE,
    NGX_HTTP_POST_REWRITE_PHASE,
    NGX_HTTP_PREACCESS_PHASE,
    NGX_HTTP_ACCESS_PHASE,
    NGX_HTTP_POST_ACCESS_PHASE,
    NGX_HTTP_PRECONTENT_PHASE,
    NGX_HTTP_CONTENT_PHASE,
    NGX_HTTP_LOG_PHASE
} ngx_http_phases;

OpenResty 也有 11 个 *_by_lua指令,它们和 NGINX 阶段的关系如下图所示(图片来 自 lua-nginx-module 文档):

https://github.com/openresty/lua-nginx-module

其中,init_by_lua 只会在 Master 进程被创建时执行,init_worker_by_lua 只会在每个 Worker 进程被创建时执行。其他的 *_by_lua 指令则是由终端请求触发,会被反复执行。
所以在 init_by_lua 阶段,我们可以预先加载 Lua 模块和公共的只读数据,这样可以利用操作系统的 COW(copy on write)特性,来节省一些内存。
对于业务代码来说,其实大部分的操作都可以在 content_by_lua 里面完成,但更推荐的做法,是根据不同的功能来进行拆分,比如下面这样:
set_by_lua:设置变量;
rewrite_by_lua:转发、重定向等;
access_by_lua:准入、权限等;
content_by_lua:生成返回内容;
header_filter_by_lua:应答头过滤处理;
body_filter_by_lua:应答体过滤处理;
log_by_lua:日志记录。

举一个例子来说明这样拆分的好处。假设对外提供了很多明文 API,现在需要增加自定义的加密 和解密逻辑。那么需要修改所有 API 的代码吗?利用阶段的特性,我们只需要简单地在 access 阶段解密,在 body filter 阶段加密就可以了,原来 content 阶段的代码是不用做任何修改的

# 加密协议版本
location /mixed {
    access_by_lua '...'; # 请求体解密
    content_by_lua '...'; # 处理请求,不需要关⼼通信协议
    body_filter_by_lua '...'; # 应答体加密
}

 二、LuaJIT

在 OpenResty 的安装目录下,可以找到 LuaJIT 的目录和可执行文件。

$ which luajit
/usr/local/Cellar/openresty/1.15.8.3_1/luajit/bin/luajit
 
$ luajit -v
LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/

使用resty运行lua脚本,它最终也是用 LuaJIT 来执行的:

$ resty -e 'print("hello world")'
hello world 

LuaJIT 在 OpenResty 整体架构中的位置:

 

OpenResty 的 worker 进程都是 fork master 进程而得到的, 其实, master 进程中的 LuaJIT 虚拟机也会一起 fork 过来。在同一个 worker 内的所有协程,都会共享这个 LuaJIT 虚拟机,Lua 代 码的执行也是在这个虚拟机中完成的。这可以算是 OpenResty 的基本原理。
标准 Lua 和 LuaJIT 是两回事儿,LuaJIT 只是兼容了 Lua 5.1 的语法,并对 Lua 5.2 和 5.3 做了选择性支持。OpenResty 并没有直接使用 LuaJIT 官方提供的 2.1.0-beta3 版本,而是在此基础上,扩展了 自己的 fork: [openresty-luajit2]

 

三、OpenResty

集成了lua-nginx-module 并优化了 luajit ,带有各种优良的module

 

 

参考:https://zhuanlan.zhihu.com/p/396803871

 

 

 

 
 

 

posted on 2022-03-04 15:12  TrustNature  阅读(221)  评论(0编辑  收藏  举报