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_ctx 和 apply_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_ctx 和 apply_ngx_ctx 必须成对调用,否则会发生内存泄漏!请参见 stash_ngx_ctx。
另见
- upyun-resty: https://github.com/upyun/upyun-resty
GitHub
您可以在 nginx-module-ctxdump 的 GitHub 仓库 中找到此模块的其他配置提示和文档。