У меня есть код 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 вместо того НАЗВАНИЕ СЕРВЕРА.