TileStache + virtualenv + mod_wsgi

lundi 22 décembre 2014

TileStache

Dans un précédent billet, j’expliquais comment installer TileStache sur Ubuntu Server 12.04. Le présent billet propose une autre méthode basée sur les environnements virtuels de Python.

Installation de Mapnik

On commence par installer Mapnik, mais pas la version proposée dans les dépôts d’Ubuntu. On va utiliser une version plus récente disponible dans le dépôt de mapnik.

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:mapnik/v2.2.0
sudo apt-get update
sudo apt-get install libmapnik python-mapnik mapnik-utils

Apache mod_python VS mod_wsgi

mod_wsgi a longtemps été recommandé à la place de mod_python qui n’était plus maintenu. Même si le développement de ce dernier a repris depuis novembre 2013, mod_wsgi semble toujours plus intéressant. [1] [2] De plus, la version de mod_python disponible sur Ubuntu 12.04 et 14.04 est toujours la 3.3.1 qui date de 2007.

Quelques liens à propos de mod_wsgi :

Installons donc mod_wsgi pour Apache :

sudo apt-get install libapache2-mod_wsgi
sudo /etc/init.d/apache2 restart

Puis on installe les outils Python et quelques librairies nécessaires :

sudo apt-get install python-setuptools python-dev python-gdal libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-dev

On récupère PIP pour faciliter l’installation des modules Python par la suite :

curl -O https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

Avant d’installer PIL, il faut vérifier la présence de certains liens symboliques dans le répertoire /usr/lib. Si les liens suivants ne sont pas présents dans ce répertoire, créez-les avec les commandes suivantes :

sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib
sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib
sudo ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib

Sur les conseils de Yohan, on va installer TileStache et ses dépendances dans un environnement virtuel. [3]

# installer virtualenv
pip install virtualenv
# se déplacer dans le dossier de notre projet
cd /var/www/tiles/
# créer un virtualenv directement dans le dossier du projet
# cela permettra d'éviter les problèmes de permissions pour Apache
virtualenv /var/www/tiles/tsenv
# activer le virtualenv du projet
source tsenv/bin/activate
# installer tilestache et ses dépendances
pip install --allow-external PIL --allow-unverified PIL PIL werkzeug modestmaps Blit sympy tilestache
# désactiver le virtualenv
deactivate

Il ne reste plus qu’à créer un fichier wsgi dans /var/tiles/tiles.py pour faire la passerelle entre TileStache et Apache : [4]

# Activate virtual env
import os
activate_env=os.path.expanduser("/var/www/tiles/tsenv/bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))

import TileStache
application = TileStache.WSGITileServer('/var/www/tiles/tilestache.cfg')

Finalement, on configure mod_wsgi pour Apache afin que le serveur redirige les requêtes de tuiles vers TileStache. Pour cela, on édite le fichier de configuration d’Apache (ou notre virtualhost) :

sudo nano /etc/apache2/httpd.conf

Et on y ajoute ceci :

WSGIScriptAlias /tiles/tiles.py /var/www/tiles/tiles.py

# https://github.com/TileStache/TileStache/issues/67
# The first "YOUR_DOMAIN.com" is just a process group.  The name is arbitrary.
# The "display-name" shows up when running "ps -u YOUR_USERNAME -o pid,rss,command" to list processes.  Otherwise you can't tell which process belongs to which dja$
#WSGIDaemonProcess YOUR_DOMAIN.com processes=1 threads=20 inactivity-timeout=60 display-name=[wsgi-YOUR_APP_NAME]httpd
WSGIDaemonProcess tilestache processes=5 threads=20 inactivity-timeout=60 display-name=tilestache

WSGIProcessGroup tilestache

On redémarre Apache et hop :)

sudo service apache2 restart

Un des avantage de cette configuration est qu’on isole notre application wsgi (TileStache) dans un process distinct (cf la partie WSGIDaemonProcess de la configuration Apache).

Cadeau bonus, on peut redémarrer ce process sans impact sur Apache. Un simple touch /var/www/tiles/tiles.py suffit.

Répondre à cet article

Qui êtes-vous ?
Ajoutez votre commentaire ici
  • Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.