跳转至

ctxdump: 存储并应用旧的 ngx.ctx,以避免在 NGINX 内部重定向后被销毁

安装

如果您尚未设置 RPM 仓库订阅,请 注册。然后您可以继续以下步骤。

CentOS/RHEL 7 或 Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-ctxdump

CentOS/RHEL 8+、Fedora Linux、Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-ctxdump

要在 NGINX 中使用此 Lua 库,请确保已安装 nginx-module-lua

本文档描述了 lua-resty-ctxdump v0.1,于 2021 年 1 月 07 日发布。


location /t1 {
    set $ctx_ref = "";
    content_by_lua_block {
         local ctxdump = require "resty.ctxdump"
         ngx.ctx = {
             Date = "Wed May  3 15:18:04 CST 2017",
             Site = "unknown"
        }
        ngx.var.ctx_ref = ctxdump.stash_ngx_ctx()
        ngx.exec("/t2")
    }
}

location /t2 {
    internal;
    content_by_lua_block {
         local ctxdump = require "resty.ctxdump"
         ngx.ctx = {
             Date = "Wed May  3 15:18:04 CST 2017",
             Site = "unknown"
        }
        ngx.ctx = ctxdump.apply_ngx_ctx(ngx.var.ctx_ref)
        ngx.say("Date: " .. ngx.ctx["Date"] .. " Site: " .. ngx.ctx["Site"])
    }
}

方法

stash_ngx_ctx

语法: ref = stash_ngx_ctx()
阶段: *init_worker_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*, ngx.timer.*, balancer_by_lua*

引用 ngx.ctx,返回一个锚点(由 lua-resty-ctxdump 维护的新引用)。

注意:stash_ngx_ctxapply_ngx_ctx 必须成对调用,否则会发生内存泄漏!请参见 apply_ngx_ctx

apply_ngx_ctx

语法: old_ngx_ctx = apply_ngx_ctx(ref)
阶段: *init_worker_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*, ngx.timer.*, balancer_by_lua*

使用从 stash_ngx_ctx 返回的锚点获取旧的 ngx.ctx。之后,该锚点将失效。

注意:stash_ngx_ctxapply_ngx_ctx 必须成对调用,否则会发生内存泄漏!请参见 stash_ngx_ctx

另见

GitHub

您可以在 nginx-module-ctxdump 的 GitHub 仓库 中找到此模块的其他配置提示和文档。