10
06
2009

Part 3 - Site en Python (Django) sous Apache avec mod_wsgi.

(Voici la suite de ma petite série "faire mumuse avec python sur son serveur".)

Nous venons de voir la mise en ligne de notre projet développé en python en utilisant mod_python.

Mais aujourd'hui, nous pouvons utiliser un nouveau module, plus performant que ce dernier, alors pourquoi s'en priver ?

Tout d'abord, installons le. Sous Debian, voici la commande :


apt-get install libapache2-mod-wsgi

Puis activons le :


a2enmod wsgi

ou à la mano :


ln -s /etc/apache2/mods-available/wsgi.load /etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/wsgi.conf /etc/apache2/mods-enabled/

Remarquez qu'il y a aussi un fichier de configuration !
(par défaut, ce fichier de configuration est entièrement commenté. Vous pouvez donc l'ignorer.)

Maintenant, passons aux choses sérieuses, voici à quoi ressemblera votre VirtualHost :


<VirtualHost *:80>
        ServerAdmin postmaster@[domain].tld
        ServerName www.[domain].tld
        ServerAlias [domain].tld
        DocumentRoot /var/www/[domain]/www/[domain]
 
        ErrorLog /var/log/apache2/[domain]_error.log
        LogLevel warn
        CustomLog /var/log/apache2/[domain]_access.log combined
        ServerSignature Off
 
        WSGIScriptAlias / /var/www/[domain]/www/[project_name]/django.wsgi
 
        Alias /media "/var/www/[domain]/www/media"
        <Location "/media/">
                SetHandler None
        </Location>
 
        Alias /static "/var/www/[domain]/www/static"
        <Location "/static/">
                SetHandler None
        </Location>
 
        <LocationMatch "\.(jpg|gif|png)$">
                SetHandler None
        </LocationMatch>
</VirtualHost>

Je passerai sur l'explication des directives pour media et static, que vous trouverez sur le précédent article.

La ligne qui nous intéressent vraiment ici, c'est :
WSGIScriptAlias / /var/www/[domain]/www/[domain]/django.wsgi.

Comme nous l'avions vu dans le précédent article, ma structure de dossier est faite de telle manière que j'ai un dossier correspondant au sous domaine (ici, www), et dedans, trois dossiers :
domain (le même nom que le domaine (aka le nom du projet), qui contiens le code python,
static et
templates).

Maintenant, voici le contenu du fichier django.wsgi :


import os
import sys

sys.path.append('/var/www/[domain]/www/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'domain.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Remarquez que j'ajoute le projet au python path (avec la ligne "sys.path.append"). Je ne précise pas le répertoire qui contiens le code, car la ligne d'après s'en charge (de "/var/www/[domain]/www/" à "domain.settings", j'obtiens /var/www/[domain]/www/[domain]/settings.py !

Redémarrez Apache et voilà !

Tout fonctionne !

Bon, la première fois, ça peut-être un peu long à charger, mais ensuite, le site sera fluide et agréable à naviguer !

Si vous avez des problèmes avec le thème de la partie Admin, vous avez oublié de faire un lien symbolique vers le répertoire "media" du module admin de Django. Pour avoir la démarche, c'est ici.

De plus, si vous désirez plus de détails concernant le module Wsgi, cette page vous aidera probablement.

Share/Save/Bookmark

1 Comment so far ...


  1. Goulwen

    Goulwen says:

    Jun. 07, 2009, 12:58 PM

    A noter que les SetHandler None ne sont pas nécessaires avec mod_wsgi.

    Il est aussi plus prudent de mettre le fichier django.wsgi dans un sous-dossier (par ex. /apache/) car tout le code dans le dossier où se trouve le fichier django.wsgi peut être accessible en cas de problème de configuration du serveur Apache. Il vaut donc mieux créer un sous-dossier de façon à ce que le fichier settings.py ne soit jamais accessible.

Add a comment