NGINX虚拟主机具有单独的lua_package_path变量

时间:2016-09-22 08:19:25

标签: nginx configuration lua virtualhost openresty

我试图将两个(Openresty)Lua Web应用程序作为NGINX的虚拟主机提供服务,这两个应用程序都需要自己独特的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] "http" directive is duplicate in example.conf

  2. 如果您在lua_package_path区块内定义server,则会收到以下错误:[emerg] "lua_package_path" directive is not allowed here in example.conf

  3. 如果您在lua_package_path块中定义了http两次(无论如何都没有任何意义),您将收到以下错误:[emerg] "lua_package_path" directive is duplicate in example.conf

    < / LI>

    使用自己的lua_package_path为同一IP和端口上的虚拟主机提供多个(Openresty)Lua应用程序的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

我几个月前遇到过这个问题。 我不建议在同一台服务器上不使用调试和发布项目。例如,为两个(调试和释放)键启动一个nginx应用程序可能会导致无法预料的行为。 但是,你可以设置:

    lua-script里面的
  1. package.path = './mylib/?.lua;' .. package.path
  2. 您可以设置自己的local DEBUG = false州并在应用内进行管理。
  3. 显然,使用其他机器进行调试。 Imo,最好的解决方案。
  4. 执行不同的my.release.luamy.debug.lua文件:
  5. 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';
                  }
              }
            }
    

答案 1 :(得分: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而不是我的应用程序root。即使在路径前加.