nginx + uwsgi + flacon de désactivation des pages d'erreur personnalisées
est - il possible de désactiver les pages d'erreur personnalisées de nginx - si je peux les appeler comme ça-pour afficher les pages d'exception de mon framework?
Je ne vois pas vraiment mon outil de débogage Werkzeug rendu en html...
mise à JOUR
OK, je dois faire une très très très simple application de flasque pour travailler et je vais poster les 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)
variable d'environnement PYTHONPATH:
$ echo $PYTHONPATH
/home/my_user/dev/
Comment je cours uwsgi:
$ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app
Comment je cours nginx:
$ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/
si j'appuie sur la page racine:
si j'exécute NGINX manuellement comme:
python /home/my_user/dev/nginx_test/___init___.py
je vais voir à la place, et ce que je veux voir:
bien sûr je me suis assuré que ça marcherait quand je n'ai pas soulevé l'exception, mais j'ai retourné 'Hello World' par exemple sur ma fonction index ().
ceci est fait référence aux pages d'erreur personnalisées dans .NET. Je veux désactiver ceci et laisser nginx / uwsgi passer le html généré par le débogueur directement sur le navigateur au lieu de l'erreur interne du serveur.
mise à jour 2
maintenant si je change mon application flask pour activer le mode de débogage par:
/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)
puis j'obtiens 502 Erreur.
Mais si je au lieu de raise Exception:
/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)
Je reçois 'Hello World' sur mon navigateur lorsque je clique sur la page ( http://localhost:5000 ).
3 réponses
cette page d '"erreur de serveur interne" n'est pas de nginx mais de Flask. Il le fait quand le mode de débogage est éteint .
uwsgi importe votre code comme un module, pas comme un script. __name__ == '__main__'
est faux et la déclaration if n'est pas exécutée. Essayez de configurer le mode de débogage en dehors du SI:
app = Flask(__name__)
app.debug = True
Cependant, il est fortement recommandé de jamais quitter le mode de débogage sur un serveur sur le internet public, puisque l'utilisateur peut faire tourner le serveur n'importe quel code. C'est un grave problème de sécurité.
utilisez Flask#errorhandler
pour enregistrer vos propres manipulateurs d'erreurs dans un flacon. Par exemple, pour remplacer le 404 vous feriez quelque chose comme:
app = Flask()
@app.errorhandler(404)
def handel_404(error):
return render_template('404.html')
Simon Sapin vous a vraiment donné la bonne réponse. Vous devez activer le débogage dans le Flacon. Nginx ne renvoie aucune page d'erreur personnalisée à moins que vous ne la configuriez explicitement pour le faire.
si vous utilisez le code suivant, vous verrez vos messages de débogage de flasque, mandatés via Nginx.
from flask import Flask
app = Flask(__name__)
app.debug = True
@app.route('/')
def index():
raise Exception()
selon votre mise à jour 2. Vous voyez un 502 (mauvaise passerelle) parce que Flask n'est tout simplement pas retourner une réponse du tout, ou une réponse que Nginx ne pas comprendre. Un 502 n'est pas un problème avec Nginx. Cela signifie que quoi que Nginx essaye de parler (votre application flask dans ce cas) ne fonctionne pas correctement du tout.
cependant, à bien des égards, vous ne devriez pas faire cela. Le mode de débogage ne devrait être activé que lorsque vous utilisez flask sur votre machine dev locale. Ce qui est le point entier de la ligne if __name__ == "__main__":
de toute façon.