NGINX虚拟主机使用单独的lua_package_path变量

我正在尝试使用NGINX作为虚拟主机来服务于两个(Openresty)Lua Web应用程序,它们都需要自己独特的lua_package_path,但很难得到正确的配置。

# 配置文件 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"指令在example.conf中重复

  2. 如果您在server块内定义lua_package_path,则会收到此错误:[emerg] "lua_package_path"指令在example.conf中不允许

  3. 如果您在http块中两次定义lua_package_path(这也没有任何意义),则会收到此错误:[emerg] "lua_package_path"指令在example.conf中重复

使用其自己的lua_package_path来服务于多个(Openresty)Lua应用程序,以及作为在同一IP和端口上的虚拟主机,最佳实践是什么?

点赞
用户1979882
用户1979882

我几个月前遇到过这个问题。 我不建议在同一个服务器上使用调试和发布项目。例如,你启动一个 Nginx 应用程序同时包括(调试和发布)键可能导致意外行为。 但是,你可以设置:

  1. 在 lua 脚本内设置 package.path = './mylib/?.lua;' .. package.path
  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';
               }
           }
         }
2016-09-22 10:09:33
用户351659
用户351659

我将 lua_package_path 从 NGINX 配置中移除(因为 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

-- 获取 app.lua 的当前路径
local function script_path()
   local str = debug.getinfo(2, "S").source:sub(2)
   return str:match("(.*/)")
end

-- 将当前路径添加到包路径中
package.path = script_path() .. '?.lua;' .. package.path

-- 加载 config.lua 包
local config = require("config")

-- 使用 config
config.env()['redis']['host']

...

这允许我从与 app.lua 相同的目录中读取 config.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 配置根目录而不是我的应用程序根目录。即使在路径前加上 也是如此。

2016-09-22 11:23:27