[解決済み] Node.jsの「サーバー」は、NginxやApacheのサーバーと比べてどうなのか?
質問
最近Node.jsを勉強していて、簡単なNode.jsベースのサーバーを書くための資料に出会いました。例えば、以下のようなものです。
var express = require("express"),
http = require("http"), app;
// Create our Express-powered HTTP server
// and have it listen on port 3000
app = express();
http.createServer(app).listen(3000);
// set up our routes
app.get("/hello", function (req, res) {
res.send("Hello World!");
});
app.get("/goodbye", function (req, res) {
res.send("Goodbye World!");
});
さて、コードで何が起こっているかは理解できたようですが、専門用語には少し困惑しています。サーバーという言葉を聞くと、私は Apache や Nginx のようなものを思い浮かべます。これらは、Webアプリケーションを格納するコンテナのようなものだと考えるのに慣れています。Node.jsサーバとNginx/Apacheサーバはどう違うのでしょうか?Node.jsベースのサーバ(つまりコード)をNginxのようなものの中に入れて実行することは可能なのでしょうか?では、なぜ両方ともサーバと呼ばれるのですか?
どのように解決するのですか?
サーバーですね。
node.jsのWebアプリケーションは、NginxやApacheのような本格的なWebサーバです。
確かに、他のWebサーバを使わずに、node.jsアプリケーションを提供することができます。ただ、あなたのコードを変更してください。
app = express();
http.createServer(app).listen(80); // serve HTTP directly
実際、いくつかのプロジェクトでは、node.jsを フロントエンド ロードバランサーとして使用しているプロジェクトもあります。
node.jsは、これを行う唯一の開発スタックではないことに注意してください。Go、Java、Swift の Web 開発フレームワークもこのようなことを行っています。
なぜでしょうか?
当初はCGIでした。CGI は問題なく動作していました。Apache はリクエストを受け取り、URL が CGI アプリを実行する必要があることを見つけ、その CGI アプリを実行し、環境変数としてデータを渡し、標準出力を読み、ブラウザにデータを送り返しました。
問題は、それが遅いということです。CGIアプリが静的にコンパイルされた小さなCプログラムの時はいいのですが、静的にコンパイルされた小さなCプログラムの集団はメンテナンスが大変になりました。そこで、人々はスクリプト言語で書くようになりました。そして、それもメンテナンスが大変になり、オブジェクト指向のMVCフレームワークを開発するようになりました。たとえ動的なものがなくても、HTML を提供するために、すべてのリクエストはすべてのクラスをコンパイルし、すべてのオブジェクトを作成しなければなりません(フレームワークは、提供する動的なものがないことを理解する必要があるため)。
もし私たちがリクエストごとにすべてのこれらのオブジェクトを作成する必要がないとしたらどうでしょうか?
というのが人々の考えでした。そして、この問題を解決するために、いくつかの戦略が生まれました。最も初期のものは、ウェブサーバに直接インタプリタを埋め込むというものでした。
mod_php
のような Web サーバに直接インタプリタを埋め込むことでした。コンパイルされたクラスやオブジェクトはグローバル変数に格納されるため、キャッシュすることができます。もう一つの戦略は、プリコンパイルを行うことでした。そしてさらに別の戦略は、アプリケーションを通常のサーバープロセスとして実行し、FastCGI のようなカスタムプロトコルを使用して Web サーバーと通信することでした。
その後、一部の開発者は、アプリのサーバープロトコルとして単に HTTP を使用するようになりました。事実上、アプリは HTTP サーバーでもあります。この利点は、新しい、バグのある、テストされていない可能性のあるプロトコルを実装する必要がなく、Web ブラウザを使用して直接アプリをデバッグできることです (または、一般的に。
curl
). また、リバース プロキシまたはリダイレクトを実行できる任意の Web サーバーで、アプリをサポートするために変更された Web サーバーは必要ではありません。
なぜ Apache/Nginx を使うのですか?
node.js のアプリを提供する場合、あなた自身がウェブサーバの作者であることに注意してください。あなたのアプリの潜在的なバグはすべて、インターネット上で直接悪用可能なバグです。一部の人々は、(当然ながら)これを快く思っていません。
node.js アプリの前に Apache または Nginx のレイヤーを追加することは、アプリへのインターフェイスとして、インターネット上で動作するテスト済みでセキュリティ強化されたソフトウェアの一部を使用することを意味します。リバース プロキシによる)わずかな遅延が追加されますが、ほとんどの人はそれに見合う価値があると考えています。
これは、node.js の初期のころの標準的なアドバイスでした。しかし最近では、node.js をインターネットに直接公開するサイトや Web サービスもあります。その
http.Server
モジュールは、現在ではインターネット上でかなりよく試されており、信頼できるようになっています。
関連
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] JavaScriptで2つの日付を比較する
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsを完全にアンインストールして、最初から再インストールする方法 (Mac OS X)
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.js + Nginx - 今度は何?
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Node.js + Nginx - 今度は何?
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる