Seite 1 von 2

cgi/fastcgi auf uberspace

Verfasst: Samstag 15. Juni 2013, 11:26
von Herb
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.

Re: cgi/fastcgi auf uberspace

Verfasst: Samstag 15. Juni 2013, 14:14
von 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!

Re: cgi/fastcgi auf uberspace

Verfasst: Samstag 15. Juni 2013, 17:16
von Herb
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

Re: cgi/fastcgi auf uberspace

Verfasst: Samstag 15. Juni 2013, 17:40
von 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

Re: cgi/fastcgi auf uberspace

Verfasst: Samstag 15. Juni 2013, 18:26
von Herb

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 ...

Re: cgi/fastcgi auf uberspace

Verfasst: Samstag 15. Juni 2013, 18:38
von 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.

Re: cgi/fastcgi auf uberspace

Verfasst: Samstag 15. Juni 2013, 19:01
von Herb
@BlackJack: Danke :) jetzt klappt es!

Re: cgi/fastcgi auf uberspace

Verfasst: Donnerstag 20. Juni 2013, 20:03
von Herb
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 ?

Re: cgi/fastcgi auf uberspace

Verfasst: Freitag 21. Juni 2013, 07:01
von 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.

Re: cgi/fastcgi auf uberspace

Verfasst: Samstag 22. Juni 2013, 14:28
von Herb
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

Re: cgi/fastcgi auf uberspace

Verfasst: Samstag 22. Juni 2013, 14:56
von 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.

Re: cgi/fastcgi auf uberspace

Verfasst: Dienstag 25. Juni 2013, 19:47
von Herb
Wie kriege ich denn raus was die für ein Modul nutzen?

Re: cgi/fastcgi auf uberspace

Verfasst: Dienstag 25. Juni 2013, 20:27
von BlackJack
@Herb: Laut http://uberspace.de/dokuwiki/webserver:fastcgi#nutzung ist die Frage ob du auf dem Rechner Helium bist oder nicht. :-)

Re: cgi/fastcgi auf uberspace

Verfasst: Mittwoch 26. Juni 2013, 19:59
von Herb
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.

Re: cgi/fastcgi auf uberspace

Verfasst: Mittwoch 26. Juni 2013, 21:20
von 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.

Re: cgi/fastcgi auf uberspace

Verfasst: Sonntag 30. Juni 2013, 12:03
von apollo13
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.

Re: cgi/fastcgi auf uberspace

Verfasst: Sonntag 30. Juni 2013, 12:33
von 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.

Re: cgi/fastcgi auf uberspace

Verfasst: Sonntag 30. Juni 2013, 12:38
von apollo13
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…

Re: cgi/fastcgi auf uberspace

Verfasst: Sonntag 30. Juni 2013, 12:44
von 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‽

Re: cgi/fastcgi auf uberspace

Verfasst: Sonntag 30. Juni 2013, 12:50
von apollo13
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.