web-dev-qa-db-ja.com

uWSGIがあるときにnginxが必要なのはなぜですか

DjangoアプリケーションをデプロイしたいときにuWGSIと連携するようにnginxを設定する方法についてのチュートリアルがたくさんあります。

しかし、なぜこのキットにnginxが必要なのですか? uWSGI自体はWSGIを提供できますPythonアプリケーション、静的ファイルを提供でき、SSLも実行できます。nginxはuWSGIができないことを何ができますか?

67
user983447

あなたはしません。

それはとにかく簡単な答えです-あなたはそれを必要としない。 uWSGIはそれ自体が有能なサーバーです。

ただし、nginxのような他のサーバーはより古く、(おそらくいずれにしても)より安全であり、uWSGIでサポートされていない追加の機能を備えています-たとえば、静的リソースの処理の改善(ExpiresまたはE-Tagの任意の組み合わせによる)ヘッダー、gzip圧縮、事前圧縮されたgzipなど)。サーバーとネットワークの負荷を大幅に削減できます。さらに、Djangoアプリケーションの前にあるnginxのようなサーバーは、動的コンテンツのキャッシングを実装することもでき、サーバーの負荷を軽減するのに役立ち、さらにCDN(これは通常は動的コンテンツではうまく機能しません。さらに進んで、完全に別のサーバーにnginxを配置し、動的コンテンツのリクエストをアプリケーションサーバーの負荷分散クラスターにリバースプロキシして、静的コンテンツ自体を処理することもできます。

たとえば、私のブログ(WordPressの前にはnginxがあります)は、投稿を24時間キャッシュし、インデックスページを5分間キャッシュするように調整されています。ほとんどの場合それが本当に問題になるほどのトラフィックはありませんが、小さなVPSが時折発生する突発的なサージを乗り切るのに役立ちます(記事の1つが選択されたときのトラフィックの急増など)何千人ものフォロワーを持つツイッターがアップし、その多くが何千人ものフォロワーにツイートをリツイートしました。

「裸の」uWSGIサーバーを実行していた場合(そして、WordPressではなくDjangoサイトであると想定した場合)、それは問題なく立ち上がった可能性があります-またはクラッシュして火傷し、見逃した訪問者に私は犠牲になりました。

言われていることすべて、トラフィックが少ない小さなサイトを実行している場合は、nginxやその他の必要はありません。それが目的である場合は、uWSGIを単独で使用するだけです。一方、多くのトラフィックが表示される場合は、まあ、あなたstillはuWSGIを必要とするかもしれませんが、少なくとも何かを考慮する必要があります荷物の前でそれを助けます。実際には、完成したサイトでさまざまな構成を実際に負荷テストして、予想される負荷の下で何が最適に機能するかを判断し、最終的には何でも使用する必要があります。

58
Kromey

IMO、Webサイトをラボではなくインターネットに配置すると、違いがわかる場合があります。

ネットワーク速度が遅い別の国のユーザーが、Webブラウザーを開いてWebサイトにアクセスするとします。 uWSGIはそのHttp接続をスレッドで処理します。そのスレッドは、ネットワーク速度が遅いため、完全なHttpリクエストを待機するのにかなり長い時間を費やす可能性があります。スレッドプールのサイズが100の場合、そのような100人のユーザーが遅いと想像してください。どうなるでしょうか。他のHTTPリクエストを処理するアイドルスレッドはありません。

しかし、Nginxの場合はかなり異なります。 Nginxは「リアクターパターン」で設計されています。あなたはそれがどのように機能するかを見るために「原子炉パターン」をググることができます。つまり、低速接続は、他のHttpリクエストを処理するために影響しません。

2
Jcyrss