6. Webサーバの起動

Node.js の Webサーバー

JavaScript でプログラミング

通常、Webサーバーを構築する場合、ApacheNginxといったサービスをLinuxにインストールして利用しますが、Node.jsでWebサーバを独自に構築することもできます。サーバサイドのプログラミング言語は、JavaScriptのため勉強コストが比較的低い傾向にあります。

Node.js サーバの特徴

Node.js の Webサーバーは、軽量な処理を大量のアクセスに対応して、比較的サーバー負荷をかけずに動作させるためにノンブロッキングI/Oイベントループといった機能が特徴的です。開発ではイベントドリブン(イベント駆動型) といわれる手法でプログラミングします。

ノンブロッキングI/O

ノンブロッキングI/O は、ノンブロッキング処理ともいい、シングルスレッドで複数の処理をする仕組みです。 I/Oは、コンピュータの情報の入出力 (Input / Output) のことをさします。

ノンブロッキング処理とブロックング処理

ノンブロッキング処理は、I/O の処理待ちが発生してもすぐに関数の反応があるのが特徴で、複数処理を同時に進めながら他の処理が終わるまで待つ仕組みです。逆にブロックング処理は複数処理ではなく、1つ1つ順番に処理を実行します。

参考

Node.js:ブロッキングとノンブロッキングの概要

イベントループ

イベントループとは

イベントループは、ノンブロッキングI/Oを効率よく実行 するための仕組みです。

  • タイマーのスケジュール設定
  • イベントのコールバックをキューに追加
  • コールバックを実行
  • 次のコールバックのチェックやクローズ

サーバーが起動すると同時にイベントを待機する状態となり、JavaScript のイベントハンドラのリクエスト処理します。

非同期処理との違い

同じような仕組みに非同期処理がありますが、非同期処理I/O が完了したタイミングで通知し、完了通知があるまでの間は他の処理を進めることができます。

Node.js サーバ構築

Node.js に標準搭載されている httpモジュールを使って、Webサーバのリクエスト&レスポンスを処理します。

ファイル構成

node_server/ フォルダを作成して VSCodeで開きます。また server.js も作成しておきます。

node_server
  └── server.js

http モジュール

httpモジュールを読み込みます。

const http = require('http');

ポート&ホストの設定

ポート番号3000 とホスト名localhostを定数に設定します。また、レスポンスで表示する文字も用意しておきます。

const port = 3000;
const host = 'localhost';
const message = "Hello Node Server!\n";

サーバの作成

http.createServer() メソッドでサーバを作成し、コールバック関数で requestresponse オブジェクトが利用できます。

const app = http.createServer((req, res) => {

})

ヘッダの出力

ヘッダでは成功の 200 と、Content-Typetext/html をレスポンスします。

response.writeHead(200, {'Content-Type': 'text/html'});

レスポンスの書き込み

コールバック関数の中でレスポンスを出力します。

response.write(message);

レスポンスの終了

サーバーから返答するメソッド end() でレスポンスを終了します。

response.end();

サーバの待機

listen() メソッドでサーバを待機して、クライアントからのリクエストを待ちます。

app.listen(port, host)

ソース

server.js にサーバ起動のコードを記述します。http.createServer() のコールバック関数の引数 requestresponse を使って、サーバのリクエスト&レスポンスの処理します。

const http = require('http');
const port = 3000;
const host = 'localhost';
const message = "Hello Node Server!\n";

const app = http.createServer(function (request, resonse) {
    response.writeHead(200, {'Content-Type': 'text/html'});
    // レスポンス書き込み
    response.write(message);

    //レスポンスを閉じる
    response.end();

    console.log(`Method: ${request.method}`);
    console.log(`Response: ${message}`);
});

// ホストとポストを指定して監視
app.listen(port, host);

console.log(`Server listen: http://${host}:${port}`);

サーバの起動

VSCode のターミナルで server.js を実行してWebサーバを起動します。サーバが起動するとホストlocalhost 、ポート3000 の localhost:3000 が待機アドレスになります。

% node server.js
Server listen: http://localhost:3000

サーバの動作確認

ブラウザで http://localhost:3000 でアクセスしてみましょう。ブラウザに文字が表示されれば成功です。

ターミナルログの確認

ターミナルのログを確認します。同じ内容の GETリクエストが2回表示されますが favicon.ico も取得するためです。

Server listen: http://localhost:3000
Method: GET
Response: Hello Node Server!

Method: GET
Response: Hello Node Server!

サーバの停止

サーバの停止は、サーバ起動中のターミナル上で Ctrl + C を入力します。