web-dev-qa-db-fra.com

plusieurs sites Django avec Apache et mod_wsgi

Je veux héberger plusieurs sites avec le même serveur qui utilise Debian 5, disons que j'ai site1, site2 et site3, et supposons que mon adresse 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 ma valeur par défaut 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>

Et voici ma configuration wsgi 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 site2 et site3, qui sont des sites basés sur Django et seront servis comme site1?

56
Hellnar

Vos directives ServerName/ServerAlias ​​sont incorrectes. ServerName doit être le nom d'hôte. Vous devriez probablement supprimer ServerAlias.

Ensuite, faites simplement les directives VirtualHost/Listen évidentes et dupliquées, en changeant simplement le numéro de port et l'emplacement des scripts dans le système de fichiers.

Enfin, ne définissez pas DocumentRoot pour que votre code Django se trouve, car il est plus facile d'exposer accidentellement votre code source à télécharger si vous remplissez la configuration Apache. Donc, supprimez simplement la directive DocumentRoot de VirtualHost pour les sites 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>

J'ai également ajouté la directive Directory manquante pour autoriser l'accès aux fichiers statiques. Vous devriez cependant revoir les chemins.

Assurez-vous de lire:

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

pour plus d'informations.


MISE À JOUR 1

BTW, puisque vous utilisez PHP dans le même Apache, vous feriez beaucoup mieux d'utiliser le mode démon mod_wsgi et de pousser chaque instance de Django dans son propre processus séparé. Cela permet à ces processus d'être multithread, même si les processus Apache principaux sont obligés d'être à thread unique à cause de PHP. Le résultat final sera beaucoup moins de mémoire utilisée que si vous exécutiez plusieurs instances Django dans chaque processus en mode incorporé avec prefork MPM. Votre code Django doit simplement être thread-safe. La configuration en plus de ci-dessus serait d'ajouter WSGIDaemonProcess/WSGIProcessGroup à chaque Django VirtualHost, où le nom du groupe de processus démon est différent pour chaque 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>

Cela vous permet également de redémarrer plus facilement chaque instance de Django sans redémarrer l'ensemble d'Apache. Lis:

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

104
Graham Dumpleton

Mettre toute la configuration de virtualHost au même endroit 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 en les associant à ../sites-enabled. De cette façon, un administrateur de serveur pourrait également attribuer des droits d'accès distincts au fichier de configuration pour chacun des utilisateurs unix de l'administrateur du site, les scripts peuvent vérifier si un site est actif, etc.

Fondamentalement, il serait agréable d'avoir un guide central pour les installations Django-Admin, la multitude actuelle de documents, liens et articles de blog séparés n'est pas vraiment utile pour la prolifération de Django.

2
Ed Doerr