Ce didacticiel explique comment exécuter des applications Flask à l’aide du serveur Web NGINX. Flask est un microframework pour Python qui vous permet de créer des applications Web sur votre Raspberry Pi. Il comprend son propre serveur Web, mais les développeurs ont recommandé de l’exécuter sous un serveur Web plus établi tel que NGINX ou Apache. Cela rend l’application Flask plus robuste car elle peut gérer plus de trafic entrant.
Je suggère fortement de parcourir ce didacticiel sur une nouvelle image SD en utilisant les exemples fournis. Une fois que cela fonctionne, vous pouvez envisager d’utiliser la technique pour mettre à niveau vos propres applications Flask. Vous devrez faire attention aux noms de répertoire et de fichier ainsi qu’aux références à ces emplacements dans les différents fichiers de configuration.
Étape 1 : Créez une nouvelle carte SD
Pour commencer, créez une nouvelle carte SD à l’aide d’une image Raspbian officielle. J’ai utilisé Etcher et l’image Raspbian Lite car je n’avais pas besoin de l’interface graphique. Lorsque la carte était prête, j’ai ajouté un fichier wpa_supplicant.conf pré-préparé et un fichier ssh vierge à la partition de démarrage. Cela a permis à mon Pi Zero de se connecter à mon WiFi avec SSH activé sans que j’aie besoin d’attacher quoi que ce soit au Pi autre que l’alimentation.
Pour référence, vous pouvez consulter les guides suivants :
Étape 2 : Allumer et mettre à jour Pi
Insérez la carte SD dans le Pi et allumez-le. Utilisez un clavier et un moniteur connecté ou connectez-vous à partir d’une autre machine via SSH.
Si vous n’avez pas encore modifié le mot de passe par défaut.
Mettre à jour la liste des packages en utilisant :
sudo apt-get update
Vous devriez maintenant avoir un Pi opérationnel et être prêt à installer le logiciel requis.
Étape 3 : Installez le logiciel requis
Installez NGINX, pip3 et uWSGI à l’aide des commandes suivantes :
sudo apt-get install nginx sudo apt-get install python3-pip sudo pip3 install flask uwsgi
Vous devrez peut-être appuyer sur Y aux invites Y/N pendant le processus d’installation.
Étape 4 : Créer une application Flask
Assurez-vous que vous êtes dans le répertoire /home/pi en utilisant :
cd ~
Créez un exemple d’application Flask en créant d’abord un dossier appelé « flasktest » :
mkdir flasktest
et en définissant son propriétaire de groupe sur « www-data » :
sudo chown www-data /home/pi/flasktest
Naviguez dans le répertoire :
cd flasktest
Ensuite, téléchargez directement mon exemple d’application Flask au Pi en utilisant :
sudo wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/flask/testSite1.py
Notez que cette application de test porte le nom de fichier « testSite1.py ».
Étape 5 : Tester l’URL NGINX
Découvrez l’adresse IP de votre Pi en utilisant :
ifconfig
J’utiliserai l’exemple « 192.168.1.99 » mais vous devez utiliser l’adresse IP affichée par votre Pi sous ifconfig (soit contre eth0 pour les connexions filaires, soit wlan0 pour les connexions sans fil).
Sur votre PC (ou autre appareil équipé d’un navigateur), visitez l’adresse IP de votre Pi :
http://192.168.1.99
Cela devrait afficher la page d’accueil par défaut de NGINX :

Testez maintenant que uwsgi fonctionne correctement en utilisant :
uwsgi --socket 0.0.0.0:8000 --protocol=http -w testSite1:app
Cela devrait vous permettre de visiter la même adresse IP qu’avant mais sur le port 8000 :
http://192.168.1.99:8000
Cela devrait afficher la page par défaut de l’application Flask :
Site de test fonctionnant sous Flask
De retour dans votre terminal, vous pouvez revenir à l’invite de commande en utilisant CTRL-C. L’URL principale vous montrera toujours la page par défaut de NGINX, mais comme uwsgi ne s’exécute pas maintenant, l’application Flask ne sera plus disponible sur le port 8000.
Étape 6 : Créer un fichier d’initialisation uWSGI
Pour fournir des paramètres supplémentaires à uWSGI, créez maintenant un fichier d’initialisation :
sudo nano uwsgi.ini
Démarrez le fichier avec :
[uwsgi]
puis ajoutez ce qui suit en dessous :
chdir = /home/pi/flasktest module = testSite1:app master = true processes = 1 threads = 2 uid = www-data gid = www-data socket = /tmp/flasktest.sock chmod-socket = 664 vacuum = true die-on-term = true
Notez qu’il contient des références au répertoire du projet (/home/pi/flasktest) et au fichier python Flask « testSite1.py ». Le fichier « flasktest.sock » n’existe pas pour le moment mais sera créé automatiquement lorsque uWSGI en aura besoin.
Utilisez CTRL-X, Y et ENTER pour enregistrer et quitter l’éditeur nano.
Étape 7 : Testez le fichier d’initialisation uWSGI
Exécutez la commande suivante pour lancer uwsgi avec notre fichier d’initialisation :
uwsgi --ini uwsgi.ini
Puis à l’aide d’une seconde connexion SSH vérifiez que le fichier socket a bien été créé dans le répertoire tmp en utilisant :
ls /tmp
Vous devriez voir « flasktest.sock » répertorié sous forme de fichier. Ce fichier n’existe que pendant l’exécution d’uWSGI.
À ce stade, uWSGI n’utilise pas de numéro de port standard, donc seule la page NGINX sera disponible dans votre navigateur.
Arrêtez uWSGI en cours d’exécution en utilisant CTRL-C.
Étape 8 : Configurer NGINX pour utiliser uWSGI
NGINX peut maintenant être configuré pour transmettre le trafic à uWGI. C’est ce qu’on appelle un « proxy inverse ».
Supprimer le site par défaut :
sudo rm /etc/nginx/sites-enabled/default
Créez maintenant un fichier de configuration appelé « flasktest_proxy » :
sudo nano /etc/nginx/sites-available/flasktest_proxy
Insérez ceci dans le fichier :
server {
listen 80;
server_name localhost;
location / { try_files $uri @app; }
location @app {
include uwsgi_params;
uwsgi_pass unix:/tmp/flasktest.sock;
}
}
Utilisez CTRL-X, Y et ENTER pour enregistrer et quitter l’éditeur nano.
Créez enfin un lien depuis ce fichier vers le répertoire « sites-enabled » en utilisant :
sudo ln -s /etc/nginx/sites-available/flasktest_proxy /etc/nginx/sites-enabled
Étape 9 : Redémarrez NGINX
Redémarrez NGINX en utilisant :
sudo systemctl restart nginx
Si vous visitez votre adresse IP dans un navigateur, vous devriez obtenir une erreur « 502 Bad Gateway ». Ceci est attendu car uWSGI n’est pas en cours d’exécution et NGINX essaie de lui transmettre la demande du navigateur.
Étape 10 : Exécutez uwsgi lorsque Pi démarre
uWSGI doit démarrer à chaque redémarrage du Pi. Pour ce faire, nous pouvons utiliser le service systemd.
Accédez au répertoire système :
cd /etc/systemd/system
Créez un fichier unité pour uWSGI :
sudo nano uwsgi.service
Insérez ensuite ceci :
[Unit] Description=uWSGI Service After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/home/pi/flasktest/ ExecStart=/usr/local/bin/uwsgi --ini /home/pi/flasktest/uwsgi.ini [Install] WantedBy=multi-user.target
Utilisez CTRL-X, Y et ENTER pour enregistrer et quitter l’éditeur nano.
Redémarrez le démon pour qu’il récupère cette nouvelle unité :
sudo systemctl daemon-reload
Démarrez maintenant le service :
sudo systemctl start uwsgi.service
Vérifiez enfin l’état du service :
sudo systemctl status uwsgi.service
Espérons que vous devriez voir quelque chose ressemblant à ceci :

Le bit important est la ligne qui indique « actif (en cours d’exécution) ». Cela suggère que notre service est heureux. Appuyez sur CTRL-C pour revenir à l’invite de commande.
Pour le faire fonctionner à chaque redémarrage utilisez la commande :
sudo systemctl enable uwsgi.service
Il doit répondre avec
« Créé lien symbolique /etc/systemd/system/multi-user.target.wants/uwsgi.service /etc/systemd/system/uwsgi.service »
Notre configuration est terminée.
Étape 11 : Redémarrez et testez
Enfin on peut rebooter le Raspberry Pi avec :
sudo reboot
Donnez au Pi une chance de démarrer.
Sur votre PC, visitez l’adresse IP du Pi comme vous le faisiez auparavant.
Vous devriez maintenant voir la page de l’application Flask affichée dans le navigateur.
Félicitations, vous avez maintenant une application Flask servie par NGINX.
Étape 12 : Rechargement tactile (facultatif)
Avec la configuration actuelle, les modifications apportées au fichier « testSite1.py » ne s’afficheront pas même si vous actualisez le navigateur. Ils nécessiteraient le redémarrage du service uWSGI.
Vous pouvez demander à uWSGI de charger automatiquement les modifications apportées à ce fichier en ajoutant la directive « touch-reload » au fichier uwsgi.ini.
Editez le fichier en utilisant :
sudo nano uwsgi.ini
Placez la directive sur une nouvelle ligne :
touch-reload = /home/pi/flasktest/testSite1.py
Utilisez CTRL-X, Y et ENTER pour enregistrer et quitter l’éditeur nano.
Redémarrez le Pi pour que le nouveau paramètre soit pris en compte :
sudo reboot
Une fois que le Pi a démarré, toute modification apportée au fichier testSite1.py s’affichera dans le navigateur lorsque la page sera actualisée.
Crédits
Merci à Pradeep Singh pour son article Application Web Python Flask sur Raspberry Pi avec NGINX et uWSGI ce qui m’a beaucoup aidé.
Merci à Ben Croston (@CrostonBen) de m’avoir aidé à maintenir ma santé mentale pendant que je résolvais quelques problèmes avec tout ce processus.
