Mise en production d'un site Django
En utilisant Nginx et Gunicorn

Le , par Jiyuu, Rédacteur/Modérateur
### toujours en mode ébauche... n'hésitez pas à me faire toutes les remarques utiles nécessaires.

Bonjour à tous,

Pré-requis (à par connaitre Python & Django) :
  • connaitre SSH ;
  • être habitué aux OS basés sur linux ;
  • avoir un serveur permettant d'utiliser Python, Django et SSH ;
  • si possible avoir un serveur de production aussi à jour que le poste servant de serveur de développement.


Après la création de votre site web avec Django, vous allez rapidement avoir besoin de mettre en production celui-ci. Pour rappel, IL NE FAUT SURTOUT PAS utiliser le serveur de développement fourni avec Django pour travailler en production. Il existe sur le marché plusieurs hébergeurs permettant de faire ceci, mais nous allons étudier ici la manière de faire sans passer par ces hébergeurs. Nous allons donc créer notre propre serveur de production.

Dans ce billet nous allons découvrir le paramétrage le plus simple pour faire fonctionner un site Django sur un serveur privé. Plusieurs fournisseurs offrent ce type de service. La seule chose que je conseille c'est de veiller à avoir un serveur de production aussi à jour que notre serveur de développement. Pour ma part je suis parti sur un serveur Archlinux.

Passons aux choses sérieuses

Nous allons utiliser Gunicorn et Nginx. Je vous invite donc à les installer si ce n'est pas déjà fait. Évidemment il est possible d'utiliser d'autres outils comme mod_wsgi et Apache. À l'heure actuelle, l'objet de ce billet n'est pas d'expliquer en profondeur l'utilité de l'un ou l'autre. Si besoin je vous invite à feuilleter les tutoriels disponibles sur
Une fois l'installation faite vous pouvez vérifier que Nginx fonctionne correctement en vous rendant sur l'adresse localhost depuis votre navigateur web.

Note : Gunicorn est l'outil (serveur) qui nous permettra de mettre en production notre site Django. Malheureusement celui-ci ne sait pas gérer les fichiers statiques, comprenez par là vos images, *.css, *.js, ... Pour cela il nous allons utiliser Nginx.


Ok, mais comment j'utilise tout ça ?
Théoriquement Nginx est livré avec une configuration de base assez simple, que vous trouverez dans le fichier /etc/nginx/nginx.conf (chemin à adapter éventuellement selon votre OS). C'est elle qui permet l'affichage de localhost. La première chose à faire est d'ajouter, le cas échéant, à la fin de nginx.conf la ligne suivante :
Code : Sélectionner tout
include /etc/nginx/sites-enabled/*;
Par la suite, l'idée est de créer des sous-configurations et de les activer au besoin. Pour cela, la méthode habituellement utilisé est de créer les deux dossiers sites-available et sites-enabled directement dans /etc/nginx. On va donc demander au fichier de configuration d'inclure aussi ce qui se trouve dans sites-enabled.
Donc si vous avez bien suivi :
  • sites-available : sites créés & disponibles
  • sites-enabled : sites en fonction.

La première étape est de configurer correctement votre projet afin de servir les fichiers statiques. Pour cela, je vous invite à vous référer à la documentation officielle qui explique bien les différents nuances des paramètres présents dans votre settings.py.

Une fois settings.py correctement configuré, il faut passer à la configuration de Nginx. Pour rappel, le but ici n'est pas de s'étendre sur cet outil, mais de proposer une solution simple pour installer notre site web. En ayant enlevé toutes les lignes commentées et en allant au plus simple, dans mon cas, nginx.conf correspond à ceci :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
user root;   #pour dire qui a le droit d'utiliser le script
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*; #pour inclure mes fichiers de configuration propres à chacun de mes sites.
}
Dans un second temps, nous allons créer un fichier de configuration propre à notre site (le nom importe peu) dans sites-available. Voici un exemple basique :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
    listen 80;
    server_name monsupersite.fr *.monsupersite.fr; #mettez ici tous les liens devant pointer vers votre site

location / {
               proxy_pass http://127.0.0.1:8000/;
               proxy_read_timeout 300;
               proxy_redirect off;
               proxy_buffering off;
               proxy_store off;
               proxy_set_header Host $host;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
 
     location /static/ {
                alias /home/monuser/www/staticFiles/; #le dossier /home/monuser/www correspond au dossier dans lequel vous aurez mis votre projet, c'est à dire tout ce qui se trouve au même niveau que manage.py
           }
}
N'oubliez pas de créer un lien symbolique de ce ficher vers sites-enabled afin de le rendre actif.

Une fois ceci fait, rendez-vous au même niveau que manage.py et lancez les commandes suivantes (à adapter selon votre projet et votre OS) :
Code : Sélectionner tout
1
2
sudo /etc/init.d/nginx restart
gunicorn jiyuu.wsgi:application --bind=127.0.0.1:8000 --daemon
jiyuu.wsgi:application : voir settings.py pour adapter cet argument.

Note : on voit ici que l'on demande à gunicorn de lancer le serveur sur le port 127.0.0.1:8000, ce qui correspond à notre configuration dans le fichier sites-available. Vous aurez compris qu'il est ainsi possible de mettre en place plusieurs site web sur le même VPS.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :
Contacter le responsable de la rubrique Python