Déploiement d'applications Django : exemple sur serveur Linux/Apache

Nous avons travaillé durant toute cette formation sur le serveur de développement gracieusement fourni par Django : vient le moment de déployer un projet Django en production. Cette page vous montrera une façon de faire, parmi d'autre, en utilisant Apache.

Déployer : qu'est-ce que ça veut dire ?

Déployer une application, la mettre en production, signifie la rendre disponible aux utilisateurs via un serveur accessible depuis Internet ou un autre réseau (pour les applications privées, notamment en entreprise).

Généralement, des outils de versionning, d'intégration continue, etc. sont utilisés dans ce processus : ils dépassent le cadre de ce cours, et ne seront donc pas abordés ici.

Pré-requis pour le déploiement Django

Bien entendu, avant toute chose vous devez disposer d'un serveur connecté, sur lequel vous installerez un serveur logiciel comme Apache : c'est ce serveur que nous utiliserons car il est populaire et robuste. Mais d'autres solutions existent, comme par exemple Gunicorn.

Assurez-vous que Django est installé sur le serveur (sous Debian sudo apt-get install django).

Organisation des fichiers

Bien entendu, il est conseillé de séparer sur votre serveur les sources de votre projet Django et les fichiers statics et medias. Dans l'idéal, utilisez plusieurs serveurs : un pour les applications, un autre pour les assets.

Si vous ne disposez que d'un serveur :

  • Créez quelque part en lieu sûr et non accessible par Apache un dossier django/mon_projet/, dans lequel vous copierez l'ensemble de vos sources.
  • Créez dans un endroit accessible par Apache un répertoire www/django/mon_projet/, qui comportera trois sous répertoires : static, media et apache.

Paramétrage d'Apache

Dans le répertoire de paramétrage d'Apache (généralement /etc/apache2/), ajoutez un nouveau site dans les sites-availables. Pour cela, créez un fichier dans ce répertoire, quez vous nommerez par exemple mon_projet (création d'un virtual host). Placez-y quelque chose comme ceci :

/etc/apache2/sites-availables/mon_projet
<VirtualHost *:80>
    ServerName votre-domaine.fr
    ServerAlias www.votre-domaine.fr
    ServerAdmin webmaster@votre-domaine.fr

    Alias /static/ [chemin vers votre répertoire public]/www/django/mon_projet/static/
    Alias /media/ [chemin vers votre répertoire public]/www/django/mon_projet/media/

    <Directory [chemin vers votre répertoire public]/www/django/mon_projet/static/>
        Options -Indexes FollowSymLinks MultiViews
        Order deny,allow
        Allow from all
    </Directory>

    <Directory [chemin vers votre répertoire public]/www/django/mon_projet/media/>
        Options -Indexes FollowSymLinks MultiViews
        Order deny,allow
        Allow from all
    </Directory>

    WSGIScriptAlias / [chemin vers votre répertoire public]/www/django/mon_projet/apache/django.wsgi

    <Directory [chemin vers votre répertoire public]/www/django/mon_projet/apache>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Ce paramétrage d'Apache a pour effet de rediriger toutes les requêtes entrantes sur notre domaine vers une sorte de « super contrôleur frontal » nommé django.wsgi, qui redirigera à son tour vers le fameux urls.py que l'on a vu précédemment. Voici un exemple de contenu pour ce fichier :

[chemin vers votre répertoire public]/www/django/mon_projet/apache/django.wsgi
import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'mon_projet.settings'

path = '[chemin vers votre répertoire privé]/django/mon_projet'
if path not in sys.path:
    sys.path.append(path)

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Dernières petites choses à régler…

OK, à présent les requêtes sont bien dirigées vers l'application !

Il vous restera à bien paramétrer le fichier settings.py de votre projet pour y mentionner les bons répertoires pour les fichiers statics, medias, etc. Ceci vous permettra ensuite d'exécuter la commande python manage.py collectstatic.

De même, il vous faudra bien évidemment installer et paramétrer votre SGBD (par exemple MySQL), et en décrire les données de connexion dans le fichier settings.py.

Enfin, n'oubliez pas de désactiver le mode debug en production :

settings.py
DEBUG = False

Après désactivation du mode debug, les erreurs qui surviendront éventuellement en production ne présenteront plus aucun détail (dangereux en matière de sécurité), mais vous recevrez ces informations de debug par mail (à l'adresse mail que vous avez configuré dans le fichier settings.py, constante ADMINS).

Désactivation du mode debug de Django en prodcution
Désactivation du mode debug de Django en prodcution

Plus d'infos sur le déploiement sous Django

How to deploy with WSGI

Livres en lien avec ce tutoriel de déploiement Django

Apache (version 2) : Installation, administration et sécurisation

Apache (version 2) : Installation, administration et sécurisation

Voir

Apache 2.0 : Guide de l'administrateur Linux

Apache 2.0 : Guide de l'administrateur Linux

Voir

Apache en action

Apache en action

Voir