[PYTHON] J'ai essayé d'exécuter Flask sur Raspberry Pi 3 Model B + en utilisant Nginx et uWSGI

but de fond

Je savais que uWSGI serait utilisé pour déployer une application mise en œuvre par Python en production, mais je ne savais pas pourquoi ni comment l'utiliser. Alors, exécutons-le sur Raspberry Pi 3 Model B + en utilisant Nginx, uWSGI et Python + Flask.

En premier lieu, WSGI est une abréviation de Web Server Gateway Interface. Comme décrit dans le résumé de PEP 3333, il s'agit d'une interface qui connecte un serveur Web et une application Python, et améliore la portabilité de l'application Web entre divers serveurs Web.

This document specifies a proposed standard interface between web servers and Python web applications or frameworks, to promote web application portability across a variety of web servers.

Déployez l'application créée par Python + Flask à l'aide de uWSGI du conteneur d'application WSGI conforme à ce WSGI.

la mise en oeuvre

L'ordre de mise en œuvre est le suivant.

  1. Exécutez les applications Flask dans l'environnement de développement
  2. Exécutez l'application Flask avec uWSGI
  3. Définissez Nginx et appuyez sur l'adresse IP de Raspeye depuis le navigateur
  4. Démarrez automatiquement uWSGI

Exécuter des applications Flask dans un environnement de développement

Tout d'abord, le répertoire de l'environnement de développement est le suivant.

$ tree
.
├── README.md
├── conf
│   └── uwsgi.ini
├── requirements.txt
└── src
    └── main.py

Les bibliothèques requises sont répertoriées dans requirements.txt. Vous pouvez l'utiliser pour installer la bibliothèque avec pip install -r requirements.txt.

$ cat requirements.txt 
flask
isort
flake8
ipython
uwsgi

src / main.py est:

$ cat src/main.py 
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

Avec python src / main.py, vous pouvez voir que le serveur de développement est démarré sur le port 5000 et que l'application est en cours d'exécution.

Exécutez des applications Flask avec uWSGI

Lors de l'utilisation effective de l'application, il est nécessaire d'effectuer divers réglages. Par exemple, la destination de sortie du socket, le nombre de processus, le nombre de threads et autres peuvent être mentionnés. Comme il est difficile de spécifier ces paramètres en combinaison avec les options de la commande uwsgi, les options sont résumées dans le fichier uwsgi.ini suivant.

Ensuite, vous pouvez vérifier si l'application fonctionne réellement avec ʻuwsgi --ini uwsgi.ini`.

$ cat conf/uwsgi.ini
[uwsgi]
wsgi-file = ../src/main.py
; module = main
callable = app
chmod-socket = 666
socket = /tmp/%n.sock
;http = 0.0.0.0:8080
;daemonize = /var/log/uwsgi/flask/%n.log
;pidfile = /tmp/app.pid
;harakiri = 600

Définissez Nginx et appuyez sur l'adresse IP de Raspeye à partir du navigateur

Après avoir accédé au port Nginx 80 avec une requête HTTP, effectuez un proxy vers uWSGI à l'aide d'un socket de domaine UNIX. Les paramètres du côté Nginx sont les suivants.

server {
    listen 80;
    #Inverser le proxy vers l'application Flask lors de l'accès au port 80
    #De cette façon, vous ne gaspillez pas votre port
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
    proxy_set_header  Host                $host;
    proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Host    $host;
    proxy_http_version      1.1;
    proxy_connect_timeout 600;
    proxy_read_timeout    600;
    proxy_send_timeout    600;
    send_timeout          600;
    uwsgi_read_timeout    600;
}

À propos, une socket de domaine UNIX est une socket pour la communication inter-processus exécutée sur la même machine. Par conséquent, il ne peut pas communiquer avec d'autres machines. D'autre part, une socket qui communique avec d'autres machines via un réseau en s'appuyant sur l'IP et le numéro de port est appelée une socket de domaine INET. Les sockets de domaine UNIX peuvent uniquement communiquer avec les processus sur la même machine, mais sont plus rapides que les sockets de domaine INET.

Démarrer automatiquement uWSGI

Il existe plusieurs façons de démoniser uWSGI. La première consiste à ajouter l'option daemonize aux options de la commande uwsgi. La deuxième méthode consiste à enregistrer uWSGI dans systemctl et à le faire démarrer automatiquement. Le second a été adopté dans cette implémentation.

--Création d'un service (/etc/systemd/system/app.service)

[Unit]
Description=uWSGI instance to serve myapp
After=network.target

[Service]
;User==www-data
Group=www-data
WorkingDirectory=/home/pi/WorkSpace/DeployFlask/conf
ExecStart=/home/pi/.pyenv/shims/uwsgi --ini /home/pi/WorkSpace/DeployFlask/conf/uwsgi.ini

[Install]
WantedBy=multi-user.target

--Démarrage du service

$ sudo systemctl start app
$ sudo systemctl enable app
$ sudo systemctl status app
● app.service - uWSGI instance to serve myapp
   Loaded: loaded (/etc/systemd/system/app.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-05-12 18:22:25 JST; 7min ago
 Main PID: 2615 (uwsgi)
    Tasks: 1 (limit: 2200)
   Memory: 10.9M
   CGroup: /system.slice/app.service
           └─2615 /home/pi/.pyenv/versions/DeployFlask/bin/uwsgi --ini /home/pi/WorkSpace/DeployFlask/conf/uwsgi.ini

Objets / problèmes obstrués

référence

Deploy

article

Communication par socket

Recommended Posts

J'ai essayé d'exécuter Flask sur Raspberry Pi 3 Model B + en utilisant Nginx et uWSGI
Démarrage USB sur Raspberry Pi 4 modèle B
[Python] J'ai essayé d'exécuter un serveur local en utilisant flask
raspberry pi 1 modèle b, python
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
J'ai essayé de connecter Raspeye et conect + avec l'API Web
J'ai essayé d'automatiser [une certaine tâche] à l'aide d'une tarte à la râpe
Raspberry pi 1 modèle b, partie rouge noeud 17
MQTT sur Raspberry Pi et Mac
Essayez d'utiliser ArUco avec Raspberry Pi
Instrument de pesage utilisant Raspberry Pi et Hx711 (affichage GUI dans Tkinter)
Détectez la "luminosité" en utilisant python sur Raspberry Pi 3!
Exécutez un servomoteur en utilisant python sur Raspberry Pi 3
Paramètres initiaux pour l'utilisation du kit de démarrage et de la caméra Grove Pi + avec Raspberry Pi
J'ai essayé d'héberger le modèle d'apprentissage en profondeur de Pytorch avec TorchServe sur Amazon SageMaker
Construire un environnement OpenCV-Python sur Raspberry Pi B +
Détectez la température à l'aide de python sur Raspberry Pi 3!
Démarrez un serveur Web en utilisant Bottle et Flask (j'ai également essayé d'utiliser Apache)
J'ai fait un modèle de classification d'images et essayé de le déplacer sur mobile
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 1: Aperçu
J'ai essayé d'utiliser l'API à distance avec GAE / J
J'ai essayé le web scraping en utilisant python et sélénium
Détectez les interrupteurs à glissière à l'aide de python sur Raspberry Pi 3!
Essayez d'utiliser le code QR avec Raspberry Pi
J'ai essayé L-Chika avec Razpai 4 (édition Python)
[Pythonocc] J'ai essayé d'utiliser la CAO sur un notebook Jupyter
Sonnez le buzzer en utilisant python sur Raspberry Pi 3!
Introduction de Ceph avec Kubernetes sur Raspberry Pi 4B (ARM64)
Installez PyCall sur Raspberry PI et essayez d'utiliser la bibliothèque GPIO pour Python de Ruby
De l'introduction de Flask sur CentOS au service sur Nginx et uWSGI
Enregistrez la température et l'humidité avec systemd sur Raspberry Pi
Créer un environnement OpenCV4 sur Raspberry Pi à l'aide de Poetry
Créez un capteur de couleur à l'aide d'une tarte à la râpe et d'une caméra
J'ai essayé d'exécuter l'application sur la plateforme IoT "Rimotte"
J'ai essayé d'héberger un exemple de modèle de Pytorch en utilisant TorchServe
Essayez d'utiliser le capteur de température (LM75B) avec Raspeye.
Ubuntu 20.04 sur raspberry pi 4 avec OpenCV et utilisation avec python
J'ai essayé d'utiliser PySpark de Jupyter 4.x sur EMR
Démarrage USB avec Raspberry Pi 4 modèle B (3) édition LVM
Installation de Docker sur Raspberry Pi et L Chika
Installez pyenv sur Raspberry Pi pour gérer Python
Sortie sur "LED 7 segments" en utilisant python avec Raspberry Pi 3!
Résoudre les problèmes liés à l'installation d'OpenCV sur Raspberry Pi et à la capture
J'ai essayé d'installer scrapy sur Anaconda et je n'ai pas pu
Utilisez le frame buffer (/ dev / fb0) avec Raspeye pour entrer et sortir directement les images d'affichage
Je voulais faire fonctionner le moteur avec une tarte à la râpe, alors j'ai essayé d'utiliser la carte de commande du moteur de Waveshare
J'ai essayé d'utiliser la console Pi I / F du kit de démarrage Raspeye IoT de Mechatrax "anyPi"
J'ai essayé de créer une caméra de surveillance à détection de mouvement avec OpenCV en utilisant une caméra WEB avec Raspberry Pi
J'ai essayé d'utiliser PI Fu pour générer un modèle 3D d'une personne à partir d'une image
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'exécuter pymc
J'ai essayé d'utiliser Summpy