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.

À propos de l'auteur



Alexis est le doyen de l'équipe. Ses expériences professionnelles variées en tant que développeur Java puis administrateur système lui permettent d'avoir une excellente compréhension des problématiques de développement et d'hébergement, notamment d'applications Web.

Chez Sysnove, son rôle consiste à mettre en place et administrer les infrastructures nécessaires à l'hébergement des services fournis aux clients. En tant que directeur technique, il est responsable de l'infrastructure et gère la recherche et développement.