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

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

<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?


person Hellnar    schedule 12.10.2009    source источник
comment
Я отредактировал свой вопрос, извините, что забыл :)   -  person Hellnar    schedule 12.10.2009


Ответы (2)


Ваши директивы ServerName/ServerAlias ​​неверны. ServerName должно быть именем хоста. Вероятно, вам следует просто удалить 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#Hosting_Of_Static_Files

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


ОБНОВЛЕНИЕ 1

Кстати, поскольку вы используете PHP в том же Apache, вам было бы гораздо лучше использовать режим демона mod_wsgi и выталкивать каждый экземпляр Django в отдельный процесс. Это позволяет этим процессам быть многопоточными, хотя основные процессы Apache вынуждены быть однопоточными из-за PHP. Конечным результатом будет гораздо меньше используемой памяти, чем при запуске нескольких экземпляров Django в каждом процессе во встроенном режиме с prefork MPM. Ваш код 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

person Graham Dumpleton    schedule 12.10.2009
comment
ничего себе спасибо за ваше нежное и подробное объяснение Грэм! Я управляю своими сайтами внутри своей компании, поэтому у них нет домена, но есть внутренний DNS, и доступ к ним возможен только локально через mysite , в этом случае я должен изменить имя сервера www.example.com на имя сервера mysite? - person Hellnar; 13.10.2009
comment
Мне также нравится добавлять python-path в строку WSGIDaemonProcess, чтобы воспользоваться преимуществами virtualenv и локализовать мои сайт-пакеты python в каком-нибудь интеллектуальном месте. - person rjmoggach; 22.10.2012
comment
@mogga Если вы используете mod_wsgi 3.4, вам лучше использовать новую опцию python-home вместо python-path. - person Graham Dumpleton; 22.10.2012
comment
@GrahamDumpleton, вы сказали, что DocumentRoot не должно быть в виртуальном хосте, но тогда куда мне его поместить. или нет необходимости в корневом каталоге документов для приложений django. То же самое относится и к php virualconf - person user1958218; 05.07.2013
comment
Я не говорил, что DocumentRoot не должен находиться на виртуальном хосте. Я сказал: «Не устанавливайте DocumentRoot там, где находится ваш код Django». DocumentRoot ссылается на каталог. Если WSGIScrtipAlias ​​не был определен, Apache будет обслуживать файлы из каталога, указанного в DocumentRoot. Таким образом, было бы неразумно, чтобы DocumentRoot ссылался на каталог, в котором находится ваш исходный код, потому что, если WSGIScriptAlias ​​по какой-то причине не применяется, люди могут загрузить ваш исходный код. - person Graham Dumpleton; 08.07.2013
comment
В CentOS 6 я получал Permission denied: mod_wsgi...Unable to connect to WSGI daemon process.... Решение заключалось в том, чтобы добавить WSGISocketPrefix /var/run/wsgi в мой основной файл конфигурации apache, то есть вне настроек VirtualHost. Кроме того, запуск mod_wsgi в режиме демона решил некоторые can't pickle... ошибки, которые я наблюдал. См. это и это. - person Banjer; 19.08.2013

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

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

person Ed Doerr    schedule 02.11.2013