如何使server块中的rewrite_by_lua_file和location块中的rewrite_by_lua_file对一个请求同时生效?

553 views
Skip to first unread message

wwaz wwaz

unread,
Jul 29, 2016, 11:46:50 PM7/29/16
to openresty
配置文件如下:


在请求test2接口时,在server块配置的serv_rewrite.lua脚本得不到执行,执行了loc2_rewrite.lua脚本。



其实这个原因我是知道的,就是rewrite阶段已经在find_config阶段之后,r的r->loc_conf已经指向了正确的loc_conf上下文,
在ngx_lua_module模块中嵌入的rewrite阶段的钩子会将llcf->handler上挂接的handler执行。

所以如果location块中的llcf->handler已经存在(即配置了rewrite_by_lua_file),在server块中的llcf->handler是不会meger到location的lcf->handler上去的





所以想问下各位,如何才能满足我的要求呢?我想在访问test2接口时,执行这两个lua脚本(server块中和location块中的)

DeJiang Zhu

unread,
Aug 3, 2016, 10:07:41 AM8/3/16
to open...@googlegroups.com
Hello

我想你应该在 Lua 里来处理这些逻辑了,比如把 serv_rewrite.lua 的逻辑,挪到 loc2_rewrite.lua


--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@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,
Aug 4, 2016, 1:36:04 AM8/4/16
to openresty
谢谢回复。
所以写一个新脚本,combine.lua内容为:
   require("serv_rewrite")
   require("loc2_rewrite")
然后放到test2接口下即可。

这样是吗?:))

在 2016年8月3日星期三 UTC-7上午7:07:41,doujiang写道:

DeJiang Zhu

unread,
Aug 4, 2016, 9:43:24 AM8/4/16
to open...@googlegroups.com
Hello

在 2016年8月4日 下午1:36,wwaz wwaz <3824...@qq.com>写道:
谢谢回复。
所以写一个新脚本,combine.lua内容为:
   require("serv_rewrite")
   require("loc2_rewrite")
然后放到test2接口下即可。

这样是吗?:))

大致是这样的,动手试试就知道了,毕竟这都是你的业务逻辑了

wwaz wwaz

unread,
Oct 12, 2016, 12:41:18 AM10/12/16
to openresty
Hi,各位,这个问题现在这样的:
  因为有较多的lua脚本逻辑需要在rewrite阶段执行,但是对于同一个location,只能配置生效一个rewrite_by_lua_file指令
 
   1 目前想到的解决办法是 在需要执行多个rewrite_by_lua_file的接口中,把它们全部合并为一个merge.lua脚本,里面的内容写为require("rewrite1.lua") require("rewite2.lua") 等等
       
   2 这样的问题就是:由于requrie函数是C实现的,所以在这个函数中不能有yield操作,这样导致上面这种方法在很多情况下不能实现。(会报错)

 所以想问下:
  1 有什么好的方式可以解决这种需要执行多个rewrite阶段的脚本的问题?(开发者分散,导致需要在同一个接口下添加多个rewrite阶段的执行逻辑)

  2  ngx_lua模块是不是可以考虑支持这种在同一个接口下面支持多个rewrite_by_lua的逻辑?想nginx的十一个阶段一样可以在一个模块中的一个阶段嵌入多个钩子。

谢谢



在 2016年7月30日星期六 UTC+8上午11:46:50,wwaz wwaz写道:

DeJiang Zhu

unread,
Oct 12, 2016, 10:05:14 PM10/12/16
to open...@googlegroups.com
Hello

在 2016年10月12日 下午12:41,wwaz wwaz <3824...@qq.com>写道:
Hi,各位,这个问题现在这样的:
  因为有较多的lua脚本逻辑需要在rewrite阶段执行,但是对于同一个location,只能配置生效一个rewrite_by_lua_file指令
 
   1 目前想到的解决办法是 在需要执行多个rewrite_by_lua_file的接口中,把它们全部合并为一个merge.lua脚本,里面的内容写为require("rewrite1.lua") require("rewite2.lua") 等等

你这里有常识性的错误,应该是这样比较科学:
require("rewrite1").go()
require("rewrite2").go()

       
   2 这样的问题就是:由于requrie函数是C实现的,所以在这个函数中不能有yield操作,这样导致上面这种方法在很多情况下不能实现。(会报错)

以上就不会了
 

 所以想问下:
  1 有什么好的方式可以解决这种需要执行多个rewrite阶段的脚本的问题?(开发者分散,导致需要在同一个接口下添加多个rewrite阶段的执行逻辑)

自己在 Lua 层来搞最方便了
 

  2  ngx_lua模块是不是可以考虑支持这种在同一个接口下面支持多个rewrite_by_lua的逻辑?想nginx的十一个阶段一样可以在一个模块中的一个阶段嵌入多个钩子。

完全这个必要了吧
 

谢谢



在 2016年7月30日星期六 UTC+8上午11:46:50,wwaz wwaz写道:
配置文件如下:


在请求test2接口时,在server块配置的serv_rewrite.lua脚本得不到执行,执行了loc2_rewrite.lua脚本。



其实这个原因我是知道的,就是rewrite阶段已经在find_config阶段之后,r的r->loc_conf已经指向了正确的loc_conf上下文,
在ngx_lua_module模块中嵌入的rewrite阶段的钩子会将llcf->handler上挂接的handler执行。

所以如果location块中的llcf->handler已经存在(即配置了rewrite_by_lua_file),在server块中的llcf->handler是不会meger到location的lcf->handler上去的





所以想问下各位,如何才能满足我的要求呢?我想在访问test2接口时,执行这两个lua脚本(server块中和location块中的)

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty+subscribe@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+unsubscribe@googlegroups.com

wwaz wwaz

unread,
Oct 12, 2016, 10:38:58 PM10/12/16
to openresty
多谢豆浆哥的解答!

1 其实我开始也是想用  “引用模块中的某个主函数 require("xxx").run()“  这种方式的。
不过很多脚本并没有封住为一个模块,只是写了一些local 的函数,然后直接调用了。

2 如果没有其它方法的话,看来只能规范这些脚本了的写法,让其变成模块话的形式了。

3 另外,豆浆哥你们遇到这种情况了么?都是如何解决的呀。



在 2016年10月13日星期四 UTC+8上午10:05:14,doujiang写道:
Hello

订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages