Jouskaio.me

La valeur d'une idée réside dans son utilisation

Déployer une API Flask avec Gunicorn et Apache

Déployer une API Flask est une tâche courante pour les développeurs qui visent à donner vie à leurs applications web. Bien que Flask soit en soi un micro-framework web puissant, son déploiement efficace nécessite une configuration fiable et évolutive. Cet article vous guidera à travers le processus de déploiement d'une API Flask à l'aide de Gunicorn et d'Apache2. En tirant parti de Gunicorn, un serveur HTTP WSGI Python pour UNIX, et du serveur web robuste Apache2, vous pouvez garantir que votre API Flask fonctionne bien sous de lourdes charges et reste sécurisée. Plongeons dans les étapes pour mettre votre application Flask en service dans un environnement de production.

Installation

Tout d'abord, veuillez installer votre application quelque part sur votre serveur. Pour une bonne pratique, il est recommandé d'utiliser le chemin suivant : /var/www/html/you_project

Dans ce dossier, vérifiez si vous avez un dossier .venv, qui est l'environnement virtuel pour exécuter Python localement. Si vous n'avez pas cet environnement, veuillez le créer en exécutant cette commande : python3 -m venv .venv. Accédez ensuite à cet environnement virtuel avec source .venv/bin/activate, puis n'oubliez pas de pip install tous vos packages dans vos projets.

Assurez-vous d'installer ces packages :

  • gunicorn
  • Flask

Une fois terminé, veuillez exécuter la commande pour déployer l'API Flask avec gunicorn gunicorn -b 0.0.0.0:5000 main:app. Cela devrait vous retourner quelque chose comme ceci :

(.venv) ubuntu@ip-10-0-3-23:~/_Projets/API_Hub/API-Webhook gunicorn -b 0.0.0.0:5002 main:app
[2024-05-22 11:44:31 +0200] [7898] [INFO] Starting gunicorn 21.2.0
[2024-05-22 11:44:31 +0200] [7898] [INFO] Listening at: http://0.0.0.0:5002 (7898)
[2024-05-22 11:44:31 +0200] [7898] [INFO] Using worker: sync
[2024-05-22 11:44:31 +0200] [7901] [INFO] Booting worker with pid: 7901
[2024-05-22 11:44:45 +0200] [7898] [INFO] Handling signal: int
[2024-05-22 11:44:45 +0200] [7901] [INFO] Worker exiting (pid: 7901)
[2024-05-22 11:44:45 +0200] [7898] [INFO] Shutting down: Master

-b 0.0.0.0:5000 spécifie que l'application s'exécutera sur 0.0.0.0 sur le port 5000. Bien sûr, vous pouvez changer 5000 pour un autre port.

main:app implique que vous exécuterez vos fichiers main.py à partir des fichiers gunicorn app.wsgi.

Pour voir à quoi devrait ressembler app.wsgi, voir ci-dessous

#app.wsgi
import sys
sys.path.insert(0,'/home/ubuntu/_Projets/API_Hub/API-Webhook/') # Load your project

from main import app as application # Execute your Flask app named "app"

Si cela fonctionne, alors vous êtes prêt à déployer votre application.

Création d'un service

Tout d'abord, nous allons nous assurer que notre API Flask fonctionnera à tout moment en arrière-plan (donc sans bloquer notre serveur en étant utilisée sur le thread principal).

Pour cela, nous allons créer un nouveau service

# webhooks-apihub.service
[Unit]
Description=Gunicorn instance to serve flask API
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/_Projets/API_Hub/API-Webhook/
ExecStart=/home/ubuntu/_Projets/API_Hub/API-Webhook/.venv/bin/gunicorn -b 0.0.0.0:5000 main:app
Restart=always

[Install]
WantedBy=multi-user.target

Dans cette commande, nous pouvons voir que nous exécutons le package gunicorn dans notre environnement virtuel précédemment créé avec /home/ubuntu/_Projets/API_Hub/API-WebhookEfento/.venv/bin/gunicorn gunicorn

Une fois que tout est fait, nous allons activer ce service et le démarrer

# Reload all units
sudo systemctl daemon-reload
# Activate the service
sudo systemctl enable webhooks-apihub.service
# Start the service
sudo systemctl start webhooks-apihub.service
# Check the status
sudo systemctl status webhooks-apihub.service

Apache

Maintenant que notre application est déployée, nous allons la gérer pour qu'elle soit accessible de l'extérieur avec Apache2.

Pour cela, créez un nouveau fichier .conf dans /etc/apache2/sites-available/.

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAdmin you@mail.com
    DocumentRoot /home/ubuntu/_Projets/API_Hub/API-Webhook/

    ErrorLog ${APACHE_LOG_DIR}/apihub-api.log
    CustomLog ${APACHE_LOG_DIR}/apihub.log combined

    ProxyPass               / http://0.0.0.0:5000/
    ProxyPassReverse        / http://0.0.0.0:5000/
    ProxyRequests           Off

    <Directory /home/ubuntu/_Projets/API_Hub/API-Webhook>
        WSGIProcessGroup app
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Require all granted
    </Directory>
</VirtualHost>

Cela créera un lien HTTP (http://www.domain.com). Si vous souhaitez créer un lien HTTPS, assurez-vous d'utiliser <VirtualHost *:443>, qui est le port utilisé pour les connexions HTTP sécurisées, et ajoutez votre certificat et vos clés comme ceci ou utilisez certbot

<VirtualHost *:443>
        ServerName www.domain.com
        ServerAdmin you@mail.com
        DocumentRoot /home/ubuntu/_Projets/API_Hub/API-Webhook/

        ErrorLog ${APACHE_LOG_DIR}/apihub-api.log
        CustomLog ${APACHE_LOG_DIR}/apihub.log combined

        ProxyPass               / http://0.0.0.0:5000/
        ProxyPassReverse        / http://0.0.0.0:5000/
        ProxyRequests           Off

        SSLEngine On
        SSLCertificateFile your/path/fullchain.crt
        SSLCertificateKeyFile /your/path/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

Une fois terminé, aimez notre service, nous activerons notre site puis le déploierons.

# Check the syntaxe of each conf file
sudo apachectl -t
# Enable the conf
sudo a2ensite webhooks-apihub.service.conf
# Restart apache2 to take in consideration changes without stopping the service
sudo systemctl reload apache2
# Check the status
sudo systemctl reload apache2

Maintenant, si le statut est correct, vous devriez voir quelque chose sur www.domain.com… félicitations, vous avez réussi à déployer votre première application Flask ! À l'avenir, si vous souhaitez ajouter une nouvelle API Flask, assurez-vous d'utiliser un port Gunicorn différent de 5000.

Newsletter

Restez informé ! ✨
 
Abonnez-vous à ma newsletter pour recevoir mes dernières mises à jour, mes nouveaux articles et mes réflexions sur la technologie, les projets et ce que je construis.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués d'un *

×