2012-06-21 11 views
9

Ist es möglich, die benutzerdefinierten Fehlerseiten von nginx zu deaktivieren - wenn ich sie so nennen darf -, um die Ausnahmeseiten meines Frameworks anzuzeigen?nginx + uwsgi + flask - Deaktivieren von benutzerdefinierten Fehlerseiten

ich nicht wirklich mein werkzeug Debugger-Tool generierte in html sehen ...

UPDATE

OK, ich habe eine sehr einfache Kolben-Anwendung machen zu arbeiten und ich Post die Bits:

/home/my_user/.virtualenvs/nginx-test/etc/nginx.conf

worker_processes 1; 
events { worker_connections 1024; } 
http { 
     server { 
       listen 5000; 
       server_name localhost; 
       access_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/access.log; 
       error_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/error.log; 

       location/{ 
         include uwsgi_params; 
         uwsgi_pass unix:/tmp/uwsgi.sock; 
       } 
     } 
} 

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def index(): 
    raise Exception() 

if __name__ == '__main__': 
    app.run('0.0.0.0', debug=True) 

PYTHONPATH Umgebungsvariable:

$ echo $PYTHONPATH 
/home/my_user/dev/ 

Wie ich laufen uwsgi:

$ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app 

Wie ich nginx laufen :

$ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/ 

Wenn ich die Root-Seite getroffen:

server error

Wenn ich nginx manuell ausführen, wie:

python /home/my_user/dev/nginx_test/___init___.py 

ich stattdessen sehen, und dem, was ich sehen will:

enter image description here

Natürlich habe ich sichergestellt, dass es funktionieren würde, wenn ich nicht die Ex erhöhe ception, aber gab 'Hallo Welt' zum Beispiel auf meine index() -Funktion zurück.

Dies wird benutzerdefinierte Fehlerseiten in .NET bezeichnet. Ich möchte dies deaktivieren und lassen Sie Nginx/uwsgi die HTML übergeben von dem Debugger direkt an den Browser statt der internen Server-Fehler.

UPDATE 2

Nun, wenn ich meinen Kolben-App von Debug-Modus zu aktivieren ändern:

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask 

app = Flask(__name__) 
app.config.update(DEBUG=True) 
@app.route('/') 
def index(): 
    raise Exception() 

if __name__ == '__main__': 
    app.run('0.0.0.0', debug=True) 

Dann bekomme ich 502 Fehler.

Aber wenn ich statt raise Ausnahme:

/home/my_user/dev/nginx_test/___ init___.py

from flask import Flask 

app = Flask(__name__) 
app.config.update(DEBUG=True) 
@app.route('/') 
def index(): 
    return 'Hello World' 

if __name__ == '__main__': 
    app.run('0.0.0.0', debug=True) 

ich 'Hallo Welt' in meinem Browser, wenn ich die Seite getroffen (http://localhost:5000).

+1

Wäre besser in der Frage anzugeben, auf welchen Fehlerseiten Sie Probleme haben, z. 502 – number5

+0

Vielen Dank für Ihren Vorschlag, ich habe eine ganze Menge neuer Informationen hinzugefügt, die hoffentlich helfen würden, das Problem herauszufinden. –

Antwort

1

Verwenden Sie Flask#errorhandler, um Ihre eigenen Fehlerhandler in Kolben zu registrieren. Zum Beispiel der 404 zu ersetzen, würden Sie so etwas wie tun:

app = Flask() 

@app.errorhandler(404) 
def handel_404(error): 
    return render_template('404.html') 
+0

Ich meinte, was ich wirklich brauche ist, wenn 'Exception()' in meinem Code erreicht wird, sehe ich den Debugger Debugger anstelle von Nginx 502 Bad Gateway Seite –

+2

Ah, wenn Sie ein 502 Bad Gateway bekommen, dann die Der Fehler besteht darin, dass Ihre App eine Chance zum Starten hat. Der Werkzeug-Debugger kann nur Fehler behandeln, die während einer Anfrage auftreten. Sie müssen Ihre uwsgi-Protokolle auf einen Stack-Trace überprüfen, um das Problem zu beheben. – Trevor

+1

Sie können auch ändern, wie die Seite aussieht, indem Sie in Ihrer nginx-Konfiguration die Anweisung error_page 502 = 503 /error_page.html; 'hinzufügen, aber das ist nur eine statische Seite. – Trevor

6

Diese „Internal Server Error“ Seite nicht von nginx ist aber von der Flasche. Es tut dies , wenn Debug-Modus deaktiviert ist.

uwsgi importiert Ihren Code als Modul und läuft nicht als Skript. __name__ == '__main__' ist False und die if-Anweisung wird nicht ausgeführt. Versuchen Sie, die Debug-Modus außerhalb des if:

app = Flask(__name__) 
app.debug = True 

Es ist jedoch stark zu empfohlen wird nie verlassen den Debug-Modus auf einem Server im öffentlichen Internet, da der Benutzer der Server beliebigen Code ausführen machen. Dies ist ein ernstes Sicherheitsproblem.

+0

Ich dachte, das war was: app.config.update (DEBUG = True) tat - derzeit aus dem if ... aber ich werde es versuchen, indem ich einfach app.bug = True setze und Ihnen die Ergebnisse mitteilen . –

+0

app.debug = True sollte dasselbe wie app.config.update sein (DEBUG = True) ([1] (https://github.com/mitsuhoho/flask/blob/0.9/flask/app.py#L170) , [2] (https://github.com/mitsuhiko/flask/blob/0.9/flask/config.py#L21)) Stellen Sie sicher, dass eines dieser Programme von uwsgi ausgeführt wird. Am einfachsten ist es, direkt nach 'app = Flask (__ name __)' –

+0

Ja, so mache ich in meinem Beispiel. Ich werde es nochmal versuchen, um sicherzugehen.Aber jetzt, nachdem Flasks Debugging-Modus aktiviert wurde, habe ich den 502 Bad Gateway-Fehler bekommen, den ich auf nginx lokalisieren würde ... Siehe UPDATE2. –

1

Simon Sapin hat Ihnen wirklich die richtige Antwort gegeben. Sie müssen Debug in Flask aktivieren. Nginx gibt keine benutzerdefinierten Fehlerseiten zurück, es sei denn, Sie konfigurieren es explizit dafür.

Wenn Sie den folgenden Code verwenden, sehen Sie Ihre Debug-Nachrichten von Kolben, Proxy über Nginx.

from flask import Flask 

app = Flask(__name__) 
app.debug = True 

@app.route('/') 
def index(): 
    raise Exception() 

Wie pro Ihre Update 2. Sie sehen eine 502 (falsches Gateway), da Flasche ist einfach keine Antwort auf alle Rückkehr oder eine Antwort, dass Nginx nicht versteht. A 502 ist kein Problem mit Nginx. Es bedeutet, dass alles, was Nginx versucht zu sprechen (in diesem Fall Ihre Flaschen-App), überhaupt nicht richtig funktioniert.

In vielerlei Hinsicht sollten Sie dies jedoch nicht tun. Der Debugging-Modus sollte nur aktiviert werden, wenn Sie Flask auf Ihrem lokalen Dev-Computer ausführen. Was ist der springende Punkt der if __name__ == "__main__": Linie sowieso.