This commit is contained in:
MaelREBOUX 2021-04-05 23:09:54 +02:00
parent 7f8e3e2a50
commit 3ad462c1bd
5 changed files with 53 additions and 75 deletions

View file

@ -8,19 +8,20 @@ Cette API sert à :
* lancer les scripts de traitements des données * lancer les scripts de traitements des données
* accéder à des informations sur les les traitements * accéder à des informations sur les les traitements
API Flask copiée depuis [https://github.com/MaelREBOUX/simple_flask_api
](https://github.com/MaelREBOUX/simple_flask_api)
## Installation ## Installation
### Créer un environnement virtuel Python ### Installer les paquets requis
Il faut installer des paquets permettant de builder les librairies requises :
```bash ```bash
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev libpcre3 libpcre3-dev python3-setuptools sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev libpcre3 libpcre3-dev python3-setuptools
``` ```
### Créer un environnement virtuel Python
Après avoir bien entenud fait un git clone du dépôt :
```bash ```bash
cd api cd api
@ -35,77 +36,55 @@ Tester
python3 hello.py python3 hello.py
``` ```
Vérifier que l'on obtient bien un "Hello There" sur la page http://localhost:5000/ Vérifier que l'on obtient bien quelque chose en allant sur la page http://localhost:5000/
Faire `ctrl + C` pour arrêter. Faire `ctrl + C` pour arrêter.
### Configurer uWSGI ## Tester uWSGI
On utilise les fichiers wsgi.py et hello.ini On teste maintenant si uWSGI et le socket fonctionnent bien en utilisant le fichier de configuration ```api_redadeg.ini``` :
On teste si uWSGI et le socket fonctionne en utilisant le fichier de configuration :
```bash ```bash
uwsgi --ini hello.ini uwsgi --ini api_redadeg.ini
``` ```
aire ```ll /tmp/api_redadeg*``` pour voir si le socket a bien été créé par www-data.
Tester si on obtient bien toujours quelque chose sur la page [https://ar-redadeg.openstreetmap.bzh/api/](https://ar-redadeg.openstreetmap.bzh/api/)
À ce stade tout est fonctionnel mais il faut maintenant créer un daemon pour ne pas avoir une commande uwsgi dans le shell.
Sortir du mode venv en tapant : ```deactivate```.
### Configurer nginx ### Configurer nginx
On rajoute les directives suivantes au fichier de conf nginx On rajoute les directives suivantes au fichier de conf nginx
``` ```
location = /hello { rewrite ^ /hello/; } location = /api { rewrite ^ /api/; }
location /hello { try_files $uri @hello; } location /api { try_files $uri @api; }
location @hello { location @api {
include uwsgi_params; include uwsgi_params;
uwsgi_pass unix:/tmp/hello.sock; uwsgi_pass unix:/tmp/api_redadeg.sock;
} }
``` ```
On recharger la configuration de nginx : ```sudo service nginx reload```. On recharger la configuration de nginx : ```sudo service nginx reload```.
Tester si on obtient bien toujours un "Hello There" sur la page http://localhost/hello/ Tester si on obtient bien toujours quelque chose sur la page [https://ar-redadeg.openstreetmap.bzh/api/](https://ar-redadeg.openstreetmap.bzh/api/)
Super ! Mais il faut que la commande ```uwsgi -s …``` qui crée le socket soit active dans le shell. À ce stade tout est fonctionnel mais il faut maintenant créer un daemon pour ne pas avoir une commande uwsgi dans le shell.
Pour sortir du mode venv, taper : ```deactivate```.
Sortir du mode venv en tapant : ```deactivate```.
### Configurer un socket spécifique permanent sur la machine ### Configurer un socket spécifique permanent sur la machine
Il s'agit ici de configurer un socket sépcifique qui sera démarré automatiquement au boot.
```navigateur --> nginx http://{host}/api/ :80 --> socket unix {localhost} :5001 --> programme.py```
En décodé : la route /api/ demandée à nginx sera routée vers un serveur Python local qui écoute sur le port 5001 de la machine pour servir le script python qui répondra.
On va supposer que l'on est sous Debian 10 ou Ubuntu Server 20.04 donc on va créer un démon sous system.d.
Créer un fichier "unit" :
```bash ```bash
sudo nano /etc/systemd/system/api_hello.service cp api_redadeg.service /etc/systemd/system/
```
avec les directives ci-dessous :
```
[Unit]
Description=uWSGI instance to serve Hello API
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/data/projets/ar_redadeg/api
Environment="PATH=/data/projets/ar_redadeg/api/venv/bin"
ExecStart=/data/projets/ar_redadeg/api/venv/bin/uwsgi --ini hello.ini
[Install]
WantedBy=multi-user.target
``` ```
On n'oublie pas de mettre les permissions au serveur web sur les fichiers : On n'oublie pas de mettre les permissions au serveur web sur les fichiers :
@ -114,7 +93,7 @@ On n'oublie pas de mettre les permissions au serveur web sur les fichiers :
chown -R www-data:www-data /data/projets/ar_redadeg/api/ chown -R www-data:www-data /data/projets/ar_redadeg/api/
``` ```
Et on crée le répertoire pour les logs : Et on crée le répertoire pour les logs (en option) :
```bash ```bash
mkdir -p /var/log/uwsgi/ mkdir -p /var/log/uwsgi/
@ -131,7 +110,7 @@ sudo systemctl start api_hello
sudo systemctl status api_hello sudo systemctl status api_hello
``` ```
Faire ```ll /tmp/hello*``` pour voir si le socket a bien été créé par www-data. Faire ```ll /tmp/api_redadeg*``` pour voir si le socket a bien été créé par www-data.
Tester si on obtient bien toujours un "Hello There" sur la page http://localhost/hello/ Tester si on obtient bien toujours un "Hello There" sur la page http://localhost/hello/
@ -139,25 +118,9 @@ Tester si on obtient bien toujours un "Hello There" sur la page http://localho
Si on veut supprimer le service : Si on veut supprimer le service :
```bash ```bash
systemctl stop api_hello systemctl stop api_redadeg
systemctl disable api_hello systemctl disable api_redadeg
rm /etc/systemd/system/api_hello.service rm /etc/systemd/system/api_redadeg.service
systemctl daemon-reload systemctl daemon-reload
systemctl reset-failed systemctl reset-failed
``` ```
## Sources
https://flask.palletsprojects.com/en/1.1.x/deploying/uwsgi/
https://www.vultr.com/docs/deploy-a-flask-website-on-nginx-with-uwsgi
https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-20-04
https://medium.com/@ksashok/using-nginx-for-production-ready-flask-app-with-uwsgi-9da95d8ac0f9
https://uwsgi-docs.readthedocs.io/en/latest/Nginx.html
https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#putting-behind-a-full-webserver
https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#automatically-starting-uwsgi-on-boot

View file

@ -1,12 +1,12 @@
[uwsgi] [uwsgi]
manage-script-name = true manage-script-name = true
mount = /hello=wsgi:app mount = /api=wsgi:app
master = true master = true
processes = 5 processes = 5
socket = /tmp/hello.sock socket = /tmp/api_redadeg.sock
chmod-socket = 660 chmod-socket = 660
vacuum = true vacuum = true

View file

@ -8,13 +8,15 @@ app = Flask(__name__)
@app.route("/") @app.route("/")
def hello(): def index():
return "<h1 style='color:blue'>Hello There!</h1>" return "<h1 style='color:blue'>Ar Redadeg API</h1>"
pass
@app.route("/about/") @app.route("/about/")
def about(): def about():
return "This is a simple Flask Python application" return "This is a simple Flask Python application"
if __name__ == "__main__": if __name__ == "__main__":
app.debug = True app.debug = True
app.run(host='0.0.0.0') app.run(host='0.0.0.0')

13
api/api_redadeg.service Normal file
View file

@ -0,0 +1,13 @@
[Unit]
Description=uWSGI instance to serve Ar Redadeg API
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/data/projets/ar_redadeg/api/
Environment="PATH=/data/projets/ar_redadeg/api/venv/bin"
ExecStart=/data/projets/ar_redadeg/api/venv/bin/uwsgi --ini api_redadeg.ini
[Install]
WantedBy=multi-user.target

View file

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from hello import app from api_redadeg import app
if __name__ == "__main__": if __name__ == "__main__":
app.run() app.run()