You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenResty Stream中为变量设初始值并供Lua访问

OpenResty Stream 配置可被Lua访问的变量解决方案

问题分析

在OpenResty Stream模块中,set指令属于HTTP模块专属指令,无法在stream块中使用;lua_add_variable仅用于声明自定义变量,不能直接设置初始值,因此需要通过Lua代码完成变量的初始化操作。

可行方案

方案1:声明自定义变量并通过初始化块赋值

通过lua_add_variable声明变量,再在init_by_lua_block中为变量设置初始值,每个worker进程会持有一份独立的变量副本,适合单worker内使用的场景。

修改后的nginx.conf配置:

stream {
    # 声明自定义变量
    lua_add_variable $servers_list;

    # 在worker初始化阶段为变量赋值
    init_by_lua_block {
        ngx.var.servers_list = "client1;client2"
    }

    upstream backend {
        server 127.0.0.1:666;
    }
    server {
        lua_code_cache off;
        listen 65;
        preread_by_lua_file lua/echo.lua;
        content_by_lua_block {
            ngx.say("never reach here")
        }
    }
}

echo.lua无需修改,即可正常读取变量:

ngx.log(ngx.ERR, "list is ", ngx.var.servers_list)

方案2:使用共享字典(多worker共享场景)

如果需要变量在多个worker进程间共享,可使用lua_shared_dict定义共享内存字典,适合跨worker同步数据的场景。

修改后的nginx.conf配置:

# 在main块定义共享字典(分配1M内存空间)
lua_shared_dict server_vars 1m;

stream {
    upstream backend {
        server 127.0.0.1:666;
    }
    server {
        lua_code_cache off;
        listen 65;

        # 初始化共享字典中的变量
        init_by_lua_block {
            local dict = ngx.shared.server_vars
            dict:set("servers_list", "client1;client2")
        }

        preread_by_lua_file lua/echo.lua;
        content_by_lua_block {
            ngx.say("never reach here")
        }
    }
}

对应的echo.lua需要从共享字典中读取变量:

local dict = ngx.shared.server_vars
local servers_list = dict:get("servers_list")
ngx.log(ngx.ERR, "list is ", servers_list)

关键说明

  • lua_add_variable仅负责声明变量的存在,必须通过Lua代码(如init_by_lua_block)完成初始值设置;
  • lua_shared_dict定义的变量存储在共享内存中,所有worker进程均可读写,适合跨进程共享数据的场景;
  • 若仅需单个worker内使用变量,方案1的性能更优,无需跨进程内存访问。

内容的提问来源于stack exchange,提问作者Yongqi Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:12:30