Python @ LRZ shared Webhosting
Auf den LRZ-Webservern steht Stand
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.
Ü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
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 mitdeactivate
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:
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.
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
Voraussetzung von LRZ-Seite: Apache-Modul mod_fcgid installiert
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.
Läuft (selbst getestet mit Python2, virtualenv, flup, Django 1.4), aber fastCGI ab Django 1.7 deprecated, ab 1.9 removed.
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.
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
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
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
dispatch.fcgi Schnellstart.fcgi genannt, custom python paths hinzugefügt (s. Kommentar), Pfade angepaßt
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