对不同位置使用全局变量(路径)

时间:2018-02-12 09:35:58

标签: nginx lua

我有一个租赁位置,我希望在其中注册具有特定值的变量aet

 location /aet {
    default_type 'text/plain';
        content_by_lua '
          if ngx.var.host:match("(.*).nexus$") ~= nil then 
             aet = ngx.var.host:match("(.-)%.")
             ngx.say(aet)
          end
        ';
 }

我想在另一个租赁地点/ getIp`

中使用此变量
location /getIp {
    default_type 'application/json';
    rds_json          on;

    content_by_lua '
        postgres_pass     database;
        postgres_query  "SELECT ip FROM establishment_view WHERE aet = aet";
        postgres_output rds;
    ';
}

我希望变量aet初始化而无需调用路径/ aet

1 个答案:

答案 0 :(得分:1)

您可以使用Data Sharing within an Nginx Worker

但如果您确实需要所有工作进程的全局变量,则可以使用ngx.shared.DICT API

 http {
     lua_shared_dict my_dict 10m;
     server {
         location /aet {
             content_by_lua_block {
                 local my_dict = ngx.shared.my_dict 
                 my_dict :set("aet", ngx.var.host:match("(.-)%."))
             }
         }
         location /getIp {
             set $aet = ""
             access_by_lua_block {
                 local my_dict = ngx.shared.my_dict 
                 ngx.var.aet = my_dict:get("aet")
             }
             postgres_pass     database;
             postgres_query  "SELECT ip FROM establishment_view WHERE aet = aet";
             postgres_output rds;
         }
     }
 }

PS:您的nginx配置代码段错误 - 您在content_by_lua中使用了nginx指令postgres_ *。

同样不推荐使用* by_lua,使用* _by_lua_block。它可以为你节省很多时间。