Procédure d'installation Apache / Python / Flask / Gunicorn

De www.yakakliker.org

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

https://blog.stephane-robert.info/docs/developper/programmation/python/pyenv/#installation-de-pyenv-virtualenv

  • 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://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-20-04-fr

https://baeldung.com/linux/systemd-services-environment-variables

https://dev.to/tkirwa/create-a-systemd-service-script-for-running-gunicorn-to-serve-your-application-5aea

  • Activation du service au démarrage

systemctl enable application

Commandes pour accéder aux logs de l'application

journalctl -xu application

Liens

https://httpd.apache.org/

https://flask.palletsprojects.com/en/stable/

https://gunicorn.org/

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/

https://shape.host/resources/enhanced-script-execution-running-python-scripts-with-apache-and-mod_wsgi-on-ubuntu-22-04


compteur web gratuit sans pub