De plus en plus d'applications web commencent à fonctionner en Python 3. Le fameux framework Flask, par exemple, est compatible avec Python 3.3 et supérieurs. Malheureusement, cette version de Python n'est pas encore disponible dans la version stable actuelle de Debian (Wheezy), qui ne propose que Python 3.2.
Dans cet article, nous allons voir comment déployer une application Python 3.3 sur Debian Wheezy, de manière totalement indépendante du système d'exploitation.
Installer Python 3.3 avec pyenv
Tout d'abord, nous allons installer Python 3.3 dans /srv/pyenv
.
Pyenv est un système écrit par Yamashita Yuu, qui permet d'installer plusieurs versions Python indépendamment du système, et de basculer de l'une à l'autre. Il est écrit en scripts Shell, il suffit donc de clôner le dépôt, définir quelques variables d'environnement, et d'utiliser le script pyenv
de la façon suivante :
cd /srv
git clone https://github.com/yyuu/pyenv.git pyenv
# Initilialisation de quelques variables d'environnement.
export PYENV_ROOT=$PWD/pyenv
export PATH=$PYENV_ROOT/bin:$PATH
# Installation de paquets nécessaires à la compilation de Python.
aptitude install libreadline-dev libsqlite3-dev libbz2-dev
# Compilation et installation de Python dans pyenv.
pyenv install 3.3.5 -v
# Sélection de la version python installée.
pyenv local 3.3.5
# Initialisation de l'environnement Pyenv.
eval "$(pyenv init -)"
Préparer un virtualenv pour l'application
Nous partons du principe que l'application sera déployée dans /srv/helloworld/app
. Le virtualenv sera créé dans /srv/helloworld/venv
.
# Actualisation de l'environnement Pyenv (au cas où...).
pyenv rehash
# Installation de virtualenv dans pyenv avec Pip.
pip install virtualenv
# Déplacement dans le répertoire dédié à l'application.
cd /srv/helloworld
# Création de l'environnement virtuel.
virtualenv venv
Installer l'application et ses prérequis
Nous allons déployer une application d'exemple dans /srv/helloworld/app
:
# Déplacement dans le répertoire de l'application.
cd /srv/helloworld
# Clonage de l'application dans /srv/helloworld/app
git clone https://github.com/Sysnove/flask-hello-world.git app
# Utilisation de l'environnement virtuel.
source /srv/helloworld/venv/bin/activate
# Aller dans le répertoire de l'application.
cd app
# Installation des dépendances de l'application.
pip install -r requirements.txt
# Test du lancement de l'application (faire CTRL+C pour quitter)
python -m hello
Installer uWSGI dans le virtualenv
Afin de démarrer notre application, nous allons utiliser uWSGI. Malheureusement, le daemon uWSGI installable via les paquets Debian utilisera l'exécutable python du système, donc 3.2, et non celui du virtualenv que nous venons de créer. Pour pallier à ce problème, la solution consiste à installer uWSGI directement dans l'environnement virtuel.
# Déplacement dans le répertoire de l'application et utilisation de l'environnement virtuel si ce n'est pas déjà le cas.
cd /srv/helloworld
source venv/bin/activate
# Installation de uWSGI
pip install uwsgi
Ensuite, nous créons le fichier de configuration de l'application /srv/hello-world/uwsgi.ini
:
[uwsgi]
chdir = /srv/hello-world/app
socket = /var/run/uwsgi/app/hello-world/socket
master = true
uid = www-data
pythonpath = /srv/hello-world/app
virtualenv = /srv/hello-world/venv
module = hello
callable = app
On termine par fixer les permissions sur l'application :
chown www-data:www-data -R /srv/hello-world
Installer et configurer runit
Afin de lancer cet uWSGI, nous allons utiliser runit, qui nous apportera trois avantages :
- éviter d'écrire un fichier init
- le relancement automatique en cas de crash
- le logging
Pour ce faire :
# Installer runit
apt-get install runit
# Créer l'arborescence pour le service
mkdir -p /etc/sv/hello-world/log
On crée le script de démarrage du logger dans /etc/sv/hello-world/log/run
:
#!/bin/sh
sleep 1
exec chpst -u nobody svlogd -ttt /var/log/sv/hello-world
On crée le script de démarrage de l'application dans /etc/sv/hello-world/run
:
#!/bin/sh
exec sudo -u www-data /srv/hello-world/venv/bin/uwsgi --ini /srv/hello-world/uwsgi.ini 2>&1
On fixe les droits des différents fichiers :
chmod +x /etc/sv/hello-world/log/run
mkdir -p /var/log/sv/hello-world
chown -r nobody:nogroup /var/log/sv
chmod +x /etc/sv/hello-world/run
On active le service :
cd /etc/service
ln -sf ../sv/hello-world
Installer et configurer Nginx
Il ne reste plus qu'à configurer Nginx pour rendre l'application disponible en HTTP. Pour celà vous pouvez vous référer à la section "…et enfin le proxy" de l'article "Déployer une application web en Python avec Nginx et uWSGI". Remplacez juste la valeur de uwsgi_pass
par unix:/var/run/uwsgi/app/hello-world/socket
pour cibler la bonne socket uwsgi.