2016-10-11 8 views
1

私はPHPや他のものを経由する代わりに、nginxから301のリダイレクトを直接提供するためにluaを使用しようとしています。ブロック間でLUAデータを共有しますか?

私はここに、この記事に触発されています:アイデアは、私はパフォーマンスを向上させるためにnginxの内で直接LUAでそれらを一致し、サーブ、その後、Redisのに直接リダイレクトのリストを保存することができるということです

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

。バックエンドのプロジェクトがsymfonyのであるので

、私は私のニーズに合うように少しのコードを微調整する方法を見つける必要があり、以下の私が持っているものである:ここでは

私はいつもmysite.com/thisを一致させよう/その要求。 mysite.com/app_dev:何も試合は私はdevの環境をサポートしたいので、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を処理する必要が許可すれば、私は、最初のリダイレクトを処理するためのluaスクリプトが含まれています。

これらのURLは場所/ブロックと一致しませんので、ここでinclude luaを再度呼び出す必要があります。問題は、現在mysite.com/this/thatが実際にluaスクリプトを2回呼び出すということです。

私の考えは、最初の呼び出しでtrue/falseフラグを初期化し、それを2番目の呼び出しで使用してスクリプトが既に含まれているかどうかを確認することです。この段階で、私はしかし、変数のスコープを持つ、非常に混乱している:

# 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スクリプトを2回インクルードすると、スクリプトで宣言された変数が呼び出されるたびに常に再宣言されると思いますか?

ありがとう、私は全く新しいので、私の明白な質問を許してください。

答えて

0

私が知る限り、直接Luaファイルを含めることはできません。あなたがOpenrestyを使用しているとすれば、関連する* _by_luaフェーズを使用してリクエストを処理する必要があります。この場合、rewrite_by_luaです。

異なるブロックで互いにグローバルにアクセスすることはできませんが、要求の持続時間の間につかまるngx.ctxテーブルを使用できます。

openrestyフェイズの便利な図表hereがあります。

+0

ありがとうございます。私はngx.ctxを見ていきます。私が必要としているようです。奇妙なことに、インクルードはスクリプトに表示されているように動作しますが、あなたの提案された方法がより良い方法である可能性があります。 – mr1031011

+0

アップデート:ngx.ctxはその特定のリクエスト/サブリクエスト内の値しか保持しませんこれは私の例では、上記の2つの場所ブロックでデータが共有されていないことを意味しています。だから今私はモジュールのローカルfoo = require "foo"を使用して探していますが、問題はnginxワーカーがまだ生きている限り、モジュールはすべての要求で共有されたデータを保持しているということです。 – mr1031011

関連する問題