Python : Création d'un environnement virtuel Python / Gunicorn
Introduction
L'objectif de ce tuto est d'installer un ou plusieurs environnements virtuels Python / Gunicorn pour le même environnement.
Je vais bien entendu passer sur l'installation et la configuration du système d'exploitation de base (ici une Debian/Ubuntu)
Installation de quelques dépendances nécessaires
sudo apt-get update
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 libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev git pip
cd /usr/lib/python3.11
sudo rm EXTERNALLY-MANAGED
Création de l'utilisateur/Environnement
adduser user
usermod -aG sudo user
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
su -l user curl https://pyenv.run | bash
Configuration de l'environnement
- Editer le fichier .bashrc de l'environnement utilisateur et y ajouter ceci :
cd ~
sudo nano .bashrc
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
- Redémarrer la session SSH pour prendre en compte les modifications du fichier (déconnexion / reconnexion)
Vérification de Pyenv
- Relancer une connexion SSH
pyenv --version
contratsb@VLIN052REC:~$ pyenv --version pyenv 2.5.2
Création de l'arborescence applicative
- Je vais placer les fichiers de l'application dans www
- Les logs de Gunicorn seront placés dans un dossier /logs-gunicorn à la racine www
mkdir www cd www mkdir logs
Upload des fichiers applicatifs dans l'environnement utilisateur
- Uploader à la racine www/
sudo chown -R user: *
Installation des versions Python
- Ici, nous allons installer les versions 3.9.0 & 3.9.20
pyenv install 3.9.0 pyenv install 3.9.20 pyenv versions user@debian:~$ pyenv versions * system (set by /home/user/.pyenv/version) 3.9.0 3.9.20
Création des environnements virtuels
user@debian:~$ pyenv virtualenv 3.9.0 appli-3.9.0 Looking in links: /tmp/tmphg0jxgpf Requirement already satisfied: setuptools in /home/user/.pyenv/versions/3.9.0/envs/appli-3.9.0/lib/python3.9/site-packages (49.2.1) Requirement already satisfied: pip in /home/user/.pyenv/versions/3.9.0/envs/appli-3.9.0/lib/python3.9/site-packages (20.2.3)
user@debian:~$ pyenv virtualenv 3.9.20 appli-3.9.20 Looking in links: /tmp/tmp_qi7a0yj Requirement already satisfied: setuptools in /home/user/.pyenv/versions/3.9.20/envs/appli-3.9.20/lib/python3.9/site-packages (58.1.0) Requirement already satisfied: pip in /home/user/.pyenv/versions/3.9.20/envs/appli-3.9.20/lib/python3.9/site-packages (23.0.1)
user@debian:~$ pyenv virtualenvs 3.9.0/envs/appli-3.9.0 (created from /home/user/.pyenv/versions/3.9.0) 3.9.20/envs/appli-3.9.20 (created from /home/user/.pyenv/versions/3.9.20) appli-3.9.0 (created from /home/user/.pyenv/versions/3.9.0) appli-3.9.20 (created from /home/user/.pyenv/versions/3.9.20)
Activation de l'environnement virtuel
user@debian:~/www$ pyenv activate appli-3.9.0 (appli-3.9.0) user@debian:~/www$
Installation des librairies nécessaires au fonctionnement de l'environnement virtuel
- Le fichier requirements.txt peut lister les dépendances et leurs versions à installer dans l'environnement en question
- Bien évidemment, il faudra faire l'installation dans chacun des environnements créés (avec les dépendances concordantes)
pip install --upgrade pip pip install -r requirements.txt
Installation de Gunicorn dans l'environnement virtuel
pip install gunicorn
Sortir de l'environnement virtuel
user@debian:~/www$ pyenv deactivate
- Refaire les installations sur les autres environnements virtuels
Paramétrages des logs Gunicorn
- Créer ou modifier un fichier gunicorn_versionPython_conf.py à la racine de l'environnement (/home/application/www/)
- Penser à créer un fichier gunicorn_version_conf.py différent en fonction des environnements virtuels
Exemple de fichier :
# /home/environnement/www/gunicorn-version_conf.py bind = '0.0.0.0:8000' worker_class = 'sync' loglevel = 'debug' accesslog = './logs-gunicorn/access_log_appli' acceslogformat ="%(h)s %(l)s %(u)s %(t)s %(r)s %(s)s %(b)s %(f)s %(a)s" errorlog = './logs-gunicorn/error_log_appli'
Ajouter l'option dans le lancement de gunicorn : -c gunicorn-version_conf.py
Exemple : gunicorn -w 4 'recherche_19:app' --bind 0.0.0.0:8000 -c gunicorn_conf.py
Création du service "environnement.service"
- Bien vérifier l'emplacement de gunicorn dans l'environnement (change en fonction de l'environnement virtuel)
- Penser à créer un service différent en fonction de l'environnement virtuel utilisé
find -name gunicorn
- Se positionner dans /etc/systemd/system
sudo nano environnement.service
[Unit] Description=Gunicorn instance to serve appli After=network.target [Service] User=user Group=user WorkingDirectory=/home/user/www Environment="PATH=/home/user/www" ExecStart=/home/user/.pyenv/versions/3.9.0/envs/appli-3.9.0/bin/gunicorn -w 4 -t 120 -c gunicorn-3.9.0_conf.py 'appli:app' --bind 0.0.0.0:8000 [Install] WantedBy=default.target
- Activation du service au démarrage
systemctl daemon-reload
systemctl enable 'envionnement.service'
systemctl start 'environnement.service'
systemctl status 'environnement.service'
Liens
https://www.squash.io/how-to-use-different-python-versions-with-virtualenv/
https://docs.python.org/3/library/venv.html
https://www.squash.io/how-to-fix-no-module-named-pip-error/
https://akrabat.com/creating-virtual-environments-with-pyenv/
https://blog.victor-hery.com/2019/04/python-et-pyenv.html