Django, Gunicorn et nginx

Dans ce post l'idée est de configurer l'appli minimale de django (celle qui affiche: « The install worked successfully! Congratulations! »), et la passer en production via gunicorn et nginx

Dans l'espace utilisateur, par exemple /home/web on va créer un environnement virtuel python. Sur Debian stretch c'est la version 3.5 qui est la version de python 3 du système.

Pour utiliser les virtualenv avec le python 3 du système il est nécessaire d'installer (en root) le paquet «python3-venv»


apt-get install python3-venv

Toujours en root on installe supervisor, un programme python qui permet «daemoniser» d'autres programmes


apt-get install supervisor

Puis :


python3 -m venv env-minitest
. env-minitest/bin/activate
pip install django gunicorn
django-admin createproject minitest

Arrivé à ce point il y a normalement un environnement virtuel python 3.5 dans le répertoire env-minitest et un projet django dans le répertoire minitest.

On va éditer le fichier settings.py qui se trouve sous /home/web/minitest/minitest/settings.py.


ALLOWED_HOSTS = ["exemple.com"]

En root il va falloir créer le fichier de configuration nginx pour notre appli django en reverse proxy. Ça veut dire qu'on va faire tourner l'appli django sur un port (ici le 8000) et qu'on va demander à nginx de servir les pages générées par django sur le port 80 et de s’occuper directement des fichiers statiques.
Créons le fichier /etc/nginx/sites-enabled/minitest.conf


server
{
        listen 80;
        #domaine à remplacer :
        server_name     exemple.com;
      

        access_log      /var/log/nginx/minitest_access.log;
        error_log       /var/log/nginx/minitest_error.log;

        gzip  on;
        gzip_http_version 1.1;
        gzip_vary on;
        gzip_comp_level 6;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
        gzip_buffers 16 8k;
        gzip_disable "MSIE [1-6]\.(?!.*SV1)";

        location /media
        {
                root /home/web/www/minitest/;
        }
        location /static
        {
                root /home/web/www/minitest/;
        }

        location /
        {
                proxy_pass_header Server;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Host $http_host;
                proxy_redirect off;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Scheme $scheme;
		proxy_set_header X-Forwarded-Proto $scheme;
                proxy_connect_timeout 10;
                proxy_read_timeout 10;
                proxy_pass http://localhost:8000/;
        }

}


On va maintenant créer un fichier de config pour supervisor afin de «daemoniser» l'appli django :


[program:minitest]
command = /home/web/env-minitest/bin/gunicorn -b 127.0.0.1:8000 minitest.wsgi:application 
directory = /home/web/minitest
autostart = true
autorestart = true
redirect_stderr = true
user = web

Bon à ce stade on relance nginx et supervisor.


systemctl reload supervisor
systemctl reload nginx

Rendez-vous sur la page de exemple.com via votre navigateur, normalement vous avez «The install worked successfully! » affiché à l'écran. Vous remarquerez que vous avez mis en production une apppli Django avec le settings DEBUG à True ce qui est très mal !