如何在 nginx 中引用 lua 设置的变量?

Posted

技术标签:

【中文标题】如何在 nginx 中引用 lua 设置的变量?【英文标题】:How can I reference a variable set by lua in nginx? 【发布时间】:2021-12-28 23:01:38 【问题描述】:

我正在使用 nginx lua docker 镜像firesh/nginx-lua:alpine-3.4。我尝试在 nginx.config 文件中使用环境变量。下面是/etc/nginx/nginx.conf中的配置。

 user nginx;
    env ES_USERNAME;
    env ES_PWD;
    worker_processes  1;
    events 
      worker_connections  10240;
    

    http 
      server 
          listen       8080;
          server_name  localhost;
          set_by_lua $es_username os.getenv("ES_USERNAME");
          set_by_lua $es_pwd os.getenv("ES_PWD");
          
          location /health 
            proxy_pass  http://$es_username:$es_pwd@elk-es-http:9200/_cluster/health;
          
...

启动容器后,我在日志中看到此错误:

2021/11/18 01:07:14 [error] 6#6: *6 failed to load inlined Lua code: set_by_lua:1: unexpected symbol near '"http://"', client: 10.0.4.122, server: localhost, request: "GET /health HTTP/1.1", host: "10.0.2.170:8080"

问题是proxy_pass后面的url没有从lua中读取变量。它将$es_username 视为一个字符串,而不是读取它的值。正确的使用方法是什么?

【问题讨论】:

【参考方案1】:

这听起来很奇怪。我宁愿希望$es_username$es_pwd 变量都有一个空值。 set_by_lua 期望一个函数应该返回一个值,而你什么也不返回。正确的用法是

set_by_lua $es_username 'return os.getenv("ES_USERNAME")';
set_by_lua $es_pwd      'return os.getenv("ES_PWD")';

【讨论】:

以上是关于如何在 nginx 中引用 lua 设置的变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 nginx 将路径参数传递给 lua 代码?

Nginx结合Lua实现限流

使用nginx时,如何使用lua获取$ scheme?

nginx+lua怎样实现http请求的响应

使用nginx+lua+GraphicsMagick实现图片自动 裁剪

openresty(nginx+lua)初识