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
* 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
### Créer un environnement virtuel Python
Il faut installer des paquets permettant de builder les librairies requises :
### Installer les paquets requis
```bash
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
cd api
@ -35,77 +36,55 @@ Tester
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.
### Configurer uWSGI
## Tester uWSGI
On utilise les fichiers wsgi.py et hello.ini
On teste si uWSGI et le socket fonctionne en utilisant le fichier de configuration :
On teste maintenant si uWSGI et le socket fonctionnent bien en utilisant le fichier de configuration ```api_redadeg.ini``` :
```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
On rajoute les directives suivantes au fichier de conf nginx
```
location = /hello { rewrite ^ /hello/; }
location /hello { try_files $uri @hello; }
location @hello {
location = /api { rewrite ^ /api/; }
location /api { try_files $uri @api; }
location @api {
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```.
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.
Pour sortir du mode venv, taper : ```deactivate```.
À 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 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
sudo nano /etc/systemd/system/api_hello.service
```
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
cp api_redadeg.service /etc/systemd/system/
```
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/
```
Et on crée le répertoire pour les logs :
Et on crée le répertoire pour les logs (en option) :
```bash
mkdir -p /var/log/uwsgi/
@ -131,7 +110,7 @@ sudo systemctl start 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/
@ -139,25 +118,9 @@ Tester si on obtient bien toujours un "Hello There" sur la page http://localho
Si on veut supprimer le service :
```bash
systemctl stop api_hello
systemctl disable api_hello
rm /etc/systemd/system/api_hello.service
systemctl stop api_redadeg
systemctl disable api_redadeg
rm /etc/systemd/system/api_redadeg.service
systemctl daemon-reload
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]
manage-script-name = true
mount = /hello=wsgi:app
mount = /api=wsgi:app
master = true
processes = 5
socket = /tmp/hello.sock
socket = /tmp/api_redadeg.sock
chmod-socket = 660
vacuum = true

View file

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