Виртуальные хосты NGINX с отдельными переменными lua_package_path

Я пытаюсь обслуживать два (Openresty) веб-приложения Lua в качестве виртуальных хостов из 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

Как лучше всего обслуживать несколько (Openresty) Lua-приложений с их собственными lua_package_path, являющимися виртуальными хостами на одном и том же IP-адресе и порту?


person Gawin    schedule 22.09.2016    source источник


Ответы (2)


Я столкнулся с этой проблемой несколько месяцев назад. Я не рекомендую использовать проекты отладки и выпуска на одном сервере. Например, запуск одного приложения nginx для обоих ключей (отладки и выпуска) может привести к неожиданному поведению. Но, тем не менее, можно настроить:

  1. package.path = './mylib/?.lua;' .. package.path внутри lua-скрипта.
  2. Вы можете настроить свое собственное состояние local DEBUG = false и управлять им внутри приложения.
  3. Очевидно, используйте другую машину для отладки. Имхо, лучшее решение.
  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';
              }
          }
        }
person Vyacheslav    schedule 22.09.2016
comment
Спасибо за подсказки, очень помогли! И я полностью согласен с разделением рабочих серверов и серверов разработки в реальной среде. Хотя в этом случае на моем ноутбуке работает 12 виртуальных хостов, и мне не хочется запускать для этого 12 отдельных виртуальных серверов (или процессов NGINX). - person Gawin; 22.09.2016

Исправлено удаление 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

-- 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 вместо корня моего приложения. Даже с добавлением . для пути.

person Gawin    schedule 22.09.2016