Несколько сайтов 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.