wake-up-neo.com

Mehrere Django Sites mit Apache & mod_wsgi

Ich möchte mehrere Sites mit unter demselben Server hosten, der Debian 5 verwendet. Sagen wir, ich habe site1, site2 Und site3 Und nehme an, meine IP ist 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/

Hier ist meine Apache-Standardeinstellung:

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

Und hier ist meine wsgi-Konfiguration für site1 Unter /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()

Wie kann ich site2 Und site3 Hinzufügen, die auf Django basieren und wie site1 Bereitgestellt werden?

56
Hellnar

Ihre ServerName/ServerAlias-Direktiven sind falsch. Servername sollte Hostname sein. Sie sollten wahrscheinlich nur ServerAlias ​​löschen.

Führen Sie dann einfach die offensichtlichen und duplizierten VirtualHost/Listen-Anweisungen aus und ändern Sie lediglich die Portnummer und die Position der Skripte im Dateisystem.

Stellen Sie DocumentRoot schließlich nicht so ein, dass Ihr Django-Code sich dort befindet, da dies das versehentliche Offenlegen Ihres Quellcodes zum Herunterladen erleichtert, wenn Sie die Apache-Konfiguration stopfen. Entfernen Sie einfach die DocumentRoot-Direktive von VirtualHost für Django Sites.

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>

Ich habe auch fehlende Directory-Direktive hinzugefügt, um den Zugriff auf statische Dateien zu ermöglichen. Sie sollten jedoch die Pfade überprüfen.

Stellen Sie sicher, dass Sie lesen:

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

für weitere Informationen.


UPDATE 1

Übrigens, da Sie PHP in demselben Apache verwenden, ist es viel besser, den Daemon-Modus mod_wsgi zu verwenden und jede Django -Instanz in einen eigenen separaten Prozess zu verschieben. Dies ermöglicht das Multithreading dieser Prozesse, obwohl die Apache-Hauptprozesse aufgrund von PHP gezwungen sind, Single-Threading-Prozesse auszuführen. Das Endergebnis ist viel weniger Arbeitsspeicher, als wenn in jedem Prozess im eingebetteten Modus mit Prefork MPM mehrere Django Instanzen ausgeführt werden. Ihr Django Code muss nur threadsicher sein. Zusätzlich zu der obigen Konfiguration würde WSGIDaemonProcess/WSGIProcessGroup zu jedem Django VirtualHost hinzugefügt, wobei der Name der Daemon-Prozessgruppe für jeden VirtualHost unterschiedlich ist.

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

Auf diese Weise können Sie auch jede Instanz von Django einfacher neu starten, ohne den gesamten Apache neu zu starten. Lesen:

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

104

Alle virtualHost-Konfigurationen an einem Ort zu platzieren, funktioniert gut, aber Debian hat ein eigenes Konzept, indem sie in einer Datei für jede Site in/etc/Apache2/sites-available getrennt werden. Diese werden durch Verknüpfen in ../sites-enabled aktiviert. Auf diese Weise kann ein Serveradministrator auch jedem der Site-Administrator-Unix-Benutzer separate Zugriffsrechte für die Konfigurationsdatei zuweisen, Skripte können prüfen, ob eine Site aktiv ist usw.

Grundsätzlich wäre es schön, ein zentrales Howto für Django-Admin-Installationen zu haben. Die derzeitige Vielzahl separater Dokumente, Links und Blog-Artikel ist für die Verbreitung von Django nicht wirklich hilfreich.

2
Ed Doerr