web-dev-qa-db-ja.com

Flask、uWSGI、nginx用に別々のコンテナーが必要ですか?

負荷分散にKubernetesとIngressを使用する予定です。 Flask、uWSGI、Nginxの設定方法を学ぼうとしています。 3つすべてが同じコンテナにインストールされているこのチュートリアルを見て、それを使用する必要があるかどうか疑問に思っています。 https://ianlondon.github.io/blog/deploy-flask-docker-nginx/

それらを別々のコンテナと別々のポッドとして持つことの利点は、それらがすべて個別にスケーリングできることだと思いますか?

しかしまた、Flaskとuwsgiは別々のコンテナに入れる必要がありますか?(またはFlaskとGunicorn、uwsgiはGunicornに非常に似ているようです)

12
gunit

FlaskはWebフレームワークであり、Flaskで作成されたアプリケーションは、それをホストするためにWSGIサーバーを必要とします。 Flask組み込みの開発者サーバーを使用することもできますが、本番システムには適していないため、使用しないでください。したがって、uWSGI、gunicorn、mod_wsgi(mod_wsgi)などのWSGIサーバーを使用する必要があります。 -express)。WebアプリケーションはWSGIサーバーによってホストされているため、同じコンテナー内にのみ存在できますが、Flaskに個別のプロセスはなく、Webサーバープロセスで実行されます。

Nginxなどの別のWebサーバーが必要かどうかは異なります。 mod_wsgiの場合、Apache Webサーバーを使用するため、使用しないため、直接的なメリットが得られます。 mod_wsgi-expressを使用する場合、最適な基本構成で実行するようにすでに設定されており、uWSGIまたはgunicornを使用するときにnginxでよく行われるように、前面に面した別個のWebサーバーを用意する必要がありません。

Kubernetesの入力の場合のように、プラットフォームがすでに負荷分散用のルーティングレイヤーを提供しているコンテナ化されたシステムの場合、nginxを組み合わせて使用​​すると、不要な複雑さが増し、パフォーマンスが低下する可能性があります。これは、同じコンテナでnginxを実行するか、同じポッドで別のコンテナを作成し、共有emptyDirボリュームタイプを使用して、UNIXソケットを介して通信できるようにする必要があるためです。 UNIXソケットを使用せず、INETソケットを使用する場合、またはまったく別のポッドでnginxを実行する場合は、トラフィックに追加のホップを導入するため、密接に使用するよりもコストがかかるため、意味がありません。 UNIXソケットを使用してバインドされます。 nginxと組み合わせてINET経由でリクエストを受け入れる場合、uWSGIサーバーは同様に機能しません。また、別のポッド、場合によっては別のホストにnginxを配置すると、状況が悪化する可能性があります。

前にnginxを使用する理由の一部は、リクエストのバッファリングやその他の潜在的な問題による遅いクライアントからユーザーを保護できることです。ただし、入力を使用する場合は、haproxyまたはnginxフロントエンドロードバランサーがすでにあり、ある程度保護することができます。したがって、ミックスに追加のnginxプロキシを導入することに意味があるかどうかについては、実際に何をしているかに依存します。ロードバランサーのすぐ後ろにgunicornまたはuWSGIを配置する方が簡単な場合があります。

提案は次のとおりです。

  • Mod_wsgi-expressも見てください。これは、コンテナ化されたシステムを念頭に置いて特別に開発されたものであり、uWSGIやgunicornよりも優れた選択肢となる可能性があります。

  • 過負荷になるだけのベンチマークではなく、実際のトラフィックプロファイルを使用して、実際のアプリケーションでさまざまなWSGIサーバーと構成をテストします。これは、Kubernetesベースのシステムのダイナミクスと、そのルーティングの実装方法が、従来のシステムとは大きく異なる動作をする可能性があることを意味するため、重要です。

21