django: fastCGI Probleme...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 19. September 2007, 13:36

Hm. Stehe irgendwie auf dem Schlauch... Ich bekomme django nicht mit fastCGI zum laufen :(

Leider habe ich keinen Zugriff auf die Apache Log-Dateien :(

Das kleine Test-Skript aus dem Wiki läuft einwandfrei: [wiki]Web-Skripte zum Laufen bringen#EinKleinerFastcgiTest[/wiki]

Wenn man es selber macht, sieht es ja so aus (der dispatcher):

Code: Alles auswählen

from flup.server.fcgi import WSGIServer

from fastCGI_test_app import app

WSGIServer(app).run()
Es es möglich django als "app" zu bekommen? Dann könnte ich das damit mal probieren. Auf jeden Fall geht's wie auf http://www.djangoproject.com/documentat ... ith-apache beschrieben nicht.
Auch lokal funktioniert das ganze nicht. In der Log sehe ich allerdings auch nur sowas:
[Wed Sep 19 14:31:48 2007] [notice] mod_fcgid: server /home/jens/workspace/PyLucid0.8(django)/index.fcgi(9358) started
[Wed Sep 19 14:31:49 2007] [notice] mod_fcgid: server /home/jens/workspace/PyLucid0.8(django)/index.fcgi(9359) started
[Wed Sep 19 14:31:49 2007] [notice] mod_fcgid: process /home/jens/workspace/PyLucid0.8(django)/index.fcgi(9358) exit(server exited), terminated by calling exit(), return code: 255
[Wed Sep 19 14:31:49 2007] [notice] mod_fcgid: process /home/jens/workspace/PyLucid0.8(django)/index.fcgi(9356) exit(server exited), terminated by calling exit(), return code: 255
[Wed Sep 19 14:31:55 2007] [notice] mod_fcgid: process /home/jens/workspace/PyLucid0.8(django)/index.fcgi(9359) exit(server exited), terminated by calling exit(), return code: 255

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 19. September 2007, 16:42

Also bei mir funktioniert der Django-Code mit Lightys FastCGI. Welches FastCGI Modul nutzt du denn?

Eine WSGI-App bekommst du eigentlich ganz einfach mit ``django.core.handlers.wsgi.WSGIHandler()``.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 19. September 2007, 17:33

Anscheinend ist es der neuere "fcgid"...

Also du meinst das so:

Code: Alles auswählen

import os
os.environ['DJANGO_SETTINGS_MODULE'] = "PyLucid.settings"

from flup.server.fcgi import WSGIServer
from django.core.handlers.wsgi import WSGIHandler

app = WSGIHandler() # Evtl. ohne die Klammern?

WSGIServer(app).run()

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 19. September 2007, 20:36

Das stimmt so, also mit den Klammern.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 20. September 2007, 10:00

Aha! Das bringt mich ein Stückchen weiter! Denn so geht's...

Nun funktioniert es auch... Ich hab mir mal was gebastelt:

Code: Alles auswählen

#!/usr/bin/python

import os

from django.core.handlers.wsgi import WSGIHandler
from django.core.servers.fastcgi import runfastcgi

os.environ['DJANGO_SETTINGS_MODULE'] = "PyLucid.settings"

def tb_catch_app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    yield '<h1>FastCGI Traceback catch:</h1>'

    global msg
    yield "<pre>"
    yield msg
    yield "</pre>"

try:
    runfastcgi(method="threaded", daemonize="false")
except Exception, err1:
    import traceback
    msg = traceback.format_exc()
    
    from flup.server.fcgi import WSGIServer
    WSGIServer(tb_catch_app).run()
else:
    msg = "Error: Nothings happends?!?!"
    from flup.server.fcgi import WSGIServer
    WSGIServer(tb_catch_app).run()
Ich denke das sollte irgendwie auch eleganter gehen, oder???

Zum eigentlichen Problem: Anscheinend waren meine benutzten Parameter für runfastcgi() falsch. Das verhinderte wohl eine Ausführung.
Ich hatte wohl statt den Parameter method="threaded" das angegeben: socket="fcgi.sock"

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 21. September 2007, 14:11

OK, also beim GPcom geht's nun mit fastCGI...

Nun probiere ich es bei unserm PyHosting... Dort sehe ich in den log's das:
[Fri Sep 21 13:06:32 2007] [error] [client 88.76.139.87] FastCGI: comm with (dynamic) server "./index.fcgi" aborted: (first read) idle timeout (50 sec)
[Fri Sep 21 13:06:32 2007] [error] [client 88.76.139.87] FastCGI: incomplete headers (0 bytes) received from server "./index.fcgi"
Komisch. Ist eigentlich das selbe Skript...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 21. September 2007, 19:40

jens hat geschrieben:Nun probiere ich es bei unserm PyHosting... [...] Komisch. Ist eigentlich das selbe Skript...
xorAxAx gefragt?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
ahouben
User
Beiträge: 1
Registriert: Samstag 22. September 2007, 21:18

Samstag 22. September 2007, 21:22

Das ist dann meistens ein Problem mit der Umformatierung beim Hochladen auf den Server. Set transfer mode to binary, then upload again.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 9. Oktober 2007, 07:23

Ne, also es lag wohl an den Dateirechten. suexec ist da wohl etwas penibel. In meinem Fall hatte die Gruppe Schreibrechte und das mag suexec nicht.

Aber jetzt siehts dennoch komisch aus! Also bei dem Skript von oben: http://www.python-forum.de/post-77936.html#77936
tritt doch tatsächlich der Fall ein das "Error: Nothings happends?!?!" ausgegeben wird! Das sollte ja IMHO nie auftreten...

Jetzt wo ich mir mal http://code.djangoproject.com/browser/d ... fastcgi.py angesehen habe, könnte es ja sein, das etwas auf stderr geschrieben wurde... Das könnte ich ja mal versuchen abzufangen...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 15. Februar 2008, 16:29

Hab mich heute nochmal dem Thema django + fastCGI angenommen...

Ich hab was dolles gefunden und zwar in /django/core/servers/fastcgi.py :

Code: Alles auswählen

wsgi_opts['debug'] = False # Turn off flup tracebacks
http://code.djangoproject.com/browser/d ... =6075#L121

Warum nur ist das Hardcoded? Ich suche schon seid einiger Zeit eine Möglichkeit für einen solchen "Low-Level"-Debug Modus. Dabei exstiert der schon so einfach, ist aber immer abgeschaltet :(

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 15. Februar 2008, 16:34

jens hat geschrieben:Warum nur ist das Hardcoded?
Weil Django eine eigene Traceback-Middleware hat die etwas gegen das Leaken von Informationen abgesichert ist. Wie zum Beispiel Datenbankpasswörter.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 15. Februar 2008, 16:40

Ja, das stimmt. Allerdings ist es so: Wenn du einen Fehler in einer Middleware hast, dann funktioniert der django traceback überhaupt nicht!

Geh mal hin und setzte eine FastCGI App mit SQLite auf. Dann entziehst du der SQLite Datei die Schreibrechte. Wenn nun die Session Middleware versucht die Session zu schreiben, dann Peng.
Vom normalen Traceback sieht man nix. Nur in der Apache Log schneien Fehlermeldungen über stderr rein.

Im Browser sieht man nur was von "FastCGI Unhandled Exception"...

Wenn man aber den flup tracebacks aktiviert, dann sieht man auch einen Traceback im Browser...

Wenn man also keinen Zugriff auf die Apache Log hat, schaut man normalerweise in die Röhre...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 15. Februar 2008, 16:46

jens hat geschrieben:Ja, das stimmt. Allerdings ist es so: Wenn du einen Fehler in einer Middleware hast, dann funktioniert der django traceback überhaupt nicht!
Ja, mag ja sein.
jens hat geschrieben:Vom normalen Traceback sieht man nix. Nur in der Apache Log schneien Fehlermeldungen über stderr rein.

Im Browser sieht man nur was von "FastCGI Unhandled Exception"...
Naja, findest du es besser die Datenbankpasswörter zu leaken, damit der User sich selbst einloggen kann und sich die Daten selbst aus der Datenbank holt?
jens hat geschrieben:Wenn man also keinen Zugriff auf die Apache Log hat, schaut man normalerweise in die Röhre...
Das ist an sich auch nicht verkehrt, denn error.log ist genau der Ort wo so etwas hin soll. Wenn man keinen Zugriff darauf hat, dann hat man ein generelles Problem und nicht angezeigte Tracebacks sind noch das geringste.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 15. Februar 2008, 16:48

Ich sagt ja nicht, das der flup traceback generell an geschaltet werden sollte. Aber es sollte so sein, das man in einschalten kann, ohne an django rumfummeln zu müssen.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 15. Februar 2008, 17:02

Kannst ja einen Patch schreiben. Viel Glück.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten