Несколько сайтов django с apache & mod_wsgi

Я хочу разместить несколько сайтов под тем же сервером, который использует Debian 5, скажем, у меня есть site1, site2 а также site3и предположим, что мой IP 155.55.55.1:

site1: 155.55.55.1:80  , script at /opt/django/site1/
site2: 155.55.55.1:8080, script at /opt/django/site2/
site3: 155.55.55.1:8090, script at /opt/django/site3/

Вот мой Apache по умолчанию:

<VirtualHost *:80>
    ServerName /
    ServerAlias  */
    DocumentRoot /opt/django/site1/
    LogLevel warn
    WSGIScriptAlias / /opt/django/site1/apache/django.wsgi
    Alias /media /opt/django/site1/media/statics
    Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media 
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/usr/share/phpmyadmin"
    ServerName /phpmyadmin
    Alias /phpmyadmin /usr/share/phpmyadmin
    <Directory /usr/share/phpmyadmin>
        Options Indexes FollowSymLinks
        AllowOverride None
        Order Deny,Allow
        Allow from all
    </Directory>
</VirtualHost>

А вот мой конфиг wsgi для site1, в /opt/django/site1/apache/django.wsgi:

import os, sys
import django.core.handlers.wsgi

sys.path.append('/opt/django')
sys.path.append('/opt/django/site1')

os.environ['DJANGO_SETTINGS_MODULE'] = 'site1.settings'
application = django.core.handlers.wsgi.WSGIHandler()

Как я могу добавить site2 а также site3, которые являются сайтами на основе Django и будут обслуживаться как site1?

2 ответа

Решение

Ваши директивы ServerName/ServerAlias ​​неверны. Имя_сервера должно быть именем хоста. Вы, вероятно, должны просто удалить ServerAlias.

Затем просто выполните очевидные и повторяющиеся директивы VirtualHost / Listen, просто изменив номер порта и расположение сценариев в файловой системе.

Наконец, не устанавливайте DocumentRoot там, где находится ваш код Django, так как это упрощает случайное предоставление исходного кода для загрузки, если вы заполняете конфигурацию Apache. Поэтому просто удалите директиву DocumentRoot из VirtualHost для сайтов Django.

Listen 80

<VirtualHost *:80>
ServerName www.example.com
WSGIScriptAlias / /opt/django/site1/apache/django.wsgi
Alias /media /opt/django/site1/media/statics
Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media

<Directory opt/django/site1/apache>
Order allow,deny
Allow from all
</Directory>

<Directory /home/myuser/Django-1.1/django/contrib/admin/media>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Listen 8080

<VirtualHost *:8080>
ServerName www.example.com
WSGIScriptAlias / /opt/django/site2/apache/django.wsgi
Alias /media /opt/django/site2/media/statics
Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media

<Directory opt/django/site2/apache>
Order allow,deny
Allow from all
</Directory>

<Directory /home/myuser/Django-1.1/django/contrib/admin/media>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Listen 8090

<VirtualHost *:8090>
ServerName www.example.com
WSGIScriptAlias / /opt/django/site3/apache/django.wsgi
Alias /media /opt/django/site3/media/statics
Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media

<Directory opt/django/site3/apache>
Order allow,deny
Allow from all
</Directory>

<Directory /home/myuser/Django-1.1/django/contrib/admin/media>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Я также добавил отсутствующую директиву Directory для разрешения доступа к статическим файлам. Вы должны пересмотреть пути однако.

Убедитесь, что вы читаете:

http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines

для дополнительной информации.


ОБНОВЛЕНИЕ 1

Кстати, поскольку вы используете PHP в одном и том же Apache, вам было бы намного лучше использовать режим демона mod_wsgi и помещать каждый экземпляр Django в отдельный процесс. Это позволяет этим процессам быть многопоточными, даже если основные процессы Apache вынуждены быть однопоточными из-за PHP. Конечный результат будет использовать намного меньше памяти, чем при запуске нескольких экземпляров Django в каждом процессе во встроенном режиме с prefork MPM. Ваш код Django просто должен быть потокобезопасным. Конфигурация в дополнение к вышеупомянутому будет заключаться в добавлении WSGIDaemonProcess/WSGIProcessGroup к каждому Django VirtualHost, где имя группы процессов демона отличается для каждого VirtualHost.

<VirtualHost *:80>
WSGIDaemonProcess site1 display-name=%{GROUP}
WSGIProcessGroup site1
... existing stuff
</VirtualHost>

<VirtualHost *:8080>
WSGIDaemonProcess site2 display-name=%{GROUP}
WSGIProcessGroup site2
... existing stuff
</VirtualHost>

<VirtualHost *:8090>
WSGIDaemonProcess site3 display-name=%{GROUP}
WSGIProcessGroup site3
... existing stuff
</VirtualHost>

Это также позволяет вам легче перезапустить каждый экземпляр Django без перезапуска всего Apache. Читать:

http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

Размещение всей конфигурации virtualHost в одном месте работает нормально, но Debian имеет свою собственную концепцию, разделяя их в файле для каждого сайта в /etc/apache2/sites-available, которые активируются путем символической ссылки в../sites-enabled. Таким образом, администратор сервера может также назначить отдельные права доступа к файлу конфигурации для каждого пользователя unix сайта-администратора, сценарии могут проверить, активен ли сайт и т. Д.

По сути, было бы неплохо иметь один центральный инструктаж для установок Django-Admin, текущее множество отдельных документов, ссылок и статей в блогах не очень помогает распространению Django.

Другие вопросы по тегам