如何优雅地完成在rewrite_by_lua,access_by_lua等阶段执行多个不同的lua脚本的逻辑呢?

302 views
Skip to first unread message

wwaz wwaz

unread,
Dec 6, 2016, 2:45:23 AM12/6/16
to openresty
目前有这样的需求:

        比如有很多server块,每个server块下面也有很多locatin接口,例如下面:


               server {

                       server_name            server1;
   
                       rewrite_by_lua_file                               rewrite.lua;
 
                       location /a {

                               rewite_by_lua_file                         rewrite.lua;
                       }

                       location /b {
 
                              rewrite_by_lua_file                         rewrite.lua;
                       }

                       location ....

           }
          server {

                       server_name            server2;
   
                       rewrite_by_lua_file                               rewrite.lua;
 
                       location /a {

                               rewite_by_lua_file                         rewrite.lua;
                       }

                       location /b {
 
                              rewrite_by_lua_file                         rewrite.lua;
                       }

                       location ....

           }



      有可能每个server块的server层的rewite_by_lua阶段需要的逻辑不通(不同的业务),且同一个server下面的location接口需要的rewrite_by_lua阶段的逻辑也不同。


     目前为了满足要求,采用了一种方法,把所有的rewrite_by_lua指令后接上一个统一的主脚本  rewrite.lua.    而所有其它的逻辑,都用lua脚本封装为模块,在主脚本里面通过require的方式来调用。

     每个地方的rewrite_by_lua阶段需要执行的不同逻辑,通过配置变量的方式来开启或者关闭。

      例如在server1的server层,打开某些逻辑的开关(配置一些set变量为"on"),在location层,打开另外逻辑的开关。 

    这种方式来达到目的的,而且目前来看,也确实是可行的。


   但对于这种做法,感觉不是很优雅,目前有两个疑问点:

    1  如果后面的逻辑多了起来,那么把所有的逻辑都放在主脚本里面会不会有些累赘? 
    2  逻辑一多,势必很有很多的set变量,这样配置在conf文件中,是否有些多余?
        (之前考虑过把这些开关放入到专门的开关配置lua脚本中,但不能满足上面的要求)
    3  这样的做法,是否以后会遇到执行顺序上的困扰?


   目前来看,逻辑大约三两个,set变量开关也不多,而且主脚本只有一个,很好管理。


 请问下:有没有更加优雅的做法,能够达到这些目的?还是说我们的这种同一个阶段有不同的执行逻辑的做法本来就是不符合ngx_lua的设计初衷的?




   
  



 

Ming

unread,
Dec 6, 2016, 4:54:52 AM12/6/16
to open...@googlegroups.com
问下,你的这些所有 lua 脚本都必须在 rewrite 阶段这一个阶段吗?
可以 server 级别在 rewrite 阶段,location 的在 content 阶段吗?

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty+subscribe@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+unsubscribe@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

wwaz wwaz

unread,
Dec 6, 2016, 5:01:18 AM12/6/16
to openresty
只能在rewrite阶段做的,nginx目前只当作反向代理。

另外:如果可以在content阶段做的话,温铭哥有啥好方法么?

在 2016年12月6日星期二 UTC+8下午5:54:52,WenMing写道:
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com

DeJiang Zhu

unread,
Dec 7, 2016, 9:48:00 PM12/7/16
to open...@googlegroups.com
Hello

最好的全盘 Lua 化
如果逻辑类似,可以使用同一的 Lua 入口,在 Lua 里拿到 host 来区分执行差异部分的逻辑

订阅: 请发空白邮件到 openresty+subscribe@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+unsubscribe@googlegroups.com

wwaz wwaz

unread,
Dec 15, 2016, 9:35:34 PM12/15/16
to open...@googlegroups.com
嗯 问题是有很多的host呀 还有很多的location,不太好在lua里面区分。
Reply all
Reply to author
Forward
0 new messages