[PYTHON] Ich habe versucht, Flask auf Raspberry Pi 3 Model B + mit Nginx und uWSGI auszuführen

Hintergrund Zweck

Ich wusste, dass uWSGI verwendet werden würde, um eine in Python implementierte Anwendung für die Produktion bereitzustellen, aber ich wusste nicht, warum oder wie ich sie verwenden sollte. Lassen Sie es uns also auf Raspberry Pi 3 Model B + mit Nginx, uWSGI und Python + Flask ausführen.

Erstens ist WSGI eine Abkürzung für Web Server Gateway Interface. Wie in Abstruct of PEP 3333 beschrieben, handelt es sich um eine Schnittstelle, die einen Webserver und eine Python-Anwendung verbindet und die Portabilität der Webanwendung zwischen verschiedenen Webservern verbessert.

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.

Stellen Sie die von Python + Flask mit uWSGI des WSGI-Anwendungscontainers erstellte Anwendung bereit, die dieser WSGI entspricht.

Implementierung

Die Reihenfolge der Implementierung ist wie folgt.

  1. Führen Sie Flask-Anwendungen in der Entwicklungsumgebung aus
  2. Führen Sie die Flask-Anwendung mit uWSGI aus
  3. Stellen Sie Nginx ein und drücken Sie im Browser die IP-Adresse von Raspeye
  4. Starten Sie uWSGI automatisch

Führen Sie Flask-Anwendungen in der Entwicklungsumgebung aus

Erstens ist das Verzeichnis der Entwicklungsumgebung wie folgt.

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

Die erforderlichen Bibliotheken sind in der Datei require.txt aufgeführt. Sie können dies verwenden, um die Bibliothek mit pip install -r require.txt zu installieren.

$ cat requirements.txt 
flask
isort
flake8
ipython
uwsgi

src / main.py ist:

$ cat src/main.py 
from flask import Flask

app = Flask(__name__)

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

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

Mit python src / main.py können Sie sehen, dass der Entwicklungsserver auf Port 5000 gestartet wird und die Anwendung tatsächlich ausgeführt wird.

Führen Sie Flask-Anwendungen mit uWSGI aus

Wenn Sie die Anwendung tatsächlich betreiben, müssen Sie verschiedene Einstellungen vornehmen. Beispielsweise können das Ausgabeziel des Sockets, die Anzahl von Prozessen, die Anzahl von Threads und dergleichen erwähnt werden. Da es schwierig ist, diese Einstellungen in Kombination mit den Optionen des Befehls uwsgi anzugeben, werden die Optionen in der folgenden Datei uwsgi.ini zusammengefasst.

Dann können Sie überprüfen, ob die Anwendung tatsächlich mit uwsgi --ini uwsgi.ini ausgeführt wird.

$ 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

Stellen Sie Nginx ein und drücken Sie im Browser die IP-Adresse von Raspeye

Nachdem Sie mit einer HTTP-Anforderung auf Nginx-Port 80 zugegriffen haben, können Sie über einen UNIX-Domänensocket einen Proxy für uWSGI erstellen. Die Einstellungen auf der Nginx-Seite sind wie folgt.

server {
    listen 80;
    #Reverse Proxy zur Flask App, wenn auf Port 80 zugegriffen wird
    #Auf diese Weise verschwenden Sie Ihren Hafen nicht
    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;
}

Ein UNIX-Domain-Socket ist übrigens ein Socket für die Kommunikation zwischen Prozessen, die auf demselben Computer ausgeführt wird. Daher kann es nicht mit anderen Maschinen kommunizieren. Andererseits wird ein Socket, der über ein Netzwerk unter Verwendung von IP und Portnummer mit anderen Computern kommuniziert, als INET-Domänensocket bezeichnet. UNIX-Domänensockets können nur mit Prozessen auf demselben Computer kommunizieren, sind jedoch schneller als INET-Domänensockets.

Starten Sie uWSGI automatisch

Es gibt verschiedene Möglichkeiten, uWSGI zu dämonisieren. Die erste besteht darin, die Option "daemonize" zu den Befehlsoptionen von uwsgi hinzuzufügen. Die zweite Methode besteht darin, uWSGI in systemctl zu registrieren und automatisch zu starten. Der zweite wurde in diese Implementierung übernommen.

--Erstellen eines Dienstes (/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

--Starten des Dienstes

$ 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

Verstopfte Dinge / Probleme

Referenz

Deploy

Artikel

Recommended Posts

Ich habe versucht, Flask auf Raspberry Pi 3 Model B + mit Nginx und uWSGI auszuführen
USB-Boot auf Raspberry Pi 4 Model B.
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Himbeere pi 1 Modell b, Python
Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe versucht, Raspeye und conect + mit der Web-API zu verbinden
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
Himbeer pi 1 Modell b, knotenroter Teil 17
MQTT auf Raspberry Pi und Mac
Versuchen Sie es mit ArUco mit Raspberry Pi
Wiegeinstrument mit Himbeer-Pi und hx711 (GUI-Anzeige in Tkinter)
Erkennen Sie "Helligkeit" mit Python auf Raspberry Pi 3!
Lassen Sie einen Servomotor mit Python auf Raspberry Pi 3 laufen
Grundeinstellungen für die Verwendung des Grove Pi + Starterkits und der Kamera mit Raspberry Pi
Ich habe versucht, Pytorchs Deep-Learning-Modell mit TorchServe auf Amazon SageMaker zu hosten
Erstellen Sie eine OpenCV-Python-Umgebung auf Raspberry Pi B +
Ermitteln Sie die Temperatur mit Python auf Raspberry Pi 3!
Starten Sie einen Webserver mit Bottle and Flask (ich habe auch versucht, Apache zu verwenden)
Ich habe ein Bildklassifizierungsmodell erstellt und versucht, es auf dem Handy zu verschieben
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 1: Übersicht
Ich habe versucht, Remote API mit GAE / J zu verwenden
Ich habe versucht, Web-Scraping mit Python und Selen
Erkennen Sie Schiebeschalter mit Python auf Raspberry Pi 3!
Versuchen Sie, QR-Code mit Raspberry Pi zu verwenden
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
[Pythonocc] Ich habe versucht, CAD auf einem Jupyter-Notebook zu verwenden
Lassen Sie den Summer mit Python auf Raspberry Pi 3 erklingen!
Einführung von Ceph mit Kubernetes auf Raspberry Pi 4B (ARM64)
Installieren Sie PyCall auf Raspberry PI und versuchen Sie, die GPIO-Bibliothek für Python von Ruby zu verwenden
Von der Einführung von Flask unter CentOS bis zum Service unter Nginx und uWSGI
Notieren Sie Temperatur und Luftfeuchtigkeit mit systemd auf Raspberry Pi
Erstellen Sie mithilfe von Poetry eine OpenCV4-Umgebung auf Raspberry Pi
Erstellen Sie einen Farbsensor mit einem Raspeltorte und einer Kamera
Ich habe versucht, die App auf der IoT-Plattform "Rimotte" auszuführen.
Ich habe versucht, ein Beispielmodell von Pytorch mit TorchServe zu hosten
Versuchen Sie es mit dem Temperatursensor (LM75B) mit Raspeye.
Ubuntu 20.04 auf Himbeer-Pi 4 mit OpenCV und mit Python verwenden
Ich habe versucht, PySpark von Jupyter 4.x auf EMR zu verwenden
USB-Boot mit Raspberry Pi 4 Modell B (3) LVM Edition
Installation von Docker auf Raspberry Pi und L Chika
Installieren Sie pyenv auf Raspberry Pi, um Python zu verwalten
Ausgabe auf "7 Segment LED" mit Python mit Raspberry Pi 3!
Fehlerbehebung bei der Installation von OpenCV auf Raspberry Pi und der Erfassung
Ich habe versucht, Scrapy auf Anaconda zu installieren und konnte es nicht
Verwenden Sie den Bildspeicher (/ dev / fb0) mit Raspeye, um Anzeigebilder direkt einzugeben und auszugeben
Ich wollte den Motor mit einer Raspeltorte laufen lassen, also habe ich versucht, das Motor Driver Board von Waveshare zu verwenden
Ich habe versucht, die Pi Console I / F von Mechatraxs Raspeye IoT Starter Kit "anyPi" zu verwenden.
Ich habe versucht, mit OpenCV eine Bewegungserkennungsüberwachungskamera mit einer WEB-Kamera mit Raspberry Pi herzustellen
Ich habe versucht, mit PI Fu aus einem Bild ein 3D-Modell einer Person zu erstellen
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, Pymc auszuführen
Ich habe versucht, Summpy zu verwenden