Перейти к содержанию

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

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что установлен nginx-module-lua.

Этот документ описывает lua-resty-ctxdump v0.1, выпущенный 7 января 2021 года.


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*

Получает старый ngx.ctx с якорем, возвращаемым из stash_ngx_ctx. После этого якорь перестанет работать.

Примечание: stash_ngx_ctx и apply_ngx_ctx должны вызываться парами, в противном случае произойдет утечка памяти! См. stash_ngx_ctx.

См. также

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-ctxdump.