Django déploiement Gunicorn Supervisor Nginx WSGI

Contrairement à l'environnement LAMP (Linux Apache MySQL PHP) qui est très facile à installer, l'environnement Python / Django est un peu plus délicat à mettre en oeuvre pour un débutant. Nous avons vu précédemment qu'il est possible de lancer le serveur web de notre projet directement depuis le manager:

python manager.py runserver 80000

Ce serveur web est uniquement destiné aux développeurs, cela leur permet d'avoir un serveur web fonctionnel rapidement sans faire aucune configuration sur leur machine. En aucun cas ce serveur web est destiné à être utilisé sur un serveur de production, c'est à dire où les ressources sont accessibles depuis l'extérieur (internet).

Pour cela il faudra faire un peu de lignes de commmande pour installer et configurer les outils nécessaires à la mise en place d'un serveur web solide, performant et stable.

Projet Django

Dans ce tutoriel nous partons d'un serveur vierge (Ubuntu serveur). En premier lieu créons un dossier à la racine du système:

sudo mkdir /django
sudo chown -R www-data:www-data
sudo chmod -R 775 /django

Puis ajoutons notre compte au groupe www-data:

sudo adduser olivier www-data

Ensuite copions notre projet Django directement dans le dossier /django que nous venons de créer, de manière à avoir l'arboresence suivante:

/django/eboutique
        ├── eboutique
        │   ├── __init__.py
        │   ├── settings.py
        │   ├── test.py
        │   ├── urls.py
        │   ├── wsgi.py
        └── backoffice

Environnement virtuel

Créons ensuite un environnement python virtuel pour pouvoir installer les librairies dont notre projet a besoin.

cd /django/eboutique
virtualenv .

Activons maintenant notre environnement virtuel

source bin/activate

Premier test projet

Maintenant que nous sommes dans notre environnement virtuel, nous pouvons lancer le serveur web de dev depuis le manager pour voir si tout va bien. Généralement il manque toujours une librairie python. Si le serveur de dev se lance correctement nous pouvons passer à la suite. Sinon corrigez les erreurs indiquées.

pip install [librairie]

Installons les librairies python dont notre projet à besoin depuis notre environnement virtuel:

Exemple de librairies:

pip install django
pip install MySQL-python
pip install djangorestframework
pip install django-mptt
pip install Pillow

Gunicorn

Gunicorn pour Green Unicorn est un serveur HTTP Python WSGI pour Unix. Sa particularité est sa puissance, sa rapidité et sa facilité d'installation / configuration.

L'installation se fait en ligne de commande:

sudo aptitude install gunicorn

Et dans notre environnement virtuel:

pip install gunicorn

Et ajoutons gunicorn dans la liste des apps dans settings.py:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    ...
    'gunicorn',
)

Puis exécutons gunicorn depuis le dossier racine de notre projet:

cd /django/eboutique
gunicorn eboutique.wsgi:application --bind votredomaineouadresseip:8000

Si vous n'arrivez pas à voir le rendu, vous pouvez utiliser l'adresse 0.0.0.0 :

gunicorn eboutique.wsgi:application --bind=0.0.0.0:8000

Vous pouvez utiliser l'option suivante:

--debug --log-level debug

Supervisor

Supervisor est un excellent programme qui facilite la vie des développeurs. En effet, créer des daemons en fonction de notre distrib est assez... ennuyeux! Supervisor vous permet de gérer les tâches qui doivent tourner en background avec une facilité déconcertante quelque soit votre distribution linux en quelques paramétrages... un excellent concept pour fainéants! Et évidemment le soft est écrit en python. Bah oui comme par hasard!

Installons ce merveilleux soft:

sudo aptitude install supervisor

Puis créons le fichier /etc/supervisor/conf.d/eboutique.conf et donnons lui le contenu suivant:

[program:eboutique]
command = /home/olivier/venv/bin/gunicorn ab.wsgi:application --name "eboutique" --workers=4 --bind=0.0.0.0:8000 --user="www-data" --group="www-data"   ; Command to start app
user = www-data                                              ; User to run as
stdout_logfile = /var/log/eboutique/gunicorn_supervisor.log   ; Where to write log messages
redirect_stderr = true                                       ; Save stderr in the same log
environment=LANG=fr_FR.UTF-8,LC_ALL=fr_FR.UTF-8              ; Set UTF-8 as default encoding

Exécutons la commande suivante, elle devrait nous retourner l'information eboutique: available

sudo supervisorctl reread

Ensuite ajoutons le script gunicorn.sh -crée auparavant- à supervisor. La commande devrait nous retourner: eboutique: added process group

sudo supervisorctl update

Vérifions que tout fonctionne bien en consultant le statut

sudo supervisorctl status eboutique

Redemarrons supervisor

sudo supervisorctl restart eboutique

A ce stade nous devrions pouvoir accéder tout le temps à notre projet, même après avoir redémarré notre machine.

Nginx

Nginx (que l'on prononce engine-x) est un serveur HTTP open source qui fait aussi bien reverse proxy que serveur POP3 / IMAP. Le projet existe depuis 2002 et à noter que 12% des sites hébergés dans le monde l'utilise. Nginx est surpuissant, stable et simple de configuration. Il excelle dans la distribution de fichiers statiques.

sudo aptitude install nginx

Puis configurons le fichier de configuration /etc/nginx/nginx.conf:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
  worker_connections 1024;
  # multi_accept on;
}

http {

  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;

  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  gzip on;
  gzip_disable "msie6";

  # gzip_vary on;
  # gzip_proxied any;
  # gzip_comp_level 6;
  # gzip_buffers 16 8k;
  # gzip_http_version 1.1;
  # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

  upstream app_servers {
    server 127.0.0.1:8080;
  }

  server {

    listen 80;

    location /static/  {
      alias /django/eboutique/static/;
    }

    location = /favico.ico  {
      root /app/favico.ico;
    }

    location / {
      proxy_pass         http://127.0.0.1:8000;
      proxy_redirect     off;
      proxy_set_header   Host $host;
      proxy_set_header   X-Real-IP $remote_addr;
      proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Host $server_name;
    }
  }
}

Notre projet est enfin disponible depuis le port 80!

Dernière mise à jour le 15 mai 2015