静的ファイルを提供するためのnode.js自体またはnginxフロントエンド?


90

より高速なベンチマークまたは比較はありますか:ノードの前にnginxを配置して静的ファイルを直接提供するか、ノードのみを使用して静的ファイルを提供するようにしますか?

nginxソリューションは私にとってより扱いやすいようです、何か考えはありますか?


3
また、1つのサーバーを他のサーバーで使用するために作成する必要がある構成とコードの量にも依存します。IPOを実行する予定がなく、アプリサーバーがすでに構成されており、必要なすべてのことを実行している場合は、十分ではなくなるまでそれを続けることができます。
m33lky

回答:


118

ここで答えに同意しないといけない。Nodeは問題なく動作しますが、nginxは正しく構成されていれば間違いなく高速になります。nginxは、小さなメモリフットプリントで同様のパターンに従って(必要な場合にのみ接続に戻る)Cで効率的に実装されます。さらに、ファイルを提供するsendfile syscallをサポートします。これは、OSカーネル自体がジョブを実行しているため、ファイルの提供で可能な限り高速です。

現在では、nginxはフロントエンドサーバーとして事実上の標準になっています。静的ファイル、gzip、SSL、さらにはロードバランシングを提供する際のパフォーマンスに使用できます。

PS:これは、ファイルが要求時にディスク上で静止している場合と同様に、実際に「静的」であることを前提としています。


7
ちょっとしたメモ:node.jsもサポートsendfileしていますが、コードを記述する必要があるようです。例を参照してください。blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo

静的コンテンツを提供する以外に、Nginxのパフォーマンスが、パブリックWebドメインのメインWebサーバー(Tomcat / Jetty / IISなど)を公開するよりも優れているのはなぜですか?
ラフィアン

1
アプリに対してリクエストが行われた場合、最初にnginxを介してルーティングすることで、そのリクエストはそれほど速くは行われません(nginxが静的CSSとjs、gzip、SSLを処理する場合、最良のケースでは著しく速くなります)。ただし、nginxは最高のソフトウェアロードバランサーの1つでもあるため、ほとんどのサーバーは適度に高い負荷でフリップアウトすることで悪名高いため、これは重要になる可能性があります。
m33lky

しかし、Node.jsを使用して、非同期の方法でファイルを提供できます。あなたはNGINXでそれを行うことができますか?
Dragos C. 2013

1
@lwansbroughは、それらのベンチマークをテーブルにもたらします。このトピックの少なくとも1人が自分の実験を行っています。
m33lky 2015

73

nginx、Express.js(静的ミドルウェア)、クラスター化されたExpress.jsを比較ab -n 10000 -c 100して、静的な1406バイトをすばやく提供しましたfavicon.ico。お役に立てれば:

ここに画像の説明を入力してください

残念ながら、私のマシンでnginxがエラーをスローし始めるので、1000または10000の同時リクエストをテストすることはできません。

編集:artvolkによって提案されたように、ここにクラスター+ staticミドルウェア(遅い)の結果があります:

ここに画像の説明を入力してください


どうもありがとうございました!このミドルウェアをfavicon:senchalabs.org/connect/favicon.htmlに使用しましたか、それとも静的ファイルとして提供しましたか?
artvolk 2013年

@artvolk the favicon one :)
gremo

3
テストにNODE_ENV = productionを設定しましたか?キャッシングstaticミドルウェアが本番環境で行うため、それは信じられないほどの違いをもたらすからです。
ラフリー、2015

19
イタリア語を話さない人のために、x軸は要求の数であり、Y軸はファイルの提供にかかったミリ秒数です。データを間違って読み取っていないことを確認したかったので、Googleで翻訳する必要がありました。このデータは信じられないほど役に立ちましたが、ここでのベンチマークテストに本当に感謝しています。結局nginxに固執することになります
JL Griffin

1
NODE_ENV =実動セットでしたか?
basickarl

11

@gremoのチャートの解釈が異なります。私と同じように、ノードとnginxの両方が同じ数のリクエスト(9-10kの間)でスケーリングしているように見えます。nginxの応答のレイテンシは常に20ミリ秒低くなりますが、ユーザーがその違いを必ずしも認識できないと思います(アプリが適切に構築されている場合)。マシンの数が決まっている場合、ノードマシンをnginxに変換する前にかなりの負荷がかかります。そのノードがほとんどの負荷が最初に発生する場所であることを考えると、これに対する1つの対抗点は、負荷分散のためにマシンをnginx専用にしている場合です。その場合は、静的コンテンツを提供することもできます。


1
「nginxの応答のレイテンシは常に20ms低くなりますが、ユーザーが必ずしもその違いを認識するとは思いません」?私はあなたたちがこれをしないことを真剣に願っています。ユーザーが1ミリ秒の違いを感じるという証拠があります。
Navin、2017年

4
引用が必要
デビッドバロウズ2018年

9

どちらの方法でも、静的ファイルをキャッシュするようにNginxを設定します。そこには大きな違いがあります。次に、ノードからサービスを提供するかどうかにかかわらず、ノードアプリで基本的に同じパフォーマンスと同じ負荷軽減が得られます。

私は個人的に、ほとんどの場合、静的アセットを提供するNginxフロントエンドのアイデアが好きではありません。

1)プロジェクトは同じマシン上にある必要があります-または、アセット(nginxマシン上)とWebアプリ(複数のマシン上でスケーリング用)に分割する必要があります

2)Nginx設定は、静的アセットのパスの場所を維持する必要があります/変更された場合は再読み込みします。


0

これは答えるのが難しい質問です。静的ファイルを提供するだけの非常に軽量なノードサーバーを作成した場合、nginxよりもパフォーマンスがよくなる可能性が高いですが、それほど単純ではありません。(これは、nodejsファイルサーバーとlighttpdを比較する「ベンチマーク」です。静的ファイルを提供するときのパフォーマンスはngingxに似ています)。

静的ファイルの提供に関するパフォーマンスは、多くの場合、作業を行うWebサーバーだけにとどまりません。可能な限り最高のパフォーマンスが必要な場合は、CDNを使用してファイルを提供し、エンドユーザーのレイテンシを削減し、エッジキャッシュのメリットを活用します。

それについて心配していなければ、ほとんどの場合、nodeは静的ファイルを問題なく提供できます。ノードは非同期コードに適しています。これは、シングルスレッドであり、すべてのブロックI / Oがプロセス全体をブロックし、アプリケーションのパフォーマンスを低下させる可能性があるため、これにも依存しています。多くの場合、非ブロッキング方式でコードを記述していますが、同期的に何かを実行している場合、ブロッキングが発生し、他のクライアントが静的ファイルを処理する速度が低下する可能性があります。簡単な解決策は、ブロッキングコードを記述しないことですが、それが不可能である場合や、必ずしも強制できない場合があります。


9
これはすべてナンセンスです。この質問は、Apacheではなくnginxに関するものです。nginxとnodeはどちらも、イベントループにlibevを使用します。Nginxはノードより何倍も高速になります。それらの1つはVMのオーバーヘッドがなく、ファイルシステムでこの操作を実行するように特別に記述されています。
エヴァンキャロル

1
libevは初期のノードでした。Libuvはこの役割を採用して、ノードがクロスプラットフォームを実行できるようにしました。
tsturzl 2014年

1
非同期コードがこれにどのように影響するかはわかりません。ノードのパフォーマンスはNginxのパフォーマンスよりもはるかに悪くなります。ディスクからファイルを読み取るように要求する多数のクライアントがある場合に実行されるブロックI / Oが原因である可能性があります。ベストプラクティスは、静的アセットに常にNginxを使用して、ノードアプリがアプリケーションロジックを処理できるようにすることです。私たちは、ノードのパフォーマンスが向上します理論的なシナリオについての話でしたが、現実の世界ではnginxのは、10のうち、マイルで9回を獲得します
WGP

-11

純粋にnode.jsが多くの面でnginxよりも優れていると確信しています。

NginXには組み込みのキャッシュがあるので、node.jsには工場出荷時にインストールされていません(自分でファイルキャッシュを作成する必要があります)。カスタムファイルキャッシュは、非常にシンプルであるため、nginxや市場の他のサーバーよりも優れています。

また、Nginxは複数のコアで実行されます。ノードの潜在能力を最大限に活用するには、ノードサーバーをクラスター化する必要があります。興味がある方は午後にどうぞ。

ノードでパフォーマンスニルヴァーナを実現するには、ディーパーを掘る必要があります。それが唯一の問題です。いったん地獄うん...それはNginxを打ち負かします。


1
私はあなたが言っていることを信じたいので、いくつかの事実をもたらす必要がありますが、現実世界に基づいている場合は、ベンチマークが必要です!エッジケースではない
Stefan Rogin

5
面白いことに、この回答には、最も高い投票で選ばれた回答と同じくらい多くの事実があります。[他のWebアプリケーションテクノロジーを挿入する]でWebサーバーを実行するように教えられたので、人々はWebサーバーを好むと思います。これは良い答えではありませんが、残念ながら+1です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.