2008-09-17 2 views
3

Что такое хорошие (или, по крайней мере, умные) способы запуска нескольких сайтов из единой общей веб-структуры Python (например, Pylons, TurboGears и т. Д.)? Я знаю, что вы можете перенаправить на основе домена или пути, чтобы переписать URI, чтобы указать на сайт, и я также видел несколько жестоких «if site == 'site1'/elseif/elseif/etc», которых я бы хотел избежать.Запуск нескольких сайтов из одного веб-фрейма Python

ответ

8

Django имеет этот встроенный шкаф. См. the sites framework.

Как общий метод, включите столбец «хозяин» в вашей схеме базы данных, прикрепленный к данным, которые вы хотите использовать для конкретного хоста, а затем включите заголовок HTTP Host в запросе, когда вы извлекаете данные.

2

Я использую CherryPy как мой веб-сервер (который поставляется в комплекте с Turbogears), и я просто запускаю несколько экземпляров веб-сервера CherryPy на разных портах, привязанных к localhost. Затем я настраиваю Apache с mod_proxy и mod_rewrite для прозрачной пересылки запросов на соответствующий порт на основе HTTP-запроса.

1

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

Я бы использовал pound в качестве обратного прокси для выполнения этой работы. Он маленький, быстрый, простой и делает именно то, что нам нужно здесь.

ЧТО ТАКОЕ POUND:

  1. обратный прокси: он передает запросы от клиентских браузеров на один или несколько внутренних серверов.
  2. Балансировщик нагрузки: он будет распространять запросы из клиентских браузеров среди нескольких серверных серверов, сохраняя информацию о сеансе.
  3. SSL-обертка: Pound расшифрует HTTPS-запросы от клиентских браузеров и передаст их как обычный HTTP-сервер на внутренние серверы.
  4. дезинфицирующее средство HTTP/HTTPS: фунт проверяет запросы на правильность и принимает только хорошо сформированные.
  5. fail over-server: если сервер back-end терпит неудачу, Pound примет к сведению факт и прекратит передавать запросы до его восстановления.
  6. перенаправитель запроса: запросы могут быть распределены между серверами в соответствии с запрошенным URL-адресом.
6

Использование 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 для каждого сайта (имя, которое вы вводите произвольно) сохраняет пространство имен отдельно.