1. ホーム
  2. javascript

[解決済み] Node.jsの「サーバー」は、NginxやApacheのサーバーと比べてどうなのか?

2022-08-30 23:55:07

質問

最近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 モジュールは、現在ではインターネット上でかなりよく試されており、信頼できるようになっています。