57 votes

plusieurs django sites avec apache & mod_wsgi

Je veux héberger plusieurs sites avec le même serveur qui utilise Debian 5, dire que j'ai l' site1, site2 et site3, et d'assumer mon ip est - 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/

Voici mon apache par défaut:

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

Et voici mon wsgi config pour 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()

Comment puis-je ajouter de la site2 et site3, qui sont Django sites et serez servi comme l' site1?

104voto

Graham Dumpleton Points 23711

Votre ServerName/ServerAlias directives sont mauvais. ServerName doit être le nom d'hôte. Vous devriez probablement juste de supprimer la directive ServerAlias.

Ensuite, il suffit de faire l'évident et de dupliquer les VirtualHost/Écouter les directives, en changeant simplement le numéro de port et les emplacements des scripts dans le système de fichiers.

Enfin, ne réglez pas le DocumentRoot d'être là où votre Django code est comme il est plus facile d'exposer accidentellement votre code source à télécharger si vous avez des trucs de configuration d'Apache. Donc, il suffit de retirer directive DocumentRoot de VirtualHost pour 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>

J'ai également ajouter un Répertoire manquant directive pour permettre l'accès à des fichiers statiques. Vous devriez passer en revue les chemins cependant.

Assurez-vous de lire:

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

pour de plus amples informations.


Mise à JOUR 1

BTW, puisque vous utilisez PHP en même Apache, vous seriez beaucoup mieux à l'aide de mod_wsgi mode démon et pousser chaque instance de Django dans son propre processus. Qui permet à ces processus multithread, même si les principaux processus Apache sont forcés d'être mono-thread en raison de PHP. Résultat final sera beaucoup beaucoup moins de mémoire utilisée que si l'exécution de plusieurs Django instances dans chaque processus en vertu de la mode imbriqué avec le MPM prefork. Votre Django code doit être thread-safe. Configuration, en plus de ci-dessus serait d'ajouter WSGIDaemonProcess/WSGIProcessGroup à chaque Django VirtualHost, d'où le nom de démon groupe de processus est différent pour chaque serveur Virtuel.

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

Cela permet de plus facilement redémarrer chaque instance de Django sans redémarrer tout de Apache. Lire:

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

2voto

Ed Doerr Points 11

Mettre tous les virtualHost de configuration dans un lieu qui fonctionne bien, mais Debian a son propre concept en les séparant dans un fichier pour chaque site dans /etc/apache2/sites-available, qui sont activés par faire un lien symbolique dans ../sites-enabled. De cette façon, un serveur admin pourrait également affecter séparer les droits d'accès au fichier de configuration pour chaque site-admin unix utilisateurs, les scripts peuvent vérifier si un site est actif etc.

Fondamentalement, il serait agréable d'avoir une centrale howto pour Django-Admin installations, la multitude de séparer les docs, des liens et des articles de blog n'est pas vraiment utile pour la prolifération de Django.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X