2016-09-22 188 views
0

我試圖將兩個(Openresty)Lua web應用程序作爲來自NGINX的虛擬主機提供,它們都需要自己的唯一lua_package_path,但很難正確地獲取配置。如果定義lua_package_pathserver塊內[emerg] "http" directive is duplicate in example.confNGINX具有獨立lua_package_path變量的虛擬主機

  • ,您會收到此錯誤:

    # 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兩次(每個主機),您將收到此錯誤:[emerg] "lua_package_path" directive is not allowed here in example.conf

    2. 如果您在http塊中定義了lua_package_path兩次(無論如何都沒有任何意義),您將收到此消息錯誤:[emerg] "lua_package_path" directive is duplicate in example.conf

    什麼是與自己lua_package_path服務於多個(Openresty)Lua中的應用,在同一個IP和端口是虛擬主機的最佳實踐?

  • 回答

    0

    固定它從NGINX配置中刪除lua_package_path(因爲OpenResty束已經負責加載包),並指着我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'] 
    
    ... 
    

    這讓我讀同一目錄config.lua作爲我app.lua

    -- config.lua 
    
    module('config', package.seeall) 
    
    function env() 
        return { 
        env="development", 
        redis={ 
         host="127.0.0.1", 
         port="6379" 
        } 
        } 
    end 
    

    使用這個我現在可以使用自己的包路徑多個虛擬主機。

    @Vyacheslav謝謝你指向package.path = './mylib/?.lua;' .. package.path!這真的很有幫助!不幸的是,它也一直使用NGINX conf root而不是我的應用程序根目錄。即使預先設定了路徑的.

    1

    我幾個月前遇到過這個問題。 我不建議不要在同一臺服務器上使用調試和發佈項目。例如,爲這兩個(調試和釋放)密鑰啓動一個nginx應用程序可能會導致意外行爲。 但是,儘管如此,你可以設置:

    1. package.path = './mylib/?.lua;' .. package.path LUA腳本里面。
    2. 您可以設置自己的local DEBUG = false狀態並在應用程序內部進行管理。
    3. 顯然,使用其他機器進行調試。伊莫,最好的解決方案。
    4. 執行不同my.release.luamy.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