web-dev-qa-db-ja.com

Flaskアプリを提供するにはWSGIサーバーとHTTPサーバーが必要ですか?

FlaskをuWSGIとNginxで設定するのは非常に難しく、ビルドアウトスクリプトを使用する場合でもかなり時間がかかり、後で再現するために指示に記録する必要があります。

サーバーに大きな負荷をかける予定がない場合(パブリックからは見えない)、uWSGIなしで実行するのは理にかなっていますか? (Flaskはポートをリッスンできます。Nginxはリクエストを転送できますか?)

Nginxさえ使用せず、単にポートでbare flask appを実行するのは理にかなっていますか?

19
culebrón

「Flaskを実行」すると、実際にはWerkzeugの開発WSGIサーバーが実行され、FlaskアプリがWSGI呼び出し可能オブジェクトとして渡されます。

開発サーバーは、実稼働環境での使用を目的としていません。特に効率的、安定、または安全になるようには設計されていません。

アプリケーションがどこで利用可能になるかに関係なく、実稼働環境に移行する場合は、Werkzeug devサーバーをGunicornやuWSGIなどの実稼働環境に対応したWSGIサーバーに置き換えます。


答えは「Webサーバーを使用すべきか」についても同様です。 WSGIサーバーにはたまたまHTTPサーバーがありますが、専用の実稼働HTTPサーバー(Nginx、Apacheなど)ほど優れていません。


Flask documents さまざまな方法で展開する方法。多くのホスティングプロバイダーには、PythonまたはFlask。

21
davidism

おそらく、既にFlaskアプリオブジェクトとルートが設定されていますが、次のようなアプリを作成する場合:

_import flask

app = flask.Flask(__name__)
_

@app.route() sを設定してから、アプリを起動したいとき:

_import gevent

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

そうすれば、gunicornやuWSGIなどを実行するように指示するのではなく、アプリケーションを直接実行できます。

flaskのユーティリティを使用してWebアプリケーションを構築したい場合(REST APIサービス)があり、構成できないflask他の非フラスコ、非Webサービス要素で問題が発生しました。最終的に_gevent.wsgi.WSGIServer_が見つかりましたが、それはまさに必要なものでした。app_server.serve_forever()の呼び出し後、アプリケーションが終了したいときにapp_server.stop()を呼び出すことができます。

私の展開では、アプリケーションはlocalhostでリッスンしています:flaskとgeventを使用し、nginxが別のポートでHTTPSリクエストをリバースプロキシして、flaskローカルホスト上のサービス。

10
Stephen J.