2016-08-16 15 views
6

Thiết lập Flask với uWSGI và Nginx là khá khó khăn, và thậm chí với các kịch bản xây dựng phải mất khá nhiều thời gian, và phải được ghi lại để hướng dẫn được sao chép sau này.Máy chủ WSGI và máy chủ HTTP có cần thiết để phục vụ ứng dụng Flask không?

Nếu tôi không lên kế hoạch tải trọng lớn trên máy chủ (nó bị ẩn khỏi công khai), bạn có thể chạy nó mà không có uWSGI không? (Bình có thể nghe một cổng. Nginx có thể chuyển tiếp các yêu cầu không?)

Có ý nghĩa khi không sử dụng Nginx, chỉ cần chạy ứng dụng bình rỗng trên một cổng?

+0

Tornado là một máy chủ Python rất nhẹ, tôi chạy nó trong môi trường dev của tôi. Nhưng bạn có thể muốn xem xét nó. Nếu dịch vụ được ẩn anyway, tôi không thấy một vấn đề chạy máy chủ inbuild dev, nhưng tôi có kinh nghiệm tụt hậu trong khi phát triển. Nó có thể không ổn định và có trách nhiệm ... – Hannes

+3

Không sử dụng Tornado để chạy các ứng dụng WSGI. Tài liệu riêng của họ cảnh báo chống lại điều đó. – davidism

+0

Ồ, rất vui được biết. Tôi đoán. Không bao giờ có rắc rối trong dev với nó mặc dù. Gotta nhìn vào tài liệu ... :) – Hannes

Trả lời

7

Khi bạn "chạy Flask", bạn thực sự đang chạy máy chủ WSGI phát triển của Werkzeug và chuyển ứng dụng Flask của bạn thành WSGI có thể gọi được.

Máy chủ phát triển không được thiết kế để sử dụng trong sản xuất. Nó không được thiết kế đặc biệt hiệu quả, ổn định hoặc an toàn.

Thay thế máy chủ Werkzeug dev bằng máy chủ WSGI sẵn sàng sản xuất như Gunicorn hoặc uWSGI khi chuyển sang sản xuất, bất kể ứng dụng sẽ khả dụng ở đâu.


Câu trả lời tương tự cho "tôi nên sử dụng máy chủ web". Các máy chủ WSGI xảy ra để có các máy chủ HTTP nhưng chúng sẽ không tốt như một máy chủ HTTP sản xuất chuyên dụng (Nginx, Apache, v.v.).


Flask documents cách triển khai theo nhiều cách khác nhau. Nhiều nhà cung cấp dịch vụ lưu trữ cũng có tài liệu về triển khai Python hoặc Flask.

1

Có lẽ bạn đã có một đối tượng ứng dụng Flask và các tuyến đường thiết lập, nhưng nếu bạn tạo ra các ứng dụng như thế này:

import flask 

app = flask.Flask(__name__) 

sau đó thiết lập @app.route() của bạn, và sau đó khi bạn muốn bắt đầu ứng dụng:

import gevent 

app_server = gevent.wsgi.WSGIServer((host, port), app) 
app_server.serve_forever() 

Sau đó, bạn chỉ có thể chạy ứng dụng của mình trực tiếp thay vì phải nói với gunicorn hoặc uWSGI hoặc bất kỳ thứ gì khác để chạy nó cho bạn.

Tôi có trường hợp tôi muốn tiện ích của bình để xây dựng một ứng dụng web (dịch vụ REST API) và thấy không có khả năng tạo bình với các phần tử không phải là bình, dịch vụ web khác. Cuối cùng tôi tìm thấy gevent.wsgi.WSGIServer và đó chỉ là những gì tôi cần. Sau khi gọi tới app_server.serve_forever(), bạn có thể gọi app_server.stop() khi ứng dụng của bạn muốn thoát.

Trong quá trình triển khai, ứng dụng của tôi đang nghe trên máy chủ cục bộ: sử dụng bình và gevent, sau đó tôi có yêu cầu HTTPS đảo ngược proxy trên một cổng khác và chuyển chúng vào dịch vụ bình của tôi trên máy chủ cục bộ.

+0

Vì vậy, vẫn sử dụng máy chủ wsgi? Bạn nói chạy máy chủ của gevent là khác với chạy gunicorn's hoặc uwsgi's, nhưng nó không phải. Và bạn có thể chạy cả hai chương trình sau đó là tốt. – davidism

+0

Tôi hiểu. Có, WSGIServer của gevent vẫn là một WSGIServer, nhưng nó là người duy nhất tôi có thể tìm thấy một cách đơn giản để chạy nó theo chương trình từ daemon của tôi (và OP đặc biệt bemoaning cách phức tạp thiết lập để chạy ứng dụng Flask của mình dưới các máy chủ WSGI khác). Tôi rất vui khi biết rằng các máy chủ WSGI của gunicorn và uwsgi cũng có thể được chạy theo cách đó, ngay cả khi việc tìm kiếm thông tin đó không phải là tầm thường. –

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