私は最近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!");
});
...今、私はコードで何が起こっているのか理解しているように見えますが...用語に少し混乱しています。私は、それらが私のWebアプリケーションを保持できるコンテナーのようなものであると考えることに慣れています。 Node.jsサーバーとNginx/Apacheサーバーの違いは何ですか? Node.jsベースのサーバー(つまりコード)をNginxのようなものの中に配置して実行できるのは本当ですか? Node.jsコードは、Nginxを使用して配置および提供できるアプリケーションのようですが、なぜ両方が「サーバー」と呼ばれています。
Node.js Webアプリケーションは、NginxやApacheのような本格的なWebサーバーです。
実際、他のWebサーバーを使用せずにnode.jsアプリケーションを提供できます。コードを次のように変更するだけです。
app = express();
http.createServer(app).listen(80); // serve HTTP directly
実際、一部のプロジェクトでは、node.jsを他のサーバー(Apacheを含む)のfront-endロードバランサーとして使用しています。
Node.jsがこれを行う唯一の開発スタックではないことに注意してください。 GoのWeb開発フレームワーク、JavaおよびSwiftもこれを行います。
最初はCGIでした。 CGIは正常で、正常に機能しました。 Apacheはリクエストを取得し、URLがCGIアプリを実行する必要があることを見つけ、そのCGIアプリを実行し、データを環境変数として渡し、stdoutを読み取り、ブラウザーにデータを返します。
問題は、遅いことです。 CGIアプリが小さな静的にコンパイルされたCプログラムであったが、小さな静的にコンパイルされたCプログラムのグループの保守が困難になった場合は問題ありません。そこで人々はスクリプト言語で書き始めました。その後、それを維持することが難しくなり、人々はオブジェクト指向のMVCフレームワークの開発を始めました。今、私たちは問題を抱え始めました-提供する動的なものがない場合でも、すべての要求はすべてのクラスをコンパイルし、HTMLを提供するためにすべてのオブジェクトを作成する必要があります(フレームワークは提供する動的なものがないことを把握する必要があるため)。
リクエストごとにこれらすべてのオブジェクトを作成する必要がない場合はどうでしょうか?
それが人々の考えでした。そして、その問題を解決しようとすることからいくつかの戦略が生まれました。最も初期の方法の1つは、Apacheのmod_php
のようなWebサーバーにインタープリターを直接埋め込むことでした。コンパイルされたクラスとオブジェクトは、グローバル変数に格納できるため、キャッシュできます。別の戦略は、プリコンパイルを行うことでした。さらに別の戦略は、アプリケーションを通常のサーバープロセスとして実行し、FastCGIなどのカスタムプロトコルを使用してWebサーバーと通信することでした。
その後、一部の開発者は、単にapp-> serverプロトコルとしてHTTPを使用し始めました。実際には、アプリはHTTPサーバーでもあります。これの利点は、新しい、おそらくバグがあり、テストされていないプロトコルを実装する必要がなく、Webブラウザー(または一般的にはcurl
)を使用してアプリを直接デバッグできることです。また、アプリをサポートするために変更されたWebサーバーは必要ありません。リバースプロキシまたはリダイレクトを実行できるWebサーバーだけが必要です。
Node.jsアプリを提供するときは、自分がWebサーバーの作成者であることを確認してください。アプリの潜在的なバグは、インターネット上で直接悪用可能なバグです。一部の人々は(正当に)これに慣れていない。
Node.jsアプリの前にApacheまたはNginxのレイヤーを追加するということは、アプリへのインターフェースとして、ライブのインターネット上で、戦いでテストされ、セキュリティが強化されたソフトウェアの一部があることを意味します。わずかな遅延(リバースプロキシ)が追加されますが、ほとんどの場合、その価値があると考えられます。
これは、node.jsの初期の頃の標準的なアドバイスでした。しかし、最近では、node.jsを直接インターネットに公開するサイトやWebサービスもあります。 http.Server
モジュールは、信頼できるインターネット上でかなりよくテストされています。
NodeJsは独自のサーバーを作成します。ご覧のとおり、用語は非常に明確です。
http.createServer(app).listen(3000);
サーバーを作成し、ポート3000でhttp要求をリッスンします。
プロジェクトの1つでnginxを使用しましたが、複数のnodejsインスタンスのロードバランサーのようなものでした。
ポート3000および3001で実行されている2つのnodejsインスタンスがあるとします。今では、サーバーとしてnginx
を使用して、port 80
で実際のhttp
呼び出しをリッスンできます。 nodejs
サーバーまたはおそらくloadbalancer
のような他のサーバーへの要求。そのため、nginx
がnodejs
で提供するものなら何でも使用できます。
すでに質問されている良い質問 here 。
各顧客のウェイターがいるApache Hotelというホテルがあると仮定します。
顧客がサラダを注文するとすぐに、ウェイターはシェフのところに行き、彼に伝えます。シェフが料理を準備している間、ウェイターは待っています。ここに、
Chef => File System,
Waiter => Thread,
Customer => Event.
顧客が水を注文しても、ウェイターはサラダを提供した後にのみ持ち込みます。ウェイターは、シェフがサラダを準備するまで待ち続けます。この状態はブロッキング状態と呼ばれます。ホテルが成長した場合でも、顧客ごとに異なるウェイターを用意する必要があります。これにより、スレッド(ウェイター)のブロックが増加します。
さて、Nodeホテルに来ると、すべての顧客に対してウェイターは1人だけです。最初の顧客がスープを注文した場合、ウェイターはシェフに伝え、2番目の顧客に行きます。食べ物の準備ができたら、ウェイターが顧客に配達します。ここでは、顧客は待機しません。この状態は、非ブロッキング状態と呼ばれます。単一のwaiter(Thread)がすべての顧客にサービスを提供し、彼らを幸せにします。
したがって、シングルスレッドアプリケーションであるNodeは非常に高速です。