Procédure d'installation Apache / Python / Flask / Gunicorn
Description
L'objectif de ce document est de décrire dans les grandes lignes l'installation et la configuration d'un serveur Apache avec un environnement Python spécifique, Flask et Gunicorn.
Je vous invite bien évidemment à vous documenter au sujet d'Apache, Flask, Gunicorn & Python.
Installation de Sudo
apt-get install sudo
Installation d'Apache
apt-get install apache2 apache2-utils libapache2-mod-wsgi-py3 -y
systemctl status apache2
Création de l'utilisateur
L'environnement sera déployé dans le home utilisateur (ici application)
adduser application
- Ajout de l'utilisateur au groupe sudo
usermod -aG sudo application
Installation de Pyenv pour Python
- Pyenv permet d'installer plusieurs versions de Python en fonction des besoins
- Un se connecte en tant qu'utilisateur de l'environnement
su - application
sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git pip
curl https://pyenv.run | bash
Configuration de l'environnement
- Editer le fichier .bashrc de l'environnement utilisateur et y ajouter ceci :
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
Vérification de Pyenv
- Relancer une connexion SSH et vérification de pyenv
pyenv --version
Installation de Python 3.9
pyenv install 3.9.20
Définition de la version "globale" de Python
pyenv global 3.9.20
Contrôle de la version de Python
python3 --version
Configuration du dossier d'environnement
- Dans le dossier /home/application/
- Créer un dossier www
mkdir www
- Créer un dossier /www/flask
mkdir /www/flask
Installation de Flask
- Se positionner dans le dossier /home/application/www/flask
pip install flask
pip install --upgrade pip
- Besoins spécifiques (optionnels)
pip install pandas
pip install nltk
Installation de Gunicorn
- Gunicorn est un portail que fera l'interface entre Apache et Flask
pip install gunicorn
Configuration d'Apache
- Activation des modules nécessaires à Apache
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_http2
a2enmod headers
systemctl restart apache2
- Configuration du fichier /etc/apache2/sites-available/environnement.conf en tant que reverse proxy
<VirtualHost *:80> ServerName Adresse IP ou hostname ou DNS/ Proxypass "/" "http://127.0.0.1:8000/" RequestHeader set X-Forwarded-Proto http RequestHeader set X-Forwarded-Prefix / </VirtualHost>
Lancement manuel de Gunicorn
gunicorn -w 4 'application:app'
gunicorn --bind 0.0.0.0:8000 application:app
Paramétrages de l'environnement pour l'accès aux logs
usermod -aG systemd-journal application
Paramétrages des logs
- Créer un dossier /var/log/gunicorn
- Créer un fichier gunicorn_conf.py à la racine de l'environnement (/home/application/www/flask/)
# /home/application/www/flask/gunicorn_conf.py
bind = '0.0.0.0:8000'
worker_class = 'sync'
loglevel = 'debug'
accesslog = '/var/log/gunicorn/access_log_application'
acceslogformat ="%(h)s %(l)s %(u)s %(t)s %(r)s %(s)s %(b)s %(f)s %(a)s"
errorlog = '/var/log/gunicorn/error_log_application'
- Ajouter l'option dans le lancement de gunicorn :
-c gunicorn_conf.py
Exemple : gunicorn -w 4 'application:app' --bind 0.0.0.0:8000 -c gunicorn_conf.py
Autre solution possible
- Editer le fichier /etc/systemd/journald.conf
[Journal]
Storage=persistent
..
SystemMaxUse=500M
SystemKeepFree=100M
..
MaxLevelStore=warning
Création du service "application.service"
- Se positionner dans /etc/systemd/system
nano application.service
[Unit] Description=Gunicorn instance to serve application After=network.target [Service] User=application Group=application WorkingDirectory=/home/application/www/flask Environment="PATH=/home/application/www/flask" ExecStart=/home/application/.pyenv/versions/3.9.20/bin/gunicorn -w 4 -c gunicorn_conf.py 'application:app' --bind 127.0.0.1:8000 [Install] WantedBy=default.target
https://baeldung.com/linux/systemd-services-environment-variables
- Activation du service au démarrage
systemctl enable application
Commandes pour accéder aux logs de l'application
journalctl -xu application
Liens
https://flask.palletsprojects.com/en/stable/
https://github.com/pyenv/pyenv
https://www.cheatsheet.fr/2021/05/19/publier-un-site-flask-sur-apache/
https://flask.palletsprojects.com/en/stable/deploying/apache-httpd/
https://www.opensourceforu.com/2023/03/deploying-a-flask-application-via-the-apache-server/