Назад | Перейти на главную страницу

Как реализовать несколько сайтов с использованием одного и того же кода на одном сервере Apache?

У меня есть код mod_cgi "site.py", который используется для обслуживания веб-сайта. Я запускаю несколько экземпляров этого веб-сайта на одном сервере apache, каждый экземпляр имеет свой собственный файл конфигурации.

В настоящее время моя конфигурация apache (httpd.conf) содержит

ScriptAlias /siteA /path/to/mainA.py # loads configA.txt then runs site.py
ScriptAlias /siteB /path/to/mainB.py # loads configB.txt then runs site.py
ScriptAlias /siteC /path/to/mainC.py # loads configC.txt then runs site.py
. . .

Есть ли лучший способ иметь несколько таких сайтов? Было бы хорошо иметь способ избежать записи httpd.conf для каждого сайта и / или не требовать mainX.py для каждого сайта.

Цель состоит в том, чтобы создавать / изменять меньше файлов, если я хочу добавить еще один сайт или когда мне нужно внести изменения.

На основании отзывов (спасибо Петру) и дальнейших исследований это лучшее, что я придумал. Я все еще надеюсь узнать, «как вы должны это делать», и буду признателен за любой дальнейший вклад.

Проблема: Слишком много записей httpd.conf

Решение: Разовая запись

ScriptAliasMatch ^/site(.*) "/path/to/site.py"

Возможно опубликовать две версии кода sitesingle.py и sitemulti.py.

Проблема: Одна версия siteX.py для каждого сайта.

Решение: попросите site.py (или sitemulti.py) взглянуть на переменную среды SCRIPT_NAME, чтобы определить, какой экземпляр сайта будет обслуживать.

Проблема: Слишком много файлов конфигурации.

Решение: Создайте один файл конфигурации, содержащий подразделы для каждого сайта, как показано в следующем примере:

[path]
    datapath = /path/to/generic/data
    pythonpath = /pythonpath/for/all/sites

[sitea]
    [[path]]
        datapath = /path/to/siteA/data

site.py объединит подраздел сайта с общим пространством конфигурации. (проще всего с ConfigObj который поддерживает подразделы и слияние).

Проблема: Необходимо отредактировать site.py, чтобы указать правильный файл конфигурации.

Нет хорошего решения: Можно установить переменную среды в httpd.conf, которая читается site.py (или sitesingle.py или sitemulti.py)

Самый простой способ - изменить ваш скрипт, чтобы загрузить отдельный файл конфигурации для каждого виртуального хоста.

Поскольку вы используете mod_cgi ваш скрипт получает всю информацию относительно HTTP-запроса в переменные среды. Есть некоторые стандартные переменные CGI доступен во всех средах CGI, и Apache добавляет некоторые собственные переменные.

Все, что вам нужно сделать, это прочитать НАЗВАНИЕ СЕРВЕРА и выберите свою конфигурацию соответственно примерно таким:

config_file = 'config-' + os.environ['SERVER_NAME'] + '.txt'
if not os.path.exists(config_file):
    config_file = 'config-default.txt'

На стороне Apache вы можете использовать значение по умолчанию <VirtualHost> или <VirtualHost> со всеми ServerAliasтебе нужно.

редактировать: После перечитывания вашего вопроса кажется, что ваши сайты являются подкаталогами того же пространства URL. Итак, вам нужно проверить SCRIPT_NAME вместо того НАЗВАНИЕ СЕРВЕРА.