Aller au contenu principal

Gunicorn — Serveur Python WSGI

Gunicorn (Green Unicorn) est un serveur d'applications Python implémentant l'interface WSGI (Web Server Gateway Interface), utilisé pour exécuter des applications Django, Flask, etc. en production. Comme php-fpm pour PHP, il se place derrière un reverse proxy (nginx) qui gère TLS et le trafic statique.

Installation

pip install gunicorn

Généralement installé dans un environnement virtuel (venv) dédié à l'application, pas au niveau système.

Fichiers de configuration

FichierRôle
/etc/systemd/system/gunicorn.serviceUnit systemd lançant Gunicorn
/opt/monapp/gunicorn.conf.pyFichier de configuration Gunicorn (workers, bind, timeouts...)
/etc/systemd/system/gunicorn.socket(optionnel) socket systemd activé à la demande

Commandes utiles

CommandeFonction
gunicorn --check-config app:appVérifier la config sans démarrer
systemctl start/restart/status gunicornGestion du service
journalctl -u gunicorn -fLogs en direct

Exemple de configuration

Unit systemd avec socket Unix (/etc/systemd/system/gunicorn.service) :

[Unit]
Description=Gunicorn pour monapp
After=network.target

[Service]
User=monapp
Group=www-data
WorkingDirectory=/opt/monapp
ExecStart=/opt/monapp/venv/bin/gunicorn \
--workers 4 \
--bind unix:/run/gunicorn/monapp.sock \
monapp.wsgi:application
Restart=always

[Install]
WantedBy=multi-user.target

Le nombre de workers recommandé est (2 × nombre de cœurs) + 1.

Sécurisation

  • Utilisateur système dédié, non privilégié.
  • Socket Unix plutôt que TCP exposé, avec permissions restreintes au groupe du serveur web.
  • --timeout adapté pour éviter qu'une requête lente ne bloque un worker indéfiniment (protection basique contre certains DoS applicatifs).
  • Ne jamais lancer en mode --reload (rechargement à chaud) en production — réservé au développement.
  • Placer systématiquement un reverse proxy devant pour gérer TLS, les en-têtes de sécurité et le trafic statique.

Logs & dépannage

  • journalctl -u gunicorn -f pour les logs d'accès/erreurs si non redirigés ailleurs.
  • --access-logfile et --error-logfile pour rediriger vers des fichiers dédiés si besoin.
  • Erreur 502 côté Nginx = Gunicorn arrêté, socket mal référencé, ou worker crashé (timeout applicatif).
  • systemctl status gunicorn pour voir le nombre de workers actifs et les éventuels redémarrages en boucle.

Voir aussi

  • uwsgi — alternative concurrente à Gunicorn pour servir des applications WSGI Python
  • nginx — reverse proxy typique devant Gunicorn