FluxRSS FlickR Twitter

Maxime Gaillard

DESCARTES : Je pense, donc je blog !

4 juil 09

[Tuto] Nginx et Django : serveur de production Python

Posté dans Tutoriaux | Tags :, , , , | 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 :D

Dans le même genre:




6 Supers Commentaires pour “[Tuto] Nginx et Django : serveur de production Python”




  1. CactO_os
    Votre avatar
  2. Un bon tuto merci beaucoup !

  3. 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…) ?

  4. Maxime
    Votre avatar

    Non, mes benchmarks perso sont moches et en texte !

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

  6. 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 ;)

Ecrire un commentaire :

Attention: Les commentaires peuvent être modérés. Ton commentaire peut mettre un peu de temps avant d'être en ligne.




Agence Web Grenoble Django

Articles récents

Nuage de Tags

Articles les plus populaires


Catégories


Articles Aléatoires