Appuyez sur Entrée pour voir vos résultats ou Echap pour annuler.

Python 3.4, Pyramid 1.5 et mod_wsgi sur Alwaysdata

Voulant utiliser Pyramid 1.5 sur un serveur Alwaysdata avec Python 3.4 n’est pas chose aisée :

  • la version de Python 3 minimum pour Pyramid est la 3.2 et celle installée sur les serveurs est 3.1
  • Si vous sélectionnez WSGI dans les sites, le mod_wsgi  par défaut est compilé pour Python 2.6 et ne fonctionnera donc pas pour Pyramid. Snif.

Voici comment faire pour réussir à tout installer et faire fonctionner du premier coup.

Étape 1 : Compiler et installer Python 3.4

Commençons par créer les dossiers dont nous aurons besoin pour notre futur Python:

~$ mkdir python/src
~$ mkdir python/python34

Télécharger et extraire Python 3.4.1 :

~$ cd python/src
~/python/src$ wget https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tgz
~/python/src$ tar xvzf Python-3.4.1.tgz
~/python/src$ cd Python-3.4.1

Il va ensuite falloir compiler et installer Python 3.4. Attention, ici les options de ./configure  sont toutes très importantes: –enable-shared  pour la future compilation de mod_wsgi et LDFLAGS  avec le bon -rpath  pour que Python3 fonctionne (cf source #2 en fin d’article) :

~/python/src/Python-3.4.1$ ./configure --prefix="/home/achedeuzot/python/python34" --enable-shared LDFLAGS="-Wl,-rpath /home/achedeuzot/python/python34/lib"
~/python/src/Python-3.4.1$ make
~/python/src/Python-3.4.1$ make install

N’oublions pas d’ajouter ce nouveau python à notre PATH  de shell via son fichier de configuration (.zshrc, .bash_profile, …):

# Custom Python 3 Build - syntaxe zsh
export PATH="$HOME/python/python34/bin:$PATH"

Puis de faire prendre ce changement en compte par le shell:

~$ source ~/.zshrc
~$ which python3 #pour vérifier
~/python/python34/bin/python3

 Étape 2 : Compiler et installer mod_wsgi

Créons de nouveau les dossiers dont nous aurons besoin:

~$ mkdir ~/python/mod_wsgi_py34/src
~$ cd ~/python/mod_wsgi_py34/src

Télecharger et extraire mod_wsgi:

~/python/mod_wsgi_py34/src$ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.2.6.tar.gz
~/python/mod_wsgi_py34/src$ tar xvzf 4.2.6.tar.gz
~/python/mod_wsgi_py34/src$ cd mod_wsgi-4.2.6

Enfin, pour que mod_wsgi trouve notre librarie Python, nous devons rajouter la variable d’environnement LD_RUN_PATH  avant la compilation:

~/python/mod_wsgi_py34/src/mod_wsgi-4.2.6$ export LD_RUN_PATH=/home/achedeuzot/python/python34/lib
~/python/mod_wsgi_py34/src/mod_wsgi-4.2.6$ ./configure --with-python="/home/achedeuzot/python/python34/bin/python3.4"
~/python/mod_wsgi_py34/src/mod_wsgi-4.2.6$ ./make

Ceci va créer le fichier mod_wsgi.so  dans un dossier caché .libs (il faut le trouver !):

~$ find . -name "mod_wsgi.so"
./python/mod_wsgi_py34/src/mod_wsgi-4.2.6/src/server/.libs/mod_wsgi.so

Ce fichier va être utilisé par Apache. Mais pour éviter d’avoir un chemin aussi long, nous allons copier ce fichier un peu plus haut dans l’arborescence:

~$ cp ~/python/mod_wsgi_py34/src/mod_wsgi-4.2.6/src/server/.libs/mod_wsgi.so ~/python/mod_wsgi_py34/

Ensuite, il faut dire à Apache d’utiliser notre module. Il faut pour cela se rendre dans l’interface d’administration de Alwaysdata, dans la section Sites et choisir « Apache personnalisé » et enfin, entrer les informations suivantes:

# Directives globales:
LoadModule wsgi_module /home/achedeuzot/python/mod_wsgi_py34/mod_wsgi.so
WSGISocketPrefix run/wsgi
WSGIDaemonProcess <un-id-unique>

 Étape 3 : Installer Pyramid 1.5 et faire tourner le tout !

Commençons par préparer l’environnement pour notre projet Pyramid:

~$ mkdir ~/mysite
~$ cd ~/mysite
~/mysite$ pyvenv venv
~/mysite$ cd venv

Avant de continuer, il est important d’activer notre environnement virtuel:

~/mysite/venv$ source bin/activate
(venv)~/mysite/venv$ pip install pyramid

Générons ensuite un scaffold et installons notre projet:

(venv)~/mysite/venv/$ pcreate -s starter siteproject
(venv)~/mysite/venv/$ python setup.py develop

Bientôt fini, faisons notre app.wsgi  :

#!/home/achedeuzot/mysite/venv/bin/python
import os
import sys

pyramid_path = '/home/achedeuzot/mysite/venv/lib/python3.4/site-packages'
project_path = os.path.dirname(os.path.abspath(__file__))

sys.path.append(pyramid_path)
sys.path.append(project_path)

from pyramid.paster import get_app, setup_logging
# required for imports and path to packages
ini_path = '/home/achedeuzot/mysite/venv/siteproject/production.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')

Et enfin, faisons pointer notre VirtualHost Apache sur ce fichier, via l’interface d’administration AlwaysData, toujours dans la section Sites:

# Directives du virtual host
WSGIScriptAlias / "/home/achedeuzot/mysite/venv/siteproject/app.wsgi"
<Location />
WSGIProcessGroup <un-id-unique>
</Location>

Et voilà ! La page par défaut de pyramid devrait s’afficher:

Page d'accueil par défaut de Pyramid 1.5.1

Cette technique devrait rester valide pour diverses version de Python, Pyramid ou de mod_wsgi. J’espère qu’il vous aura permis de faire fonctionner le framework de votre choix !

Sources et Inspirations:

  1. http://www.flask-blog.jeremydagorn.com/posts/how_to_deploy_a_flask_application_on_alwaysdata
  2. http://koansys.com/tech/building-python-with-enable-shared-in-non-standard-location
  3. http://oldwiki.alwaysdata.com/wiki/D%C3%A9ployer_une_application_Python_3_%2B_bottle.py_avec_mod_wsgi
  4. https://code.google.com/p/modwsgi/wiki/InstallationIssues