2016-09-22 9 views
0

NGALXの仮想ホストとして2つの(Openresty)Lua Webアプリケーションを提供しようとしていますが、いずれも独自のlua_package_pathが必要ですが、設定が正しく行えません。個別のlua_package_path変数を持つNGINX仮想ホスト

# Failing example.conf 

http { 
    lua_package_path = "/path/to/app/?.lua;;" 

    server{ 
    listen  80; 
    server_name example.org 
    } 
} 

http {  
    lua_package_path = "/path/to/dev_app/?.lua;;" 

    server{ 
    listen  80; 
    server_name dev.example.org 
    } 
} 
  1. あなたはhttp二回(各ホストに1つ)を定義する場合は、このエラーを受け取ります:[emerg] "http" directive is duplicate in example.conf

  2. あなたはserverブロック内lua_package_pathを定義する場合は、このエラーを受け取ることになります:[emerg] "lua_package_path" directive is not allowed here in example.conf

  3. httpブロックでlua_package_pathを2回定義すると(これは意味をなさない)、これを受け取りますエラー:[emerg] "lua_package_path" directive is duplicate in example.conf

同じIPとポート上の仮想ホストであること、自分のlua_package_pathで複数(Openresty)Luaのアプリケーションにサービスを提供するベストプラクティスは何ですか?

答えて

0

固定それ(OpenRestyバンドルがすでにロードパッケージの世話をするため)nginxの構成からlua_package_pathを削除し、絶対フルパスに私のcontent_by_lua_fileを指し私のアプリ:その後/var/www/app/app.lua

# example.conf 

http { 

    server{ 
    listen  80; 
    server_name example.org 

    location/{ 
     content_by_lua_file '/var/www/app/app.lua'; 
    } 
    } 

    server{ 
    listen  80; 
    server_name dev.example.org 

    location/{ 
     content_by_lua_file '/var/www/app_dev/app.lua'; 
    } 

    } 
} 

は、私は私のapp.luaファイルの先頭でこれを含ま:

-- app.lua 

-- Get the current path of app.lua 
local function script_path() 
    local str = debug.getinfo(2, "S").source:sub(2) 
    return str:match("(.*/)") 
end 

-- Add the current path to the package path 
package.path = script_path() .. '?.lua;' .. package.path 

-- Load the config.lua package 
local config = require("config") 

-- Use the config 
config.env()['redis']['host'] 

... 

これは私が今、独自のパッケージパスを持つ複数の仮想ホストを使用することができ、これを使用して、私は私のapp.lua

-- config.lua 

module('config', package.seeall) 

function env() 
    return { 
    env="development", 
    redis={ 
     host="127.0.0.1", 
     port="6379" 
    } 
    } 
end 

と同じディレクトリからconfig.luaを読み取ることができます。

@Vyacheslav package.path = './mylib/?.lua;' .. package.pathへのポインタありがとうございます!それは本当に役に立ちました!残念ながら、アプリケーションルートの代わりにNGINX confルートを使用していました。パスのために.を付加していても。

1

私は数か月前にこの問題に直面しました。 同じサーバーにデバッグプロジェクトとリリースプロジェクトを使用しないでください。たとえば、両方の(デバッグとリリース)キーのnginxアプリケーションを起動すると、予期しない動作につながる可能性があります。 しかし、それにもかかわらず、あなたが設定することができます:LUAスクリプト内部

  1. package.path = './mylib/?.lua;' .. package.path
  2. あなた自身のlocal DEBUG = false州を設定し、アプリ内で管理することができます。
  3. 明らかに、デバッグには他のマシンを使用してください。 Imo、最高のソリューション。
  4. 異なるmy.release.luaまたはmy.debug.luaファイルを実行します。
http { 
      lua_package_path "./lua/?.lua;/etc/nginx/lua/?.lua;;"; 



     server{ 
      listen  80; 
      server_name dev.example.org; 
       lua_code_cache off; 


     location/{ 
       default_type text/html; 
       content_by_lua_file './lua/my.debug.lua'; 
       } 
     } 
     server{ 
      listen  80; 
      server_name example.org 

     location/{ 
       default_type text/html; 
       content_by_lua_file './lua/my.release.lua'; 
       } 
      } 
     } 
+0

本当に参考にしていただきありがとうございます。また、実稼働環境で本番サーバーと開発サーバーを分けることには全く同意します。この場合、私はラップトップで12個の仮想ホストを実行していますが、12個の仮想サーバー(またはNGINXプロセス)を実行するような気がしません。 – Gawin

関連する問題