nginx + uwsgi + flask - disabling custom error pages
flask, nginx, python, uwsgi, werkzeug
Solution
This "Internal Server Error" page is not from nginx but from Flask. It does so when debug mode is off.
uwsgi is importing your code as a module, not running at as a script. `__name__ == '__main__'` is False and the if statement is not executed. Try setting debug mode outside of the if:
app = Flask(__name__)
app.debug = True
However, it is strongly recommended to never leave the debug mode on a server on the public internet, since the user can make the server run any code. This is a serious security issue.
Problem
Is it possible to disable nginx's custom error pages - if I may call them that - to display my framework's exception pages? I can't really see my werkzeug debugger tool rendered in html... UPDATE OK, I got to make a very very simple flask application to work and I'll post the 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 environment variable: ``` $ echo $PYTHONPATH /home/my_user/dev/ ``` How I run uwsgi: ``` $ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app ``` How I run nginx: ``` $ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/ ``` If I hit the root page: If I run nginx manually like: ``` python /home/my_user/dev/nginx_test/___init___.py ``` I will see instead, and what I want to see: Of course I made sure it would work when I didn't raise the exception, but returned 'Hello World' for example on my index() function. This is referred to custom error pages in .NET. I want to disable this and let nginx/uwsgi pass the html generated by the debugger directly to the browser instead of the internal server error thing. UPDATE 2 Now if I change my flask app to enable debugging mode by: /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) ``` Then I get 502 error. But if I instead of 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) ``` I get 'Hello World' on my browser when I hit the page (http://localhost:5000).