Déployer une Application Flask avec Gunicorn et Nginx sur Ubuntu

Déployer Application Flask avec Gunicorn et Nginx Ubuntu Debian

Le déploiement d’une application Flask est une étape cruciale pour rendre votre application web accessible au monde entier. Bien que Flask soit fourni avec un serveur de développement intégré, ce dernier n’est pas adapté pour un environnement de production. Pour une configuration robuste, évolutive et prête pour la production, vous aurez besoin d’une combinaison de Gunicorn, Nginx et Ubuntu. Ce guide vous guidera à travers le processus de déploiement de votre application Flask avec Gunicorn et Nginx sur un serveur Ubuntu.

Déployer des applications Flask sur un serveur peut sembler difficile si vous débutez dans le développement backend, mais ce guide complet détaillera chaque étape. À la fin, vous aurez une application Flask en cours d’exécution sur Ubuntu, servie par Gunicorn et Nginx.

Comprendre la Pile de Déploiement : Flask, Gunicorn et Nginx

Avant de plonger dans le processus de déploiement, il est important de comprendre les outils que nous utiliserons.

Flask : Le Micro Framework Web

Flask est un framework web léger écrit en Python. Il est conçu pour être simple, flexible et facile à utiliser, ce qui en fait un choix populaire pour la création d’applications web. Cependant, le serveur intégré de Flask n’est pas adapté aux environnements de production car il ne peut pas gérer plus d’une requête à la fois.

Gunicorn : Le Serveur HTTP WSGI pour Python

Gunicorn (Green Unicorn) est un serveur HTTP WSGI pour Python qui sert votre application Flask. Il utilise un modèle de processus pré-fork, ce qui signifie qu’il crée plusieurs processus de travail pour gérer plusieurs requêtes simultanément. Cela en fait une solution idéale pour servir des applications Flask en production. Gunicorn se situe entre votre application Flask et le serveur web (Nginx dans ce cas), prenant en charge la gestion des requêtes et la réponse.

Nginx : Le Serveur Web et Proxy Inverse

Nginx est un serveur web performant qui agit également comme un proxy inverse, un équilibreur de charge et un cache HTTP. Dans cette configuration, Nginx se situera devant Gunicorn, gérant les connexions des clients et le contenu statique, puis transmettant les requêtes dynamiques à Gunicorn. Cette séparation des préoccupations améliore la sécurité, les performances et l’évolutivité.

Configurer le Serveur Ubuntu

Configuration Initiale du Serveur

Tout d’abord, vous avez besoin d’un accès à un serveur Ubuntu. Il peut s’agir d’une machine physique, d’une machine virtuelle ou d’une instance cloud de fournisseurs comme AWS, DigitalOcean ou Google Cloud Platform.

  1. Connectez-vous à votre serveur :
$ ssh nom_utilisateur@adresse_ip_serveur
  1. Mettez à jour l’index de vos paquets :
$ sudo apt update
  1. Mettez à jour les paquets installés :
$ sudo apt upgrade

Installation des Paquets Nécessaires

Vous aurez besoin de Python, pip et virtualenv pour exécuter votre application Flask.

  1. Installez Python et pip :
$ sudo apt install python3 python3-pip
  1. Installez virtualenv :
$ sudo pip3 install virtualenv

Préparer Votre Application Flask

Créer une Application Flask

Si vous n’avez pas encore d’application Flask, vous pouvez en créer une simple. Voici un exemple :

  1. Créez un répertoire pour votre projet :
$ mkdir ~/monappflask
$ cd ~/monappflask
  1. Créez un environnement virtuel :
$ virtualenv venv
  1. Activez l’environnement virtuel :
$ source venv/bin/activate
  1. Installez Flask :
$ pip install Flask
  1. Créez une simple application Flask :

Créez un fichier nommé app.py :

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
      return 'Bonjour, Monde !'
if __name__ == '__main__':
      app.run()
  1. Testez votre application :

Exécutez l’application pour vous assurer que tout fonctionne :

$ python app.py

Vous devriez voir une sortie indiquant que le serveur de développement Flask est en cours d’exécution. Visitez http://adresse_ip_serveur:5000 dans votre navigateur, et vous devriez voir “Bonjour, Monde !”.

Structurer l’Application Flask

Dans un environnement de production, il est recommandé de structurer votre application Flask de manière modulaire. Voici un exemple simple de la façon dont vous pourriez structurer votre application :

monappflask/
│
├── app/
│   ├── __init__.py
│   ├── routes.py
│   ├── models.py
│   └── templates/
│
├── venv/
├── config.py
├── requirements.txt
└── wsgi.py

Créer un Point d’Entrée WSGI

Gunicorn a besoin d’un point d’entrée WSGI pour servir votre application Flask. Il s’agit généralement d’un fichier nommé wsgi.py :

  1. Créez le fichier wsgi.py :
from app import app
if __name__ == "__main__":
      app.run()
  1. Installez les dépendances supplémentaires :

Si votre application a des dépendances supplémentaires, listez-les dans un fichier requirements.txt et installez-les :

$ pip freeze > requirements.txt
$ pip install -r requirements.txt

Déployer Flask avec Gunicorn

Installer Gunicorn

Gunicorn est un paquet Python, il peut donc être installé via pip.

  1. Installez Gunicorn :
$ pip install gunicorn

Exécuter Gunicorn

Pour tester que Gunicorn peut servir votre application, exécutez la commande suivante :

$ gunicorn --bind 0.0.0.0:8000 wsgi:app

Cette commande indique à Gunicorn de servir votre application Flask en utilisant le fichier wsgi.py, en se liant au port 8000. Vous devriez pouvoir accéder à votre application à http://adresse_ip_serveur:8000.

Configurer Gunicorn pour la Production

Pour la production, vous voudrez généralement exécuter Gunicorn avec plusieurs processus de travail pour gérer plusieurs requêtes simultanément.

  1. Créez un fichier de service systemd pour Gunicorn :

Cela vous permettra de gérer Gunicorn avec systemd, le système d’init utilisé par Ubuntu.

$ sudo nano /etc/systemd/system/gunicorn.service

Ajoutez le contenu suivant :

[Unit]
Description=Instance Gunicorn pour servir monappflask
After=network.target
[Service]
User=nom_utilisateur
Group=www-data
WorkingDirectory=/home/nom_utilisateur/monappflask
Environment="PATH=/home/nom_utilisateur/monappflask/venv/bin"
ExecStart=/home/nom_utilisateur/monappflask/venv/bin/gunicorn --workers 3 --bind unix:monappflask.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target

Remplacez nom_utilisateur par votre nom d’utilisateur réel.

  1. Démarrez et activez le service Gunicorn :
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
  1. Vérifiez l’état du service Gunicorn :
$ sudo systemctl status gunicorn

Si tout est configuré correctement, Gunicorn devrait être en cours d’exécution et servir votre application Flask.

Configurer Nginx

Installer Nginx

Si vous n’avez pas Nginx installé, vous pouvez l’installer en utilisant la commande suivante :

$ sudo apt install nginx

Configurer Nginx comme Proxy Inverse

Nginx agira comme un proxy inverse, en transmettant les requêtes à Gun

icorn et en servant les fichiers statiques directement.

  1. Créez un nouveau bloc serveur :
$ sudo nano /etc/nginx/sites-available/monappflask

Ajoutez le contenu suivant :

server {
      listen 80;
      server_name votre_domaine_ou_IP;
      location / {
         include proxy_params;
         proxy_pass http://unix:/home/nom_utilisateur/monappflask/monappflask.sock;
      }
      location /static/ {
         alias /home/nom_utilisateur/monappflask/app/static/;
      }
      error_log /home/nom_utilisateur/monappflask/error.log;
      access_log /home/nom_utilisateur/monappflask/access.log;
}

Remplacez nom_utilisateur par votre nom d’utilisateur réel et votre_domaine_ou_IP par l’adresse IP ou le nom de domaine de votre serveur.

  1. Activez le nouveau bloc serveur :
$ sudo ln -s /etc/nginx/sites-available/monappflask /etc/nginx/sites-enabled
  1. Testez la configuration de Nginx :
$ sudo nginx -t

Si le test est réussi, vous devriez voir un message indiquant que la configuration est correcte.

  1. Redémarrez Nginx pour appliquer les modifications :
$ sudo systemctl restart nginx

Autoriser Nginx à Travers le Pare-feu

Si vous utilisez UFW (Uncomplicated Firewall), vous devez autoriser Nginx à travers le pare-feu.

$ sudo ufw allow 'Nginx Full'

Sécuriser l’Application avec SSL

Pour sécuriser votre application, vous pouvez configurer SSL en utilisant Let’s Encrypt.

Installer Certbot

Certbot est un outil pour automatiser le processus d’obtention et de renouvellement des certificats SSL.

  1. Installez Certbot et le plugin Nginx :
$ sudo apt install certbot python3-certbot-nginx
  1. Obtenez un certificat SSL :

Exécutez la commande suivante, en remplaçant votre_domaine_ou_IP par votre domaine ou adresse IP :

$ sudo certbot --nginx -d votre_domaine_ou_IP
  1. Vérifiez le renouvellement du certificat SSL :

Certbot renouvellera automatiquement vos certificats SSL. Vous pouvez simuler un renouvellement pour vérifier si cela fonctionne :

$ sudo certbot renew --dry-run

Surveiller et Consigner

Logs de Gunicorn

Gunicorn consigne sa sortie dans le journal systemd. Pour voir les logs :

$ sudo journalctl -u gunicorn

Logs de Nginx

Nginx consigne les requêtes et les erreurs dans les fichiers journaux situés dans /var/log/nginx/. Vous pouvez les consulter avec :

$ sudo tail -f /var/log/nginx/access.log
$ sudo tail -f /var/log/nginx/error.log

Dépannage des Problèmes Courants

Gunicorn Échoue à Démarrer

  • Vérifiez l’état du service Gunicorn :
$ sudo systemctl status gunicorn

Recherchez tout message d’erreur dans la sortie.

  • Vérifiez les logs de Gunicorn :
$ sudo journalctl -u gunicorn

Nginx Échoue à Démarrer ou à Recharger

  • Testez la configuration de Nginx :
$ sudo nginx -t

Cette commande mettra en évidence toute erreur de syntaxe dans vos fichiers de configuration.

  • Vérifiez les logs de Nginx :
$ sudo tail -f /var/log/nginx/error.log

Automatiser le Déploiement avec une Pipeline CI/CD

Pour les grandes applications ou les applications fréquemment mises à jour, vous pourriez envisager d’automatiser le processus de déploiement en utilisant une pipeline d’intégration continue/livraison continue (CI/CD). Cela implique de configurer un service tel que Jenkins, GitLab CI ou GitHub Actions pour déployer automatiquement votre application Flask à chaque fois que vous poussez des modifications vers un dépôt.

Mettre en Place une Pipeline CI/CD Basique

  1. Choisissez un outil CI/CD : Jenkins, GitLab CI, GitHub Actions, CircleCI, etc.
  2. Configurez votre pipeline : Définissez vos étapes de build, test et déploiement.
  3. Intégrez avec votre système de contrôle de version : Déclenchez automatiquement les déploiements lorsque des modifications sont poussées vers votre dépôt.

Déployer avec les Hooks Git

Si vous préférez une approche plus simple, vous pouvez utiliser les hooks Git pour déclencher des scripts de déploiement chaque fois que vous poussez des modifications vers votre serveur.

  1. Créez un hook post-receive sur votre serveur :
$ mkdir -p ~/monappflask.git/hooks
$ nano ~/monappflask.git/hooks/post-receive

Ajoutez le contenu suivant :

#!/bin/bash
git --work-tree=/home/nom_utilisateur/monappflask --git-dir=/home/nom_utilisateur/monappflask.git checkout -f
source /home/nom_utilisateur/monappflask/venv/bin/activate
pip install -r /home/nom_utilisateur/monappflask/requirements.txt
sudo systemctl restart gunicorn

Rendez le hook exécutable :

$ chmod +x ~/monappflask.git/hooks/post-receive
  1. Poussez les mises à jour vers votre serveur :

Depuis votre machine locale, ajoutez le dépôt distant :

$ git remote add production ssh://nom_utilisateur@adresse_ip_serveur/home/nom_utilisateur/monappflask.git

Poussez les modifications vers le serveur de production :

$ git push production master

FAQs

Quel est le rôle de Gunicorn dans le déploiement de Flask ?

Gunicorn sert de serveur HTTP WSGI qui gère les requêtes entrantes vers votre application Flask. Il crée plusieurs processus de travail pour gérer ces requêtes simultanément, ce qui en fait un composant essentiel dans un environnement de production.

Pourquoi utilise-t-on Nginx comme proxy inverse ?

Nginx est utilisé comme proxy inverse pour gérer les connexions des clients, gérer les fichiers statiques, et transmettre les requêtes dynamiques à Gunicorn. Cela améliore la sécurité, les performances et l’évolutivité de votre application.

Comment puis-je m’assurer que mon application Flask est sécurisée ?

Sécuriser votre application Flask implique d’utiliser des certificats SSL/TLS, de forcer l’utilisation de HTTPS, de définir des permissions appropriées, et de mettre à jour régulièrement votre serveur et les dépendances de votre application.

Puis-je utiliser d’autres serveurs web à la place de Nginx ?

Oui, vous pouvez utiliser d’autres serveurs web comme Apache. Cependant, Nginx est préféré pour ses performances, sa simplicité, et sa facilité d’utilisation en tant que proxy inverse.

Que dois-je faire si mon application plante après le déploiement ?

Vérifiez les logs de Gunicorn et Nginx pour identifier la cause du plantage. Assurez-vous que votre application est correctement configurée et que toutes les dépendances sont installées. Vérifiez également s’il n’y a pas d’erreurs de syntaxe dans vos fichiers de configuration.

Comment puis-je faire évoluer mon application Flask ?

Vous pouvez faire évoluer votre application Flask en augmentant le nombre de travailleurs Gunicorn, en équilibrant la charge sur plusieurs serveurs, et en optimisant votre code et vos requêtes de base de données.

Conclusion

Le déploiement d’une application Flask avec Gunicorn et Nginx sur Ubuntu est un moyen puissant de s’assurer que votre application est robuste, évolutive et sécurisée. En suivant les étapes décrites dans ce guide, vous pouvez déployer votre application Flask en toute confiance dans un environnement de production. De la configuration de votre serveur à la sécurisation de votre site avec SSL en passant par le dépannage des problèmes courants, ce tutoriel vous fournit tout ce dont vous avez besoin pour réussir.

Laisser un commentaire