如何在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
相关产品推荐
相关产品推荐

