通过使用 Lua 和 Rails 在 nginx 下访问环境变量

我正在实现类似于 这里 的东西,让一个服务在 nginx 中允许访问分离的上游服务。

简单来说:Rails 应用程序设置了一个 HMAC cookie,然后由 nginx 中的某些 Lua 代码检查,这要归功于 access_by_lua 指令。

为了生成和验证 cookie,Rails 和 nginx-Lua 当然必须共享一个密钥。我尝试将其设置为 /etc/environment 中的环境变量。

为了使变量在 Rails 中可用,我必须稍微调整 Unicorn 的 init 脚本。但至少该脚本包含在项目中,并且只是链接到相应位置。

同时,为了在 Lua 中获取该变量,我需要执行类似于这样的操作:os.getenv("MY_HMAC_SECRET")。但是,为了让 Lua 在运行 nginx 时访问该变量,必须首先在主要的 nginx 配置中使用 env 指令进行列出

所以现在,我感觉我的配置正在各处散落:

  1. /etc/environment(我项目之外)
  2. /etc/nginx/nginx.conf(我项目之外)
  3. 在 Unicorn 的 init 脚本中
  4. 在我的站点的 nginx vhost 配置中

为了让一个简单的字符串在多个地方可访问而这些地方之间的分布方式似乎有些荒谬...

是否有更简单的方法?老实说,我能想到的最简单的方法就是在我需要它的两个地方硬编码它,然后就完成了。但是这听起来很糟糕。

点赞
用户1068283
用户1068283

最好将它仅放在实际需要的两个配置文件中而不是放在全局环境中,因为现在每个进程都可以访问它。

2014-06-10 04:16:41
用户1016033
用户1016033

我会在你的 vhost 配置中使用 init_by_lua 指令。

init_by_lua 'HMAC_SECRET = "SECRET-STRING"';
server {
    # and so on
}

所以你的密钥会在两个地方都存在,但都在你的项目中(如果我理解正确,vhost 配置在你的项目中)。

你甚至可以使用 init_by_lua_file 并在你的独角兽初始化中努力读取和解析该文件。

2014-06-10 06:25:57