Featured image of post openresty lua中使用系统环境变量

openresty lua中使用系统环境变量

我们在openresty的lua自定义功能开发过程中,可能会遇到需要获取系统环境变量的情况,比如:我的代理需要连接redis,这个时候把配置文件写死是不明智的,我们可以通过ENV参数在pod中传入,然后脚本读取系统变量的方式来实现,这会灵活很多。

但是有个问题,如果我在lua中直接这么写:

1
2
3
4
5
6
7
redisIp = os.getenv("REDISIP")
redisPort = os.getenv("REDISPORT")
redisPass = os.getenv("REDISPASS")

print("redisIp is : ", redisIp)
print("redisPort is : ", redisPort)
print("redisPass is : ", redisPass)

会发现只能获取到nil,那是因为 OpenResty 中的 Lua 代码运行在一个独立的 Lua 解析器中,默认情况下并不能获取到系统的环境变量。有一种比较简便的方式是我们可以在 Nginx 的 init_by_lua 中将环境变量赋值给 Lua 全局变量,这样lua就可以直接读取这个变量了。

如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
http {
    init_by_lua_block {
        redisIp = os.getenv("REDISIP")
        redisPort = os.getenv("REDISPORT")
        redisPass = os.getenv("REDISPASS")
    }
    server {
        location /some_prefix {
            # call lua
        }
    }
}