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.
Die Reihenfolge der Implementierung ist wie folgt.
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.
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
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.
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
Deploy