簡體   English   中英

nginx + uwsgi + flask - 禁用自定義錯誤頁面

[英]nginx + uwsgi + flask - disabling custom error pages

是否可以禁用nginx的自定義錯誤頁面 - 如果我可以調用它們 - 來顯示我的框架的異常頁面?

我無法真正看到我在wtml中呈現的werkzeug調試工具...

UPDATE

好的,我必須制作一個非常簡單的燒瓶應用程序才能工作,我會發布這些內容:

/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環境變量:

$ echo $PYTHONPATH
/home/my_user/dev/

我如何運行uwsgi:

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

我如何運行nginx:

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

如果我點擊根頁面:

服務器錯誤

如果我手動運行nginx,如:

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

相反,我會看到,我想看到的:

在此輸入圖像描述

當然,我確保它在我沒有引發異常時會起作用,但在我的index()函數中返回'Hello World'。

這是指.NET中的自定義錯誤頁面。 我想禁用它,讓nginx / uwsgi將調試器生成的html直接傳遞給瀏覽器,而不是內部服務器錯誤。

更新2

現在,如果我更改我的燒瓶應用程序以啟用調試模式:

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

然后我得到502錯誤。

但是,如果我而不是提出異常:

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

當我點擊頁面時,我的瀏覽器上出現了“Hello World”( http:// localhost:5000 )。

此“內部服務器錯誤”頁面不是來自nginx,而是來自Flask。 當調試模式關閉時,會這樣做

uwsgi將您的代碼作為模塊導入,而不是作為腳本運行。 __name__ == '__main__'為False且未執行if語句。 嘗試在if之外設置調試模式:

app = Flask(__name__)
app.debug = True

但是,強烈建議永遠不要將調試模式保留在公共Internet上的服務器上,因為用戶可以使服務器運行任何代碼。 這是一個嚴重的安全問題。

使用Flask#errorhandler在flask中注冊您自己的錯誤處理程序。 例如,要替換404,您可以執行以下操作:

app = Flask()

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

Simon Sapin真的給了你正確的答案。 您需要在Flask中啟用調試。 Nginx不會返回任何自定義錯誤頁面,除非您明確將其配置為執行此操作。

如果您使用以下代碼,您將看到來自flask的調試消息,通過Nginx代理。

from flask import Flask

app = Flask(__name__)
app.debug = True

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

根據您的更新2.您看到502(壞網關),因為Flask根本沒有返回任何響應,或者Nginx不理解的響應。 502不是Nginx的問題。 這意味着無論Nginx試圖說什么(在這種情況下你的燒瓶應用程序)根本不能正常工作。

但是,在許多方面你不應該這樣做。 只有在本地開發計算機上運行flask時才應啟用調試模式。 無論如何,這是if __name__ == "__main__":行的重點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM