[PYTHON] Serveur à grande échelle réalisé avec Nginx + uWSGI + Flask + Ubuntu (implémentation)

Suite de Installation

Une description approximative et l'installation de chaque application Voir article précédent

Flask

Créez un fichier avec la structure suivante
flask_web_application/
├── application/
│   ├── __init__.py
│   └── views.py
└── server.py

Tout d'abord, créez le corps principal de Flask appelé app

__init__.py


from flask import Flask

app = Flask(__name__)

import application.views

Après avoir accédé au répertoire racine Renvoyez simplement "Hello, World"

views.py


from application import app

@app.route('/')
def show_entries():
    return "Hello World"

Fichiers exécutés par uWSGI Le processus commence à partir d'ici

server.py


from application import app

if __name__ == "__main__":
    app.run(host='0.0.0.0')

D'ailleurs, cette fois je l'ai fait dans / home / ubuntu / application / </ code> Pour les autres répertoires Passez l'autorité avec chown à l'utilisateur qui exécute uWSGI Définissez l'autorité sur environ "775" avec chmod J'expliquerai plus tard, mais cette fois uWSGI

Nom du groupe: www-data Nom d'utilisateur: www-data

Courir sur

uWSGI

Commencez par créer uwsgi.ini uwsgi.ini est un fichier de configuration à lire au démarrage d'uwsgi

Il est juste lu au démarrage pour que vous puissiez le mettre n'importe où Application Flask facile à comprendre créée cette fois Mettez-le juste en dessous

uwsgi.ini



[uwsgi]
base = /home/ubuntu/application/flask_web_application

module = server:app

virtualenv = /home/ubuntu/py36_flask_server

pythonpath = %(base)

callable = app

uid = www-data
gid = www-data
master = true
processes = 1
threads = 1
socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
thunder-lock = true

Seule la partie principale

variable La description
base Répertoire des applications
module app = Flask(__name__)L'application faite en
virtualenv Répertoire d'environnement virtuel Python
pythonpath Identique à la base
callable Module à appeler(app)
uid Exécuté par nom d'utilisateur
gid Exécuté par nom de groupe
processes Le nombre de cœurs est recommandé en fonction de l'environnement et de l'application
threads FlaskLe nombre de threads utilisés par et l'exécution de Flask dans plusieurs threads n'est pas recommandé.(Problème GIL)
socket Socket de domaine UNIX

Créez à l'avance le nom d'utilisateur et le nom de groupe spécifiés par uid et gid. www-data devrait déjà exister Si vous ne le spécifiez pas, il sera exécuté en tant que root, donc ce n'est pas très bon pour la sécurité

Divers articles qui vous seront utiles https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html https://qiita.com/yasunori/items/64606e63b36b396cf695 https://qiita.com/wapa5pow/items/f4326aed6c0b63617ebd https://qiita.com/11ohina017/items/da2ae5b039257752e558

Ajouter uWSGI au service
$ sudo vi /etc/systemd/system/uwsgi.service

#Ajoutez ce qui suit
[Unit]
Description=uWSGI
After=syslog.target

[Service]
ExecStart=/home/ubuntu/py36_flask_server/bin/uwsgi --ini /home/ubuntu/application/flask_web_application/uwsgi.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

Exécutez uWSGI installé dans l'environnement virtuel dans ExecStart Spécifiez le fichier de paramètres créé précédemment dans --ini

Ajouter uWSGI au service

$ sudo systemctl enable uwsgi

Nginx

Désactiver la page d'accueil par défaut de Nginx

Supprimer conf.d / default.conf s'il existe

$ sudo rm /etc/nginx/conf.d/default.conf

Supprimer / nginx / sites-enabled / default le cas échéant

$ sudo rm /etc/nginx/sites-enabled/default

Cela fera disparaître le site par défaut

Créer des sites disponibles et activés pour les sites s'ils n'existent pas

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

Quels sont les sites disponibles et activés pour les sites après tout Fondamentalement, pour utiliser plusieurs domaines sur un serveur Facile à gérer

Cependant, cette fois, je n'utilise pas plusieurs domaines séparément En raison de la structure d'Ubuntu + Nginx + uWSGI Plus stable que d'utiliser conf.d

Comment utiliser -Créer un fichier de paramétrage pour chaque domaine dans les sites disponibles ・ Créer un lien symbolique pour les sites disponibles dans les sites activés

Chose très simple Les liens symboliques sont des soi-disant raccourcis

Dans la partie bloc http de /etc/nginx/nginx.conf Réécrire /etc/nginx/conf.d/*.conf

$ sudo vi /etc/nginx/nginx.conf

http{
…
include /etc/nginx/conf.d/*.conf;
}

http{
…
include /etc/nginx/sites-enabled/*;
}

Ajouté /etc/nginx/sites-available/myapplication.conf

$ sudo vi /etc/nginx/sites-available/myapplication.conf

#Ajoutez ce qui suit
server {
    listen       80;
    root /var/www/html;
    location / { try_files $uri @yourapplication; }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
}

En gros, essayez_files avec l'URL telle quelle Une structure qui recherche depuis la racine et redirige en interne vers uWSGI (avec l'URL telle quelle) si elle n'existe pas la racine n'a rien de particulier Vous pouvez tout lancer sur uWSGI, mais la formule est la même que ci-dessus

uwsgi_params est un fichier de configuration uWSGI unix: ///tmp/uwsgi.sock est un socket de domaine UNIX C'est ce qu'on appelle pour communiquer avec uWSGI.

Vous pouvez également vous connecter avec TCP, mais il occupera le port. Mieux vaut utiliser le socket de domaine

Si vous créez un raccourci, les paramètres de nginx sont terminés

$ sudo ln -s /etc/nginx/sites-available/myapplication.conf /etc/nginx/sites-enabled/myapplication

Accès Il est recommandé de redémarrer l'ensemble du système une fois ici. Sinon, redémarrez simplement Nginx
$ sudo systemctl restart nginx

Si uwsgi n'est pas en cours d'exécution, démarrez-le

& sudo systemctl start uwsgi

vérification des erreurs uwsgi

$ sudo systemctl status uwsgi

vérification des erreurs nginx

$ sudo systemctl status nginx

Lisez attentivement et s'il ne semble pas y avoir d'erreur, essayez d'accéder

$ curl http://127.0.0.1
Hello, World

Résumé Fondamentalement, il est plus rapide de laisser Nginx traiter les fichiers statiques

S'il vous plaît laissez-moi savoir s'il y a quelque chose qui ne va pas avec ceci

Recommended Posts