Что такое хорошие (или, по крайней мере, умные) способы запуска нескольких сайтов из единой общей веб-структуры Python (например, Pylons, TurboGears и т. Д.)? Я знаю, что вы можете перенаправить на основе домена или пути, чтобы переписать URI, чтобы указать на сайт, и я также видел несколько жестоких «if site == 'site1'/elseif/elseif/etc
», которых я бы хотел избежать.Запуск нескольких сайтов из одного веб-фрейма Python
ответ
Django имеет этот встроенный шкаф. См. the sites framework.
Как общий метод, включите столбец «хозяин» в вашей схеме базы данных, прикрепленный к данным, которые вы хотите использовать для конкретного хоста, а затем включите заголовок HTTP Host
в запросе, когда вы извлекаете данные.
Я использую CherryPy как мой веб-сервер (который поставляется в комплекте с Turbogears), и я просто запускаю несколько экземпляров веб-сервера CherryPy на разных портах, привязанных к localhost. Затем я настраиваю Apache с mod_proxy и mod_rewrite для прозрачной пересылки запросов на соответствующий порт на основе HTTP-запроса.
Использование нескольких экземпляров сервера в локальных портах - хорошая идея, но для перенаправления HTTP-запросов вам не нужен полноценный веб-сервер.
Я бы использовал pound в качестве обратного прокси для выполнения этой работы. Он маленький, быстрый, простой и делает именно то, что нам нужно здесь.
ЧТО ТАКОЕ POUND:
- обратный прокси: он передает запросы от клиентских браузеров на один или несколько внутренних серверов.
- Балансировщик нагрузки: он будет распространять запросы из клиентских браузеров среди нескольких серверных серверов, сохраняя информацию о сеансе.
- SSL-обертка: Pound расшифрует HTTPS-запросы от клиентских браузеров и передаст их как обычный HTTP-сервер на внутренние серверы.
- дезинфицирующее средство HTTP/HTTPS: фунт проверяет запросы на правильность и принимает только хорошо сформированные.
- fail over-server: если сервер back-end терпит неудачу, Pound примет к сведению факт и прекратит передавать запросы до его восстановления.
- перенаправитель запроса: запросы могут быть распределены между серверами в соответствии с запрошенным URL-адресом.
Использование Django на Apache с mod_python, я разместить несколько (несвязанный) Джанго сайты просто с помощью следующей апачи конфигурации:
<VirtualHost 1.2.3.4>
DocumentRoot /www/site1
ServerName site1.com
<Location />
SetHandler python-program
SetEnv DJANGO_SETTINGS_MODULE site1.settings
PythonPath "['/www'] + sys.path"
PythonDebug On
PythonInterpreter site1
</Location>
</VirtualHost>
<VirtualHost 1.2.3.4>
DocumentRoot /www/site2
ServerName site2.com
<Location />
SetHandler python-program
SetEnv DJANGO_SETTINGS_MODULE site2.settings
PythonPath "['/www'] + sys.path"
PythonDebug On
PythonInterpreter site2
</Location>
</VirtualHost>
Нет необходимости в нескольких экземпляров апача или прокси-серверах. Использование другой директивы PythonInterpreter для каждого сайта (имя, которое вы вводите произвольно) сохраняет пространство имен отдельно.