2016-10-11 77 views
1

我试图使用lua直接从nginx服务301重定向,而不是必须通过php或其他东西。块之间共享lua数据?

我这个文章在这里的启发:

http://www.agileweboperations.com/supporting-millions-of-pretty-url-rewrites-in-nginx-with-lua-and-redis

的想法是,我可以直接保存重定向的列表Redis的,然后匹配并直接在Nginx的增加性能LUA为他们服务。

因为后端项目的Symfony,我必须找到一种方法来调整一下代码,以满足我的需要,下面是我:

在这里,我尝试匹配通常mysite.com/this /那个请求。我包括LUA脚本首先处理重定向,如果没有比赛我让nginx的try_files

location/{ 
    include /etc/nginx/include.d/lua_st_redis_rewrites.lua; 
    try_files $uri @rewriteapp; 
} 
location @rewriteapp { 
    rewrite ^(.*)$ /app.php/$1 last; 
} 

因为我想支持开发环境,我要处理的URL像这样还有:mysite.com/app_dev。 php/this/

这些URL不匹配位置/块,因此我必须再次呼叫包含lua。问题是,现在链接mysite.com/this/that实际上将两次调用lua脚本。

我的想法是,我可以在第一次调用中初始化一个真/假标志,然后在第二次调用中使用它来检查脚本是否已包含在内?在这个阶段,我很困惑与然而,变量的作用域:

# pass the PHP scripts to FastCGI server from upstream phpfcgi 
location ~ ^/(app|app_dev)\.php(/|$) { 
    # # Setup var defaults 
    # set $no_cache ""; 

    include /etc/nginx/include.d/lua_st_redis_rewrites.lua; 

    # some more usual code for symfony here 
} 
  1. 我应该使用全局变量,在这种情况下之间的Lua代码2个街区共享数据?我看到强烈建议不要使用全局变量?
  2. 如果我包含两次lua脚本,我能否安全地假设脚本中声明的变量每次调用时都会重新声明?

谢谢,我完全不熟悉这个,所以请原谅我明显的问题。

回答

0

据我所知,你不能直接包含Lua文件。假设您使用的是Openresty,则需要使用相关的* _by_lua阶段处理请求,在此情况下为rewrite_by_lua

不同的块不能访问其他全局变量,但可以使用ngx.ctx表,该表在请求期间持续存在。

有一个便利的openresty阶段图表here

+0

谢谢我将研究ngx.ctx,看起来像我需要的。奇怪的是,include还是像脚本上显示的那样工作,尽管我怀疑你的建议方式可能是更好的方法 – mr1031011

+0

只是一个更新:ngx.ctx只在该特定的请求/子请求中保存值,所以它不起作用对我来说,因为这意味着数据不会在我的示例中的上述2个位置块中共享。所以现在我正在研究使用模块本地foo = require“foo”,但问题是只要nginx工作者仍然活着,模块就会在所有请求中保持数据共享。 – mr1031011