4 juil 09
[Tuto] Nginx et Django : serveur de production Python
Posté dans Tutoriaux | Tags :Debian, Django, Nginx, Python, serveur | 6 Commentaires »
Après PHP et Ruby On Rails sur Nginx, on s’attaque maintenant au Python et a son formidable framework qu’est Django. Et je peux vous le dire tout de suite, un serveur comme Nginx avec la stabilité de Python font qu’avec ces technologies vous pouvez aller loin, très loin niveau performance !
Pour information, je suis monté à plus de 500 pages servies par seconde (d’un blog sous Django) en utilisant moins de 100Mo de Ram (pour les processus Python) et 20% d’un CPU Core2Duo E7200. Plutôt pas mal ! La même chose avec Apache et PHP et vous voilà avec un serveur down :/
Dans un premier temps il faut installer Python/Django sur votre serveur. Vous pouvez suivre ce que dit le site officiel (ce que j’ai fait) ou l’installer via:
apt-get install python-django
Si vous avez pas ce qu’il faut d’installé, apt devrait vous proposer de le faire
Maintenant configurons Python en FastCGI.
Pour lancer un serveur python pour voir votre projet Django il faut aller dans le dossier de votre projet et lancer le fameux serveur
apt-get install python-flup cd /var/www/projet_django python manage.py runfcgi method=prefork host=127.0.0.1 port=8000 pidfile=/var/run/projet_django.pid
Ainsi vous lancez le serveur python en FastCGI, seulement en local et sur le port 8000 avec le pid (identifiant du processus) mis dans un fichier. Vous pouvez bien entendu changer le port mais n’oubliez pas de le changer aussi dans le fichier de configuration d’Nginx ! Ensuite pourquoi mettre un fichier avec le pid ? Simplement pour savoir quel processus arrêter quand on veut arrêter le serveur Python.
Tout ça c’est bien mais il faut l’automatiser.
Créez un fichier dans /etc/init.d/ se nommant par exemple « projet_django »
Dans ce fichier mettez
#!/bin/bash # Replace these three settings. PROJDIR="/var/www/projet_django" PIDFILE="/var/run/projet_django.pid" PORT=8000 case "$1" in start) cd $PROJDIR python manage.py runfcgi method=prefork host=127.0.0.1 port=$PORT pidfile=$PIDFILE RETVAL=$? ;; stop) kill `cat -- $PIDFILE` rm -f -- $PIDFILE RETVAL=$? ;; restart) kill `cat -- $PIDFILE` rm -f -- $PIDFILE cd $PROJDIR python manage.py runfcgi method=prefork host=127.0.0.1 port=$PORT pidfile=$PIDFILE RETVAL=$? ;; *) echo "Usage: projet_django {start|stop|restart}" exit 1 ;; esac exit $RETVAL
Pour être certain que le script marche :
chmod 755 /etc/init.d/projet_django
Maintenant pour lancer ou arrêter votre serveur Python il suffit de faire
/etc/init.d/projet_django start|stop|restart
Python permet d’exécuter le serveur FastCGI de deux façons. Soit en threaded ou prefork. Normalement le mode threaded est plus performant comparé au prefork. Mais d’après mes tests ce n’est pas le cas avec Python. C’est assez étrange car généralement un mode prefork consomme plus de ressources qu’avec des threads. Mais j’ai vraiment bouriné pour savoir lequel est le plus performant. Quand il y a peu de requêtes c’est identique mais c’est vers les 500 reqs/sec qu’on commence à voir que Python reste performant avec le mode prefork et plus avec les threads…J’ai été le premier surpris…
Maintenant il reste à configurer Nginx pour qu’il redirige tout ce qui arrive vers le serveur Python qu’on vient de créer. Normalement vous avez dans /etc/nginx/sites-available la configuration pour chacun de vos sites. Ajoutez simplement ce qui suit où vous le souhaitez.
server { listen 80; server_name projetdjango.maximegaillard.com; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { root /var/www/projet_django; index index.html; fastcgi_pass 127.0.0.1:8000; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param QUERY_STRING $query_string; fastcgi_param SERVER_NAME $server_name; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass_header Authorization; fastcgi_intercept_errors off; } }
Maintenant relancez Nginx :
/etc/init.d/nginx restart
et lancez le serveur Python :
/etc/init.d/projet_django start
Il vous suffit d’aller sur l’url de votre site et normalement tout marche




Niiiiice !
Un bon tuto merci beaucoup !
Héhé, merci bien, je vais en avoir besoin je pense
Et sinon t’aurais pas des liens avec des benchmarks en couleurs qui compare les framework web ? (django, rails, symphony, zend etc…) ?
Non, mes benchmarks perso sont moches et en texte !
Je remonte ce vieux sujet, mais en suivant a la lettre tes instrctions, bien que cela fontionne, tous les « medias » ne montent pas. En gros, tout ce qui est Css/images/js de l’interface admin sont inexistants.
Je n’ai toujours pas trouve de solution, mais il y a un post ouvert sur StackOverflow si ca te branche:Â http://stackoverflow.com/questions/3364070/django-ugly-admin-interface
C’est juste un problème de CSS. Il te suffit d’enregistrer en dur le fichier que tu as en dev pour qu’il le trouve et que ça marche