Exécution de Flask sous NGINX sur le Raspberry Pi

Exécution de Flask sous NGINX sur le Raspberry Pi

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 :

Site 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 :

État du service uWSGI systemd

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.