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.
L'ordre de mise en œuvre est le suivant.
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.
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
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.
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
Deploy
Recommended Posts