NGINX 执行阶段与OpenResty的 *_by_lua指令

执行阶段也是 NGINX 重要的特性,与 OpenResty 的具体实现密切相关。NGINX 有 11 个执行阶段,我们可以从 ngx_http_core_module.h 的源码中看到:

bash 复制代码
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 文档):

其中, 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:日志记录。
相关推荐
chen1108____2 小时前
Nginx 实用知识大全:从模块作用到高并发承载
运维·nginx
慢慢沉3 小时前
Lua元表(Metatable)
lua
狒狒的代码王国3 小时前
Nginx简单介绍
运维·nginx
DreamJia915 小时前
Nginx 服务器 SSL 证书安装部署并配置(已实测)
服务器·nginx·ssl
慢慢沉1 天前
Lua(字符串)
开发语言·lua
慢慢沉1 天前
Lua(数组)
开发语言·lua
慢慢沉1 天前
Lua(迭代器)
开发语言·lua
慢慢沉1 天前
Lua基本语法
开发语言·lua
土豆丶杨1 天前
linxu CentOS 配置nginx
linux·nginx·centos
Feng.Lee1 天前
接口测试Postman工具高级使用技巧
功能测试·测试工具·lua·postman·可用性测试