несколько сайтов 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 config для site1, at /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 55

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>

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

убедитесь, что Вы читаете:

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

для дальнейшего информация.


обновление 1

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

<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#Delegation_To_Daemon_Process http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

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

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