2012-06-21 17 views
9

¿Es posible deshabilitar las páginas de error personalizadas de nginx, si puedo llamarlas así, para mostrar las páginas de excepción de mi marco?nginx + uwsgi + matraz - deshabilitar páginas de error personalizadas

Realmente no puedo ver mi herramienta werkzeug depurador hizo en html ...

ACTUALIZACIÓN

OK, tengo que hacer una solicitud frasco muy muy simple para trabajar y voy a publicar los 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 variable de entorno:

$ echo $PYTHONPATH 
/home/my_user/dev/ 

Cómo corro uwsgi:

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

Cómo corro nginx :

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

Si lo golpeo la página raíz:

server error

Si me quedo nginx manualmente como:

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

veré en su lugar, y lo que yo quiero ver:

enter image description here

Por supuesto, me aseguré de que funcionaría cuando no planteé el ex ception, pero devolvió 'Hello World' por ejemplo en mi función index().

Esto se refiere a páginas de error personalizadas en .NET. Quiero desactivar esto y dejar que nginx/uwsgi pase el html generado por el depurador directamente al navegador en lugar del error del servidor interno.

ACTUALIZACIÓN 2

Ahora si cambio de aplicación matraz para activar el modo de depuración por:

/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) 

Entonces obtengo el error 502.

Pero si en lugar de aumento Excepción:

/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) 

consigo 'Hola mundo' en mi navegador cuando golpeo la página (http://localhost:5000).

+1

Sería mejor indicar en la pregunta con qué páginas de error tiene un problema, por ejemplo. 502 – number5

+0

Gracias por su sugerencia, he agregado una gran cantidad de información nueva que espero ayudaría a resolver el problema. –

Respuesta

1

Utilice Flask#errorhandler para registrar sus propios manejadores de errores en el matraz. Por ejemplo, para reemplazar el 404 que haría algo como:

app = Flask() 

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

Quiero decir, lo que realmente necesito es cuando 'raise Exception()' se alcanza en mi código, veo el depurador werkzeug en lugar de nginx 502 Bad Gateway página –

+2

Ah, si está obteniendo un 502 Bad Gateway, entonces el Se está produciendo un error antes de que su aplicación tenga la oportunidad de comenzar. El depurador werkzeug solo puede manejar los errores que se producen durante una solicitud. Deberá verificar los registros de uwsgi para obtener un seguimiento de pila para solucionar el problema. – Trevor

+1

También puede cambiar el aspecto de la página al agregar una directiva 'error_page 502 = 503 /error_page.html;' en su configuración de nginx, pero eso será solo una página estática. – Trevor

6

Esta página "Internal Server Error" no es de nginx pero a partir del frasco. Lo hace tan cuando el modo de depuración está desactivado.

uwsgi está importando su código como un módulo, no ejecutándose como una secuencia de comandos. __name__ == '__main__' es False y la instrucción if no se ejecuta. Pruebe a establecer el modo de depuración fuera del caso:

app = Flask(__name__) 
app.debug = True 

Sin embargo, se recomienda encarecidamente a Nunca salir del modo de depuración en el servidor en el Internet público, ya que el usuario puede hacer que el servidor ejecuta ningún código. Este es un problema serio de seguridad.

+0

Pensé que eso era lo que hacía: app.config.update (DEBUG = True) - actualmente fuera de la if ... pero lo intentaré simplemente configurando app.debug = True como sugieres y te dejo saber los resultados . –

+0

app.debug = True debe ser el mismo que app.config.update (DEBUG = True) ([1] (https://github.com/mitsuhiko/flask/blob/0.9/flask/app.py#L170) , [2] (https://github.com/mitsuhiko/flask/blob/0.9/flask/config.py#L21)) Asegúrese de que uwsgi ejecute cualquiera de estos. Lo más fácil es ponerlo justo después de 'app = Flask (__ name __)' –

+0

Sí, así es como lo hago en mi ejemplo. Lo intentaré de nuevo solo para asegurarme.Pero por ahora, después de habilitar el modo de depuración de Flask, recibo el error 502 Bad Gateway, que señalaría a nginx ... Ver UPDATE2. –

1

Simon Sapin realmente le ha dado la respuesta correcta. Debe habilitar la depuración en Flask. Nginx no devuelve ninguna página de error personalizada a menos que lo configure explícitamente para hacerlo.

Si utiliza el siguiente código, verá sus mensajes de depuración del matraz, a través de Nginx.

from flask import Flask 

app = Flask(__name__) 
app.debug = True 

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

Según su actualización 2. Usted está viendo un (Pasarela incorrecta) 502 Frasco porque simplemente no está regresando ninguna respuesta en absoluto, o una respuesta que Nginx no entiende. Un 502 no es un problema con Nginx. Significa que lo que sea que Nginx intente hablar (tu matraz en este caso) no funciona del todo.

Sin embargo, en muchos sentidos no deberías estar haciendo esto. El modo de depuración solo debe habilitarse cuando está ejecutando un matraz en su máquina de desarrollo local. Que es el punto total de la línea if __name__ == "__main__": de todos modos.

Cuestiones relacionadas