我试图将两个(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
}
}
如果您定义http
两次(每个主机一个),您将收到此错误:[emerg] "http" directive is duplicate in example.conf
如果您在lua_package_path
区块内定义server
,则会收到以下错误:[emerg] "lua_package_path" directive is not allowed here in example.conf
如果您在lua_package_path
块中定义了http
两次(无论如何都没有任何意义),您将收到以下错误:[emerg] "lua_package_path" directive is duplicate in example.conf
使用自己的lua_package_path
为同一IP和端口上的虚拟主机提供多个(Openresty)Lua应用程序的最佳做法是什么?
答案 0 :(得分:2)
我几个月前遇到过这个问题。 我不建议在同一台服务器上不使用调试和发布项目。例如,为两个(调试和释放)键启动一个nginx应用程序可能会导致无法预料的行为。 但是,你可以设置:
package.path = './mylib/?.lua;' .. package.path
。 local DEBUG = false
州并在应用内进行管理。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'; } } }
答案 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。即使在路径前加.
。