Flask にバンドルされているサーバーは、本番環境にデプロイしても安全ですか? そうでない場合、本番環境で Flask をデプロイするには何を使用すればよいですか?
3 に答える
いいえ。バンドルされたサーバーは開発サーバーです。本番環境を考慮して設計されていません。
- デフォルトでは、一度に複数のリクエストを処理することはありません。
- デバッグ モードをオンのままにしてエラーが表示されると、サーバー上で任意のコードを実行できるシェルが開きます (考えてみてください
os.system('rm -rf /')
)。 - 開発サーバーはうまくスケーリングしません。
Flask は Werkzeug の開発サーバーを使用しており、ドキュメントには同じことが書かれています。
開発サーバーは、実稼働システムで使用するためのものではありません。特に開発目的で設計されており、高負荷下ではパフォーマンスが低下します。展開のセットアップについては、アプリケーションの展開ページをご覧ください。
推奨されるアプローチは、実稼働 WSGI サーバーを使用して Flask アプリケーションを実行することです。ドキュメントには展開専用のセクション全体があります: Deployment Options。
アプリケーションのデプロイは、uWSGI や gunicorn などの WSGI サーバーをインストールし、Flask の開発サーバーの代わりにそれを実行するのと同じくらい簡単です。
gunicorn -w 4 -b 127.0.0.1:4000 myproject:app
画像や動画などの静的アセットを提供している場合、低レベルのキャッシュが必要な場合、または同時実行の要求が高い場合は、nginxなどのウェブサーバーを使用してすべてのリクエストを処理することをお勧めします。
下手な ASCII 形式で:
+----------+
| Client 2 |
+----------+
|
V
+----------+ +-------+ +----------+
| Client 1 |----->| nginx |<-----| Client 3 |
+----------+ +-------+ +----------+
^
|
V
/--------------------\
| useful nginx stuff |
| like asset serving |
| and rate limiting |
\--------------------/
|
V
+-------------+
| WSGI server |
+-------------+
WSGI サーバー プロセスを実際に実行するには、 Supervisorを使用できます。サーバーが何らかの理由で失敗した場合、サーバーを自動的に再起動し、ログを保持し、デーモンとして実行されるため、サーバーの起動時にサービスが開始されます。
基本的にはありません。組み込みの開発サーバーは、実稼働環境での展開には安全ではありません。
組み込みの開発サーバーはまさにそのためのものです。本番環境で使用するには、ここで説明する手順の1つに従う必要があります。
これらには、 Apache / mod_wsgiやこれらのスタンドアロンwsgiサーバーの1つhttp://flask.pocoo.org/docs/deploying/wsgi-standalone/など、WSGI仕様を実装するさまざまなサーバーが含まれます。
利用可能なuWSGIおよびFastCGIオプションもあります
軽量で使いやすい一方で、Flask のビルトイン サーバーは、スケールがうまくいかず、デフォルトで一度に 1 つのリクエストしか処理しないため、本番環境には適していません。 http://flask.pocoo.org/docs/0.12/deploying/