cgi/fastcgi auf uberspace

Django, Flask, Bottle, WSGI, CGI…
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Hallo,

bin gerade dabei mich in der aufregende Welt der Webprogrammierung mit Python ein zu arbeiten. Als erstes wollte ich ein kleines Minibackend realisieren welches in eine json Datei schreib. Lokal, auf meinem Rechner, klappt das auch alles super (habe mit BaseHTTTPServer einen kleinen Server laufen und stelle ein cgi script bereit welches mir übergebenen Parameter in die Datei schreib). Die Frage ist nun, wie kriege ich das in dieses "Internet" :D

Nach etwas Suche bin ich auf uberspace.de gestoßen. Ein Hoster der python kann und den man auch ganz unverbindlich testen kann :)

Nun stehe ich aber aber vor einer Art Verständnisproblem :K und hoffe hier hat jemand Erfahrung mit uberspace.

Was ich wissen wollte :

- da bei einem Hoster der Server schon läuft brauche ich den ja nicht selbst schreiben (so wie lokal bei mir), oder ?
- wie rufe ich mein cgi file auf? Wenn ich es im Browser aufrufen will kriege ich nur "The requested URL /cgi-bin/test.py was not found on this server." zurück. Da mache ich doch etwas falsch? :)

Ich weiß, das sind jetzt wirklich absolute Anfängerfragen aber vielleicht kann mir ja hier jemand helfen.
BlackJack

@Herb: Bei uberspace.de hat man einen Apache-Webserver, den man auch nutzen sollte. Da braucht man grundsätzlich erst einmal keine eigenen Webserver laufen lassen.

Die Fehlermeldung vom Server kann verschiedene Gründe haben. Dein Skript heisst vielleicht nicht ``test.py``. Oder es liegt nicht im richtigen Verzeichnis. Das muss das ``cgi-bin/``-Verzeichnis in Deinem Heimatverzeichnis auf dem Uberspace-Server sein, und *nicht* ein Unterverzeichnis mit diesem Namen das Du selbst im ``html/``-Verzeichnis angelegt hast!
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Danke für die schnelle Antwort :)

Sorry, da hatte wohl den falschen Error kopiert. Ich kriege beim Aufruf 'The server encountered an internal error or misconfiguration and was unable to complete your request.' zurück. Das einzige was ich konfiguriert habe sind die Ausführungsrechte per 'chmod 0755 test.py' - so wird es von uberspace verlangt. :K
BlackJack

@Herb: Dann enthält Dein Skript wahrscheinlich einen Fehler. Dazu schaust Du ins Fehlerprotokoll des Webservers. Was standardmässig anscheinend nicht aktiviert ist, laut: https://uberspace.de/dokuwiki/webserver:error_log
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Code: Alles auswählen

#!/usr/bin/env python

print "Content-Type: text/html"
print "<h1>just a test</h1>"
für Fehler ist das Script fast zu simpel ...
BlackJack

@Herb: Aber auch nur fast. ;-) Header und Daten müssen durch eine Leerzeile getrennt werden. Also einfach ein ``print`` zwischen die beiden setzen und dann sollte es laufen.
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

@BlackJack: Danke :) jetzt klappt es!
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Ich muss leider das Thread jetzt noch einmal mit einer Anfängerfrage aufwärmen.

Fleißig am cgi-skripten stieß ich immer wieder auf Aussagen wie "CGI nutzt man seit Jahren nicht mehr", "CGI ist zu langsam" usw.

Natürlich will ich jetzt nicht auf ein totes Pferd setzen. Für mich sah CGI in Python sehr wie PHP aus, soll heißen : ein Skript wird beim Aufruf vom jeweiligen Interpreter ausgeführt (eventuell bekommt es noch ein paar Daten übergeben) und legt sich dann wieder "schlafen".

Warum soll CGI jetzt nicht gut sein ?

oder anders gefragt:

Was ist nun "best practice" wenn es darum geht mit Python dynamische Webseiten zu erstellen ?
BlackJack

@Herb: CGI lädt halt bei jeder Anfrage das Skript und den Interpreter der das dann ausführt neu und das ganze Skript läuft immer komplett durch, also in der regel bei dynamischen Webseiten inklusive aller Importe, Verbindungsaufbau zur Datenbank, Laden von allgemeinen Daten und erstellen von allgemeinen Objekten die Grundsätzlich bei jedem Abruf einer Seite benötigt werden, und so weiter. Da wird ziemlich viel Arbeit für jede Abfrage erneut erledigt, die eigentlich nur einmal gemacht werden müsste, wenn das Skript sich nicht nach jeder Abfrage wieder beendet wäre.

Allgemein gibt es dafür dann FastCGI und bei Python wurde WSGI als API entworfen. Uberspace bietet keine WSGI-Unterstützung im Apache (Gründe stehen irgendwo bei denen im Wiki) aber FastCGI. Und es gibt zum Beispiel das `flup`-Modul was FastCGI benutzt um die WSGI-API zur Verfügung zu stellen.

WSGI direkt verwendet kaum jemand, sondern meistens setzt man ein Webrahmenwerk ein. Entweder etwas „grosses“, wie Django, oder eines der Mikrorahmenwerke, wie Bottle oder Flask. Alle drei Projekte haben ein Tutorial auf der jeweiligen Projektwebseite. Schau Dir das einfach mal an.
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Danke für die Erklärung :)

Wollte mir das gerade mal ansehen aber kriege es irgendwie nicht zum laufen. Habe zuerst das flup-modul installiert und dann das Beispiel aus das Python Doku in den fcgi-bin gepackt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from cgi import escape
import sys, os
from flup.server.fcgi import WSGIServer

def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])

    yield '<h1>FastCGI Environment</h1>'
    yield '<table>'
    for k, v in sorted(environ.items()):
         yield '<tr><th>%s</th><td>%s</td></tr>' % (escape(k), escape(v))
    yield '</table>'

WSGIServer(app).run()
nur leider rührt sich nichts beim Aufruf. Lokal wird mir einfach der Inhalt, also der Quelltext, des Skripts angezeigt und der Webserver Antwortet mir mit 500 - Internal Error
BlackJack

@Herb: Ich würde zum entwickeln empfehlen das lokal mit dem gleichen FastCGI-Modul für den Apache zum laufen zu bekommen, der auch auf Deinem Uberspace eingesetzt wird. Uberspace scheint da je nach Server zwei verschiedene einzusetzen. Für das FastCGI-Modul des Apache musst Du dann eine Konfigurationsdatei schreiben, die dem Webserver/FastCGI-Modul sagt wo Deine FastCGI-Anwendung zu finden ist.

Edit: Du könntest das Skript auch mal auf der Kommandozeile ausführen. Da siehst Du dann höchstwahrscheinlich eine Ausnahme weil nicht alle Werte aus dem Wörterbuch Zeichenketten sind auf die man einfach so `cgi.escape()` anwenden kann. `wgsi.input` und `wsgi.error` sind Dateiobjekte.
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Wie kriege ich denn raus was die für ein Modul nutzen?
BlackJack

@Herb: Laut http://uberspace.de/dokuwiki/webserver:fastcgi#nutzung ist die Frage ob du auf dem Rechner Helium bist oder nicht. :-)
Herb
User
Beiträge: 15
Registriert: Donnerstag 13. Juni 2013, 20:47

Kein Helium, folglich das mod_fcgid-Modul, in der standart fcgi-bin/

Aber fangen wir mal von vorne an. Was müsste ich lokal bei mir installieren um die uberspace Umgebung nach zu ahmen ?

PS: das Thema Webentwicklung mit Python ist ja relativ umfangreich. Gibts dazu irgendwelche Literator/Videotraining oder Vergleichbares? Auf Amazon hab ich etwas in Verbindung mit Webframewirks gefunden. Allerdings möchte ich erst einmal verstehen was da passiert bevor ich blind irgendwelche Frameworks nutze.
BlackJack

@Herb: Apache2 und das mod_fcgid-Modul dafür. Dann vielleicht noch das suexec-Modul für den Apache2. Dann müsstest Du Dich ein wenig damit beschäftigen wie das mit der Konfiguration von Apache2 funktioniert. Das hat im Grunde alles noch nichts mit Webentwicklung mit *Python* zu tun.

Die Frage Framework oder nicht, speziell für Anfänger, hatten wir hier schon öfter und die Mehrheitsmeinung scheint zu sein: Ja. Und zwar ein komplettes wie Django, damit der Anfänger sich eben *nicht* mit den ganzen Sachen beschäftigen muss, die er sowieso falsch machen wird. Und Entscheidungen treffen muss, die er mit dem Kenntnisstand nicht vernünftig treffen kann. Ein Vergleich in dem Zusammenhang ist, ob man wenn man ein Anwendungsprogramm schreibt, ein fertiges Betriebssystem verwendet, oder sich das auch gleich noch dazu schreiben sollte. Als Anfänger.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

FWIW ich würde soweit weg von FCGI gehen wie möglich, ich werde das ganze wohl beginnend mit Django 1.7 deprecaten und dann spätestens in 1.9 entfernen.
BlackJack

@apollo13: Warum? Das ist das einzige was Uberspace anbietet und die Gründe sind IMHO einleuchtend. Man kann nur eine Python-Version gleichzeitig unterstützen und mit FastCGI hat man im Grunde den gleichen Effekt nur sprachunabhängig.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Das letzte Flup Release ist aus 2011, Python-Standard für Webapps ist WSGI; wenn jemand unbedingt FCGI will, kann er sich selbst einen Wrapper rundherum schreiben, es gibt keinen Grund warum das in Django sein sollte.

EDIT:// Abgesehen davon ist die Kombo suexec+fcgi ein horror; damit das ordentlich geht darf man dann erstmal suexec source code hacken gehen…
BlackJack

@apollo13: Hat sich denn an den Standards FastCGI und WSGI zwischen denen Flup eine Brücke schlägt seit 2011 etwas verändert? Solange die sich nicht verändern braucht man doch auch kein neues Flup-Release, oder‽
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Ich würde dir zustimmen, wenn es eine Homepage geben würde wo man Fehler melden könnte etc… So schaut das Projekt ziemlich tot aus; und wie bereits gesagt ich sehe keinen Grund warum Django fastcgi nativ supporten sollte -- WSGI muss reichen.

EDIT:// Flask hat zb auch keinen expliziten fcgi support, eg siehe: http://flask.pocoo.org/docs/deploying/fastcgi/ -- Anbindung an fcgi wie es zum Beispiel Django mit runfcgi macht ist wirklich nicht Aufgabe des Frameworks, das ist etwas was jemand wenn er will als 3rd party app entwickeln kann und das man dann sowohl für Flask als auch Django (etc…) verwenden kann.
Antworten