Python : Création d'un environnement virtuel Python / Gunicorn

De www.yakakliker.org

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://blog.stephane-robert.info/docs/developper/programmation/python/pyenv/#installation-de-pyenv-virtualenv

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

compteur web gratuit sans pub