Python Hosting mit virtuellen Umgebungen und aktuellen Interpretern

Auf Servern mit älteren Linux Distributionen Python Web-Applikationen zu hosten, ist problematisch wenn der benötigte Python Interpreter nicht einfach und schnell über den Paketmanager installiert werden kann. Ein Weg ist dann die benötigte Python Version "zu Fuss" zu kompilieren und zu installieren. Eine häufige Anforderung ist auch, mehre Web-Applikationen auf einem Server zu hosten. Hierzu bietet sich der Einsatz von virtuellen Umgebungen an.

 

pyenv

Für diese Aufgabe bietet sich pyenv an, das auch gerne bei der Python Entwicklung verwendet wird, um zwischen unterschiedlichen Python Versionen und virtuellen Umgebungen umzuschalten. Bestandteil von pyenv sind mehrere Plugins, wobei pyenv-virtualenv die Kombination mit virtuellen Umgebungen ermöglicht.

Mit einem Kommando lässt sich eine Python Version:

user@host:/pyenv install 3.4.3

oder eine virtuelle Umgebung (mysite) für eine Python Version installieren:

user@host:/pyenv virtualenv 3.4.3 mysite

Das Kompilieren von Python übernimmt das Modul pyenv-build, das standardmässig immer mit installiert wird. pyenv-virtualenv ist ein Wrapper für das populäre virtualenv. Sinnvoll ist auch die Installation des Plugins pip-rehash für die Aktualisierung von Paketen via pip.

 

Installation pyenv

Bei pyenv und seinen Plugins handelt es sich um Shell Skripte, die direkt aus den Git Repositories installiert werden müssen. Die Installation in unserem Beispiel erfolgt auf einem Linux System in /usr/local und nicht im Home Verzeichnis eines Users, da wir die dort installierten Python Versionen systemweit benutzen möchten.

Wichtig ist daran zu denken, dass für das Kompieren von Python zusätzliche Pakete benötigt werden. Auch muss Git installiert sein, um die Repositories herunterzuladen.

Die Installation ist schnell erledigt:

user@host:/usr/local/$ git clone https://github.com/yyuu/pyenv.git

user@host:/usr/local/pyenv/plugins/$ git clone https://github.com/yyuu/pyenv-virtualenv.git

user@host:/usr/local/pyenv/plugins/$ git clone https://github.com/yyuu/pyenv-pip-rehash.git

Nun sollten noch die Funktionen für die jeweiligen User aktiviert werden. Dies geschieht über die enstprechenden Einträge in der .bash_profile (Debian: .bashrc) Datei des jeweiligen Users:

export PYENV_ROOT=/usr/local/pyenv
export export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Nun ist ein Neustart der Shell erforderlich:

user@host:/$ exec $SHELL

 

Installation Python 3.4.3

Die Installation von Python und der virtuellen Umgebung für das Beispielprojekt ist wie oben schon beschrieben in zwei Zeilen erledigt:

user@host:/pyenv install 3.4.3

user@host:/pyenv virtualenv 3.4.3 mysite

pyenv hat nun die neue Python Version und die virtuelle Umgebung unter /usr/local/pyenv/versions installiert.

 

Installation mod_wsgi

Das Apache Modul mod_wsgi von Graham Dumpleton ist nach wie vor die erste Wahl für ein produktives Deployment mit dem Apache Webserver. mod_wsgi unterstützt nur immer eine Python Version für die das Modul speziell kompiliert werden muss. Installiert man auf einer Linux Distribution das Modul aus den Paketquellen, entspricht dies in der Regel der Python Systemversion. Wir wollen aber die aktuelle Python Version 3.4.3 verwenden. Für das Kompilieren werden die Development-Header von Apache benötigt, die entsprechenden Pakete müssen installiert sein (Debian: apache2-dev).

Hierzu laden wir uns die aktuelle Version des Moduls herunter und kompilieren dieses für unsere Python Version 3.4.3:

user@host:/tmp/$ wget https://codeload.github.com/GrahamDumpleton/mod_wsgi/tar.gz/4.4.13

user@host:/tmp/$ tar -xvf 4.4.13

user@host:/tmp/$ cd 4.4.13

user@host:/tmp/4.4.13/$ ./configure --with-python=/usr/local/pyenv/versions/3.4.3/bin/python

user@host:/tmp/4.4.13/$ LD_RUN_PATH=/usr/local/pyenv/versions/3.4.3/lib

user@host:/tmp/4.4.13/$ make

user@host:/tmp/4.4.13/$ make install

Das Modul muss nun noch über die Apache Konfiguration geladen werden. Unter Debian landet das Modul dann unter  /usr/lib/apache2/modules/mod_wsgi.so. Debianspezifisch wird nun unter /etc/apache2/mods-available/ die Datei mod_wsgi.load angelegt und das Modul aktiviert:

user@host:/tmp/4.4.13/$ echo "LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so' >> /etc/apache2/mods-available/mod_wsgi.load

user@host:/tmp/4.4.13/$ a2enmod mod_wsgi

 

Apache Konfiguration

Wir legen nun ein Django Beispielprojekt unter /usr/local/www/mysite an um danach die Apache Konfiguration zu demonstieren:

user@host:/usr/local/www/$ pyenv activate mysite

user@host:/usr/local/www/$ pip install django

user@host:/usr/local/www/$  django-admin startproject mysite

Nun legen wir für unser Beispielprojekt (mysite) eine eine Apache Konfigurationdatei an. Wichtig ist darauf zu achten, dass die virtuelle Umgebung richtig konfiguriert wird. Möchte man im produktiven Einsatz den WSGI Daemon Modus nutzen, müssen bei der WSGIDaemonProcess Directive die Konfiguration der virtuellen Umgebung als Parameter mitgegeben werden.

WSGIScriptAlias /     /usr/local/www/mysite/mysite/wsgi.py
WSGIPythonPath /usr/local/www/mysite:/usr/local/pyenv/versions/mysite/lib/python3.4/site-packages

<VirtualHost *:80>
ServerName mysite
LogLevel debug

<Directory "/usr/local/www/mysite/mysite">
                   <Files wsgi.py>
                       Order deny,allow
                       Allow from all
                   </Files>
</Directory>

</VirtualHost>

 

Ausblick

In den letzten Monaten wurde mod_wsgi von Graham Dumpleton intensiv weiter entwickelt. Mittlerweile bietet Graham mit mod_wsgi-express eine standalone Python Hosting Lösung an, die er in seinem Blog als "Production capable by default" bezeichnet. Interessant wird diese Variante, wenn man neben dem mod_wsgi Paket auch das Companion Paket mod_wsgi-httpd mit pip installiert. mod_wsgi-httpd enthält den Source Code des aktuellen Apache Servers, der dann extra für die Verwendung mit mod_wsgi kompiliert und installiert wird. Diese Apache Installation erfolgt im Site-Packages Verzeichnis und interferiert damit nicht mit ewaigen über den Paketmanger der Linux Distribution installierten Apache Varianten. Mitgeliefert werde auch Skripte für die Installation eines HTTP-Daemons im Linux System. Ich werde mir diese Variante demnächst anschauen und den produktiven Einsatz versuchen.

Kommentare, Ergänzungen und Kritik ist herzlich willkommen. Nutzen Sie dafür bitte unser Kontaktformular.

Autor: Max Pfeiffer - Alp Phone GmbH