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
:
- Why are you using embedded mode of mod_wsgi ?
- Processes And Threading
- Making Apache suck less for hosting Python web applications
- Web Server Bottlenecks And Performance Tuning
- WSGI, une technique pour des applications Web en Python
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.