несколько сайтов django с apache & mod_wsgi - PullRequest
56 голосов
/ 12 октября 2009

Я хочу разместить несколько сайтов на одном сервере, использующем 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 ]

104 голосов
/ 12 октября 2009

Ваши директивы 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#Hosting_Of_Static_Files

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


ОБНОВЛЕНИЕ 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#Delegation_To_Daemon_Process http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

2 голосов
/ 02 ноября 2013

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

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

...