Déploiement de Django avec uWSGI

uWSGI est un serveur conteneur d’applications rapide, auto-réparateur et convivial à la fois pour les développeurs et les administrateurs ; il est codé en C pur.

Voir aussi

La documentation de uWSGI fournit un tutoriel abordant Django, nginx et uWSGI (une possibilité de déploiement parmi plusieurs). La documentation ci-dessous se concentre sur la façon d’intégrer Django avec uWSGI.

Prérequis : uWSGI

Le wiki d’uWSGI décrit plusieurs procédures d’installation. En utilisant pip, le gestionnaire de paquets Python, vous pouvez installer n’importe quelle version d’uWSGI à l’aide d’une seule commande. Par exemple :

# Install current stable version.
$ sudo pip install uwsgi

# Or install LTS (long term support).
$ sudo pip install http://projects.unbit.it/downloads/uwsgi-lts.tar.gz

Avertissement

Certaines distributions, y compris Debian et Ubuntu, fournissent une version ancienne de uWSGI qui ne se conforme pas à la spécification WSGI. Les versions plus anciennes que 1.2.6 n’appellent pas close sur l’objet réponse après avoir traité une requête. Dans ces cas, le signal request_finished n’est pas envoyé. Par conséquent, il se peut que des connexions de base de données et de serveurs memcache puissent être laissées ouvertes.

Le modèle uWSGI

uWSGI opère sur un modèle client-serveur. Votre serveur Web (par ex. nginx ou Apache) communique avec un processus de travail django-uwsgi pour servir le contenu dynamique. Consultez la documentation du moteur uWSGI pour plus de détails.

Configuration et démarrage du serveur uWSGI pour Django

uWSGI accepte plusieurs façons de configurer le processus. Voir la documentation de configuration et les exemples fournis par uWSGI.

Voici un exemple de commande pour lancer un serveur uWSGI :

uwsgi --chdir=/path/to/your/project \
    --module=mysite.wsgi:application \
    --env DJANGO_SETTINGS_MODULE=mysite.settings \
    --master --pidfile=/tmp/project-master.pid \
    --socket=127.0.0.1:49152 \      # can also be a file
    --processes=5 \                 # number of worker processes
    --uid=1000 --gid=2000 \         # if root, uwsgi can drop privileges
    --harakiri=20 \                 # respawn processes taking more than 20 seconds
    --limit-as=128 \                # limit the project to 128 MB
    --max-requests=5000 \           # respawn processes after serving 5000 requests
    --vacuum \                      # clear environment on exit
    --home=/path/to/virtual/env \   # optional path to a virtualenv
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process

Cet exemple part du principe qu’un paquet de projet de premier niveau est nommé mysite, dans lequel se trouve un module mysite/wsgi.py contenant un objet WSGI application. C’est la disposition obtenue en lançant la commande django-admin.py startproject mysite (en remplaçant mysite par votre propre nom de projet) avec toute version récente de Django. Si ce fichier n’existe pas, vous devrez le créer. Consultez la documentation de Comment déployer avec WSGI pour connaître le contenu par défaut à placer dans ce fichier et ce que vous pouvez aussi y ajouter en plus.

Les options spécifiques à Django sont :

  • chdir: le chemin vers le répertoire qui doit se trouver dans le chemin d’importation Python, par exemple le répertoire contenant le paquet mysite.

  • module: le module WSGI à utiliser, probablement le module mysite.wsgi créé par la commande startproject.

  • env: doit probablement contenir au moins

  • home: chemin facultatif vers le virtualenv de votre projet.

Exemple de fichier de configuration .ini :

[uwsgi]
chdir=/path/to/your/project
module=mysite.wsgi:application
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/yourproject.log

Exemple d’utilisation de fichier de configuration .ini :

uwsgi --ini uwsgi.ini

Consultez la documentation de uWSGI sur la gestion du processus uWSGI pour des informations sur le démarrage, l’arrêt et le rechargement des processus de travail uWSGI.