Python @ LRZ shared Webhosting

Python-Umgebung

Auf den LRZ-Webservern steht Stand 30.09.2016 Python2.6 zur Verfügung.

Eigenes Python3 installieren

Dieser Schritt ist nicht unbedingt erforderlich. /pfad/zum/eigenen/home-directory und ggf. Python-Version ersetzen.

cd ~
mkdir py3 # hier soll mein lokales Python hin
wget https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tgz
tar -xf Python-3.4.4.tgz
cd Python-3.4.4.tgz
./configure –prefix=/pfad/zum/eigenen/home-directory/py3 –exec-prefix=/pfad/zum/eigenen/home-directory/py3
make test # muss wohl nicht sein
make install
export PATH=/pfad/zum/eigenen/home-directory/py3/bin:$PATH # rückgängig mit export PATH=${PATH#/nfs/web_lmu/www/r/di25wur/py3/bin:}

Gibt man nun python3 ein, sollte der Python-Interpreter erscheinen, verlassen mit quit()
Möchte man virtuelle Umgebungen wie unten beschrieben unter Python3 installieren, so ruft man virtualenv mit Python3 auf, z. B.
python3 virtualenv-13.1.2/virtualenv.py env_py3
Nun kann man auch pip3 benutzen.

Virtuelle Python-Umgebungen (virtualenv, venv)

Üblicherweise werden Webapplikationen in virtuellen Python-Umgebungen (virtual environments) installiert, wo Python-Pakete ohne Administratorrechte installiert werden können. Während Python3 die Lösung venv mitbringt, wird unter Python2 (möglich auch unter 3) virtualenv eingesetzt.

virtualenv installieren, im Folgenden wird davon ausgegangen, daß virtualenv-13.1.2 im Home-Verzeichnis installiert wurde, ggf. Pfad und Version anpassen

virtualenv erstellen, aktivieren und deaktivieren

Eine virtualenv namens env (arbeitet man mit mehreren virtualenv empfiehlt sich ein aussagekräftigerer Name, z. B. env_py2, env_py3django) erzeugen mit

cd ~
mkdir webapps; cd webapps # Verzeichnis für WebApps
~/virtualenv-13.1.2/virtualenv.py env

Eine virtualenv wird aktiviert mit

cd env # in das Verzeichnis der virtualenv wechseln
source bin/activate

Nun werden Module aus der virtualenv env verwendet (Ausnahmen).

Deaktiviert wird mit
deactivate

python packages mit pip installieren

Zwei pip Kommandos sollte man sich merken; pip search <Modul> sucht auf pypi nach dem package <Modul>, pip install <Modul> installiert <Modul>. Vor dem Installieren aktivieren wir die entsprechende virtualenv (s. oben).

Problem: Installation und Suche von Python-Modulen mit pip funktioniert nicht, da Zertifikat von pypi.python.org nicht vorhanden (oder zumindest vom pip in der virtualenv nicht gefunden)

Lösung 1:

[http://stackoverflow.com/questions/25981703/pip-install-fails-with-connection-error-ssl-certificate-verify-failed-certi#27623172]

curl -s0 http://cacerts.digicert.com/DigiCertHighAssuranceEVRootCA.crt > DigiCertHighAssuranceEVRootCA.crt

openssl x509 -inform DES -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem # in PEM-Format konvertieren

export PIP_CERT=$(pwd)/DigiCertHighAssuranceEVRootCA.pem # Umgebungsvariable setzen, um Zertifikat pip verfügbar zu machen

Lösung 2:

Pip per cert-Option zeigen, wo das Zertifikat liegt

pip --cert ~/projects/certificate.pem search <MODUL>

Lösung 3:

Auf Zertifikatprüfung verzichen

pip --trusted-host pypi.python.org search <MODUL>

Mit diesen Vorbereitungen ist man gut gerüstet für das weitere Installieren und Testen von Python-WebApps.

CGI

Hinweis: Lt. Mitteilung des LRZ vom 14.3.2017 soll die Unterstützung für CGI-Skripte mittelfristig eingestellt werden.

Die einfachste Möglichkeit: Skripte die unter webserver/cgi-bin/ abgelegt sind, werden beim Eintreffen einer Anfrage an den Webserver ausgeführt.

helloworld.cgi

#!/usr/bin/python
# -*- coding: UTF-8 -*-
print("Content-Type: text/plain;charset=utf-8")
print()
print("Hello World!")

Die erste Zeile kann auch auf eine eigene Python-Umgebung verweisen, z. B.
#!/pfad/zum/eigenen/home-directory/env_py3/bin/python

Ruft man nun im Webbrowser die URL mein.lrz.webserver/cgi-bin/helloworld.cgi auf, bekommt man eine Seite mit „Hello World!“ angezeigt.

Weiteres s. https://docs.python.org/3/howto/webservers.html#common-gateway-interface

FastCGI

Voraussetzung von LRZ-Seite: Apache-Modul mod_fcgid installiert

Python-Programm starten

Prinzipiell muß der Apache-Server beim Eintreffen einer Anfrage ein Python-Skript starten und dessen Ausgabe übernehmen und an den anfragenden Client (Webbrowser) ausliefern. Während bei CGI tatsächlich Python und Skript gestartet werden, werden bei FastCGI die Informationen mit einem laufenden Python-Programm ausgetauscht, was in kürzeren Antwortzeiten resultiert.

Webframework Django

Läuft (selbst getestet mit Python2, virtualenv, flup, Django 1.4), aber fastCGI ab Django 1.7 deprecated, ab 1.9 removed.

Webframework Pyramid

Die gezeigte Testapplikation wurde nach dem Pyramid-Tutorial erstellt. Es lohnt sich auch, Requirements zu lesen, allerdings wird im folgenden mit Python2 gearbeitet, da ich vermute, daß man bei Anbindung über FastCGI das vom LRZ gestellte Python (s. Python-Umgebung) verwenden muß. Korrekturen besonders an dieser Stelle sehr willkommen.

Python3

Nach Pyramid-Tutorial/Requirements, s. Kommentar oben.

cd ~
mkdir -p projects/quick_tutorial
cd projects/quick_tutorial
export VENV=~/projects/quick_tutorial/env # wahrscheinlich unnötig, da wir statt Python3s venv virtualenv verwenden
python3 ~/virtualenv-13.1.2/virtualenv.py --no-site-packages env
source bin/activate
pip install --upgrade pip setuptools
pip install pyramid==1.7

Die Pyramid-Application erstellen lt. Pyramid-Tutorial/Scaffolds, Schnellstart mit Vorlagen

Die Pyramid-Application ließ sich in einer zweiten Konsole anschauen per

lynx localhost:6543

Lokal läuft es also. Anbindung per fastCGI offen, s. Kommentar oben

Python2

Virtualenv erstellen & Pyramid und flup installieren

Falls noch nicht geschehen wie oben beschrieben Umgebungsvariable setzen, um Zertifikat pip verfügbar zu machen .

cd ~/webapps
~/virtualenv-13.1.2/virtualenv.py env_py2pyr1
cd env_py2pyr
source bin/activate
pip install --upgrade pip setuptools
pip install pyramid==1.7
pip install flup

Die Schnellstart-WebApp erstellen und per fastCGI anbinden

Pyramid-Tutorial/Scaffolds, Schnellstart-WebApp erstellen

cd ~/webapps
pcreate --scaffold starter Schnellstart
cd Schnellstart
pip install -e .

Lokaler Test

fastCGI-Anbindung nach http://python.vexedlogic.com/2012/05/01/running-pyramid-web-framework-with-fastcgi/

Modifikationen

  1. dispatch.fcgi Schnellstart.fcgi genannt, custom python paths hinzugefügt (s. Kommentar), Pfade angepaßt

  2. in .htaccess (backup: htaccess_pyramid) noch eine Zeile Options +ExecCGI eingefügt, sonst kann Script nicht ausgeführt werden trotz gesetzer Rechte

Im Document-Root ~/webserver/htdocs die folgenden 2 Dateien erstellen.

Schnellstart.fcgi (/pfad/zum/eigenen/home-directory ersetzen)

#!/pfad/zum/eigenen/home-direcory/webapps/env_py2pyr/bin/python
import sys

# Add custom Python paths
sys.path.insert(0, "/pfad/zum/eigenen/home-direcory/webapps/env_py2pyr/lib/python2.6/site-packages")
sys.path.insert(0, "/pfad/zum/eigenen/home-direcory/webapps/Schnellstart")
sys.path.insert(0, "/pfad/zum/eigenen/home-direcory/webapps")

from paste.deploy import loadapp
from flup.server.fcgi_fork import WSGIServer

app = loadapp('config:/pfad/zum/eigenen/home-direcory/webapps/Schnellstart/production.ini') # config:/path/to/your/production.ini
server = WSGIServer(app)
server.run()

Ausführungsrechte für Schnellstart.fcgi setzen nicht vergessen:

cd ~/webserver/htdocs # document root
chmod 0755 Schnellstart.fcgi

htaccess_Schnellstart

AddHandler fcgid-script .fcgi
Options +ExecCGI
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ Schnellstart.fcgi/$1 [QSA,L]

.htaccess erstellen (kann jederzeit überschrieben werden, da htaccess_Schnellstart als backup dient)

cp htaccess_Schnellstart .htaccess

Die .htaccess weist den Apache-Webserver an, das fastCGI-Skript Schnellstart.fcgi (Python-Code) aufzurufen und die Parameter zu übergeben. Nun sollte die Pyramid-Webapplikation Schnellstart unter der vom LRZ angegebenen URL im Browser aufrufbar sein. Fehler-Logs können unter https://www.lrz.de/services/netzdienste/webhosting/webserver-logs abgerufen werden.



Autor:

Dies ist keine Anleitung des LRZ. Vielen Dank an das LRZ-Webhosting-Team für die Unterstützung.



1 # virtualenv erzeugen, diese nutzt aber scheinbar doch nicht das vom LRZ bereitgestellte python: ls -l env_py2pyr/bin/

Python WebApps @ LRZ 30.09.2016