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.
$ pip install uwsgi

# Or install LTS (long term support).
$ pip install https://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
    --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 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

Résolution des erreurs UnicodeEncodeError pour les envois de fichiers

Si vous obtenez des erreurs UnicodeEncodeError lors de l’envoi de fichiers contenant des caractères non ASCII dans leur nom, vérifiez que uWSGI est configuré pour accepter les noms de fichiers non ASCII en ajoutant ceci dans uwsgi.ini:

env = LANG=en_US.UTF-8

Consultez la section Fichiers du guide de référence Unicode pour plus de détails.

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.

Back to Top