2012-06-21 28 views
9

Có thể vô hiệu hóa các trang lỗi tùy chỉnh của nginx không - nếu tôi có thể gọi chúng - để hiển thị các trang ngoại lệ của khung công tác của tôi?nginx + uwsgi + bình - vô hiệu hóa các trang lỗi tùy chỉnh

tôi có thể không thực sự nhìn thấy công cụ gỡ lỗi Werkzeug tôi render trong html ...

CẬP NHẬT

OK, tôi đã làm đơn bình rất rất đơn giản để làm việc và tôi sẽ đăng các bit:

/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 biến môi trường:

$ echo $PYTHONPATH 
/home/my_user/dev/ 

Làm thế nào tôi chạy uwsgi:

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

Làm thế nào tôi chạy nginx :

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

Nếu tôi nhấn trang gốc:

server error

Nếu tôi chạy nginx bằng tay như:

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

tôi sẽ thấy thay vào đó, và những gì tôi muốn xem:

enter image description here

Tất nhiên tôi đã đảm bảo rằng nó sẽ hoạt động khi tôi không tăng cũ sự lừa dối, nhưng đã trả về 'Hello World' ví dụ về hàm index() của tôi.

Điều này được gọi là các trang lỗi tùy chỉnh trong .NET. Tôi muốn vô hiệu hóa điều này và để nginx/uwsgi chuyển html được tạo bởi trình gỡ lỗi trực tiếp tới trình duyệt thay vì điều lỗi máy chủ nội bộ.

CẬP NHẬT 2

Bây giờ nếu tôi thay đổi ứng dụng bình của tôi để kích hoạt chế độ gỡ lỗi bằng cách:

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

Sau đó, tôi nhận được lỗi 502.

Nhưng nếu tôi thay vì tăng Ngoại lệ:

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

tôi nhận được 'Hello World' trên trình duyệt của tôi khi tôi nhấn trang (http://localhost:5000).

+1

Sẽ tốt hơn khi nêu rõ câu hỏi mà bạn gặp sự cố với trang lỗi nào. 502 – number5

+0

Cảm ơn đề xuất của bạn, tôi đã thêm rất nhiều thông tin mới hy vọng sẽ giúp tìm ra vấn đề. –

Trả lời

1

Sử dụng Flask#errorhandler để đăng ký trình xử lý lỗi của riêng bạn trong bình. Ví dụ để thay thế cho 404 bạn sẽ làm điều gì đó như:

app = Flask() 

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

Ý tôi là, những gì tôi thực sự cần là khi 'nâng cao ngoại lệ() 'đạt được trong mã của tôi, tôi thấy trình gỡ rối werkzeug thay vì nginx 502 Cổng Bad page –

+2

Ah, Nếu bạn nhận được 502 Bad Gateway, thì lỗi đang xảy ra trước khi ứng dụng của bạn có cơ hội bắt đầu. Trình gỡ rối werkzeug chỉ có thể xử lý các lỗi xảy ra khi thực hiện yêu cầu. Bạn sẽ phải kiểm tra các bản ghi uwsgi của bạn để theo dõi ngăn xếp để khắc phục sự cố. – Trevor

+1

Bạn cũng có thể thay đổi diện mạo của trang bằng cách thêm chỉ thị 'error_page 502 = 503 /error_page.html;' vào cấu hình nginx của bạn nhưng đó sẽ chỉ là một trang tĩnh. – Trevor

6

trang này "Internal Server Error" không phải là từ nginx nhưng từ Flask. Nó làm như vậy khi chế độ gỡ lỗi tắt.

uwsgi đang nhập mã của bạn làm mô-đun, không chạy ở dạng tập lệnh. __name__ == '__main__' là False và câu lệnh if không được thực hiện. Hãy thử thiết lập chế độ gỡ lỗi bên ngoài nếu:

app = Flask(__name__) 
app.debug = True 

Tuy nhiên, nó được khuyến khích mạnh mẽ để bao giờ rời khỏi chế độ gỡ lỗi trên máy chủ trên mạng Internet công cộng, kể từ khi người dùng có thể làm cho các máy chủ chạy bất kỳ mã. Đây là vấn đề bảo mật nghiêm trọng.

+0

Tôi nghĩ rằng đó là những gì: app.config.update (DEBUG = True) đã làm - hiện tại của nếu ... nhưng tôi sẽ thử nó chỉ bằng cách thiết lập app.debug = Đúng như bạn đề nghị và cho bạn biết kết quả . –

+0

app.debug = True phải giống như 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)) Đảm bảo rằng một trong hai cách này được thực thi bởi uwsgi. Cách dễ nhất là đặt ngay sau 'app = Flask (__ name __)' –

+0

Vâng, đó là cách tôi làm trong ví dụ của tôi. Tôi sẽ thử lại để chắc chắn.Nhưng bây giờ sau khi kích hoạt chế độ gỡ lỗi của Flask, tôi bị lỗi 502 Bad Gateway, mà tôi muốn xác định nginx ... Xem UPDATE2. –

1

Simon Sapin đã thực sự cung cấp cho bạn câu trả lời đúng. Bạn cần bật gỡ lỗi trong Flask. Nginx không trả lại bất kỳ trang lỗi tùy chỉnh nào trừ khi bạn định cấu hình nó để làm như vậy.

Nếu bạn sử dụng mã sau, bạn sẽ thấy thông báo gỡ lỗi của bạn từ bình, được ủy quyền qua Nginx.

from flask import Flask 

app = Flask(__name__) 
app.debug = True 

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

Theo cập nhật của bạn 2. Bạn thấy không trả lời bất kỳ phản hồi nào hoặc phản hồi mà Nginx không hiểu. 502 không phải là vấn đề với Nginx. Nó có nghĩa là bất cứ điều gì Nginx đang cố gắng để nói chuyện (ứng dụng bình của bạn trong trường hợp này) là không hoạt động đúng ở tất cả.

Tuy nhiên, theo nhiều cách, bạn không nên làm điều này. Chế độ gỡ lỗi chỉ nên được bật khi bạn đang chạy bình trên máy tính địa phương của bạn. Đó là toàn bộ điểm của dòng if __name__ == "__main__":.

Các vấn đề liên quan