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 :
gunicornFlask
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.


Laisser un commentaire