Node.jsのみを使用する場合と、Apache / NginxでNode.jsを使用する場合


224

実際のデプロイメントのサーバーとしてのみNode.jsを使用するほうがよい場合はどのような場合ですか?

Node.jsのみを使用したくない場合、Node.jsでうまく機能するものは何ですか?ApacheまたはNginx?

回答:


207

Node.jsの前に別のWebサーバーを配置することには、いくつかの理由があります。

  • Node.jsプロセスの権限/ setuidについて心配する必要はありません。通常、ルートのみがポート80にバインドできます。nginx / Apacheがrootとして開始し、ポート80にバインドし、その後そのroot権限を放棄することを心配させる場合、ノードアプリはそれについて心配する必要がないことを意味します。
  • 画像、css、js、htmlなどの静的ファイルを提供します。ノードは、適切な静的ファイルWebサーバーを使用する場合に比べて効率が低下する可能性があります(一部のシナリオではノードの方が高速かもしれませんが、これは標準ではありそうにありません)。より効率的にサービスを提供するファイルに加えて、Nodeからサービスを提供する場合と同じようにeTagやキャッシュ制御ヘッダーを処理することを心配する必要はありません。一部のフレームワークはこれを処理しますが、確認する必要があります。とにかく、おそらくまだ遅いです。
  • Matt Sergeantが回答で述べたように、意味のあるエラーページをより簡単に表示したり、ノードサービスがクラッシュした場合に静的サイトにフォールバックしたりできます。そうしないと、ユーザーはタイムアウトした接続を取得するだけです。
  • ノードの前で別のWebサーバーを実行すると、ノードに対するセキュリティの欠陥やDoS攻撃を軽減するのに役立つ場合があります。実際の例では、Nodeの前でNginxなどを実行することにより、CVE-2013-4450が阻止されます。

静的ファイルをCDN経由で、またはVarnishなどのキャッシュサーバーの背後から提供する必要があると言って、2番目の箇条書きの点に注意します。これを実行している場合、オリジンがNodeであるか、NginxであるかApacheであるかは問題ではありません。

特にnginxに関する警告:WebSocketを使用している場合は、最新バージョンのNginx(> = 1.3.13)を使用してください。これは、接続をアップグレードしてWebSocketを使用するためのサポートを追加しただけだからです。


11
express.staticETagとキャッシュ制御ヘッダーをうまく処理します。
— robertklep 2013年


4
pauljz、より低速でバックアップするためのベンチマークはありますか?@pawlakppが指摘した記事によると、Node.jsは負荷がかかるとはるかに高速になるとのことです。
— サミュエルネフ2013年

3
ここにいくつかの関連する議論があります:stackoverflow.com/questions/9967887/…いくつかの追加の視点。そこにあるベンチマーク(追加のベンチマークを要求したため)は、node.js / expressがクラスター化されていても、著しくパフォーマンスが低いことを示しています。静的ファイルの提供とリクエストの処理をノードイベントループから完全に除外し、ノードで発生する必要のある作業のためにこれらのサイクルを保存するのが最善であると私は感じています。しかし正直なところ、Nodeから静的なものを提供する場合は、問題ありません。たいしたことじゃない。
— pauljz 2013年

4
ノードのみを直接使用している場合でも、:80authbindを使用するだけでルートとしてノードを実行しなくても、予約済みポートにバインドできます:thomashunter.name/blog/using-authbind-with-node-js
— wyqydsyq

70

pauljzの回答にもう1つの理由を追加するために、フロントエンドサーバーを使用して、バックエンドサーバーを再起動するとき、またはなんらかの理由でクラッシュしたときに、最大502エラーページを提供できるようにします。これにより、ユーザーは接続を確立できないというエラーを受け取ることはありません。


28

Nodeを使用して静的ファイルを提供することは、あなたが何をしているのかを知っている限り、どのような状況でも問題ないと信じていますます。アプリケーションサーバーを使用して静的ファイルを提供することは確かに新しいパラダイムです。競合するテクノロジー(PHP、Ruby、Pythonなど)の多くが、アプリケーションサーバーの前にHTTPDやNginxなどのWebサーバーを必要とするためです。 。

Nodeで静的ファイルを提供することに対して私がこれまで読んだすべての客観的な理由は、あなたが最もよく知っているものを使用する、またはよりよくテストされた/より安定していると認められるものを使用するという考えに関係しています。これらは実際的に言えば非常に有効な理由ですが、純粋に技術的な関連性はほとんどありません。

Nodeでは不可能なクラシックなWebサーバーで可能な機能を見つけない限り(そして間違いなくそうでしょう)、どちらのアプローチでも問題ないので、あなたが最もよく知っているもの、または作業したいものを選択してください。

Nginx対Apacheについては、Nodeと同じように「プレイ」します。ノードに関係なくそれらを比較する必要があります。


2
一般的な技術比較についての良い見方:「Nodeで静的ファイルを提供することに対して私がこれまで読んだ客観的な理由は、あなたが最もよく知っているものを使用するか、よりよくテストされた/より安定していると認められるものを使用するという考えに関係しています。これらは非常に有効な理由です。実質的に言えば、純粋に技術的な関連性はほとんどありません。」最近の比較が多すぎると、偏りがあり、経験の積荷と劣っているが実績のあるテクノロジーの快適さのレベルに基づいています。
— 2015

はい、しかしそれらは本当に/主観的/理由です。客観的な理由の優れた例はベンチマークです-私が見つけたそのほとんどはnginx> nodejsを示しています(私は本当に自分でやるべきですが...)
— Nick

@ニックあなたは絶対的に正しいです。そして、私は科学的なベンチマークの専門家ではありませんが、そこにいくつかあるので、人々にそれをウェブで検索させます。ただし、2つのサーバーではなく1つのサーバーを使用することの単純さには利点があると思います。何かがうまくいかない可能性はわずかしかありません。一方、Nginxは通常、すべてのUnixライクなシステムに適切な構成のパッケージを持っていますが、Node systemdではpm2、などとの統合を理解する必要があります。 。

私はそれが反対であると思いました-ノードは、要求ごとにファイルを提供するプロセスをハンドオフする必要がなく、ローカルディスクまたはリモートクライアントは、他の何千ものクライアントがオンになっているのと同じスレッドで準備ができています。もちろん、マルチプロセッサを使用している場合、これは機能しません。ノードがそれらの使用方法を知らない限り。またはWebサーバは現在、静的なページアップサーバーに..協調的マルチタスクを使用することができます
— ジェラルド・オニール

1

補足:リバースプロキシが必要な場合、たとえば同じポートでWebsocketサーバーを実行したり、いくつかの技術を混合したりすることも重要です(NodeJSでいくつかの要求に応答し、PHPで他のいくつかに応答するなど)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.