gorogoronyan FC2

Node.js: HTTPサーバーのサンプル

ローカル HTTP サーバーを動かして HTML を送信する

ローカルホスト の HTTP サーバーの一番単純なサンプルです。 PC 内で HTTP サーバーを動かし、同じ PC 内 (ローカル) からアクセスします。 プログラムを実行して、 ブラウザから http://127.0.0.1/ でアクセスすると HTML を表示します。

TestNodejs_http_server1.js の実行結果
TestNodejs_http_server1.js の実行結果

すでにファイアウォールなどがポート80を使用している場合は プログラムを実行したときにエラーになるので、 プログラムのポート番号を81などに変えて、 http://127.0.0.1:81/ でアクセスしてください。

let http = require("http");
let ip = "127.0.0.1";  //サーバーのIPアドレス
let port = 80;         //ポート番号
let html = '<!DOCTYPE html>\n<meta charset="UTF-8"/>\n<h1>Hello,こんにちは</h1>';

http.createServer( function(req, res){
	//HTTPリクエストを受け取ったら、html を返す。

	//レスポンスヘッダーを送信する。
	//200 は http のステータスコードで OK という意味。
	res.writeHead(200, { "Content-Type" : "text/html" });

	//htmlを送信する。
	res.end(html);
}).listen(port, ip);
console.log("run server");

プログラムの説明

資料リンク

単純な HTTP サーバーのサンプル、その1

上のサンプルの HTML を送信している部分を、 ファイル読み込みと送信の処理に置き換えると簡単な HTTP サーバーになります。

実行例
実行例

このサンプルでは処理の流れを分かりやすくするため、 ファイルの読み込みのところで readFileSync() を使っています。

1) HTTPリクエストを受け取る。
  function session() が呼ばれる。

2) ファイルを全部読む。
  let content = FS.readFileSync(path);

3) レスポンスを送信する。
  res.writeHead(200, { "Content-Type" : ctype });
  res.end(content);

本格的なサーバーでは上の処理ではまずいことになります。 たとえば 100MB ほどのファイルがあり、これをダウンロードしようとすると、 サーバーは 100MB分のデータをメモリに読み込んだ後で レスポンスを送信するという話になります。 これでは効率が悪いので 本格的なサーバーではストリームを使って少しずつデータを読んで逐次送信します。 サーバーのプログラムは 本格的な話になるとストリームやコールバックやスレッドを多用し、 排他制御も考慮した複雑なプログラムになります。

node.js の HTTP サーバーで簡易 HTML 作成

上のサーバーとテキストファイルを HTML に変換するツールをつなげたサンプルです。

TestNodejs_http_server3.js 実行
TestNodejs_http_server3.js 実行

セキュリティ関連の話

JavaScript では iframe や XMLHttpRequest などで 同一生成元ポリシー (same origin policy: セイムオリジンポリシー) の話が出てきます。 Web ブラウザ上に表示されたページの JavaScript が 外部のホストにアクセスするときに、 JavaScript をダウンロードしたホストとは異なるホストにアクセスするのを制限する仕組みです。

Web の JavaScript でもときどき CORS エラー (クロスオリジンエラー) の話が出てきます。 セイムオリジンポリシーの制限にひっかかる処理を行おうとすると このエラーが出ます。

例えば上のような HTTP サーバーを PC でローカルに動かして、 PC のストレージ上にある任意のファイルに Web ブラウザからアクセス できるようにしたとします。 ファイルにアクセスするときの URL のパラメータの指定の仕方も分かっていると仮定します。

もしもセイムオリジンポリシーの制限がないとどうなるか?。 外部の Web ホストにある JavaScript をダウンロードして実行したときにもローカルサーバーにアクセスして、 そこから得たデータを外部ホストにせっせと転送できるようになります。 これだとセキュリティ上まずい話になります。 セイムオリジンポリシーはこのような理由で存在しています。 XMLHttpRequest で異なるホストにアクセスできない理由もこのためです。 Java のアプレットでも同様の制限があります。

上のようなローカルサーバーのサンプルも 変な機能を安易に追加するとセキュリティトラブルの原因になります。 まずい機能の例として、 PC 上のどのファイルにもアクセスできる機能や Web ブラウザ上からシェルコマンドを実行する機能などがあります。 ということで、 上のサンプルも PC 内で完結するローカルお試し以外の用途には 使わないでください。 ホーム LAN、家の中だけの WiFi サーバーぐらいの用途でもすぐに危険だらけと考えてください。 この種の用途には もっと厳格なセキュリティ管理 (ユーザー認証、アクセス範囲の制限、 実行できる処理の制限など) が必要になります。

他の言語との比較

Java で上のサンプルと同じ話をすると、 JDK (Java SE Development Kit) のインストールからツールの使い方、 プログラムの作成、コンパイル、実行までけっこう手間がかかります。 C# + Visual Studio ぐらいになると眺める気にもなりません・・・ (C# は Windows に標準で付属しているコマンドラインツールだけでも作れるのだけど・・・ C# はじめの一歩)。

ちょっと眺めるなら Node.js はとても楽です。 すぐにローカルサーバーを作って、HTML を表示したり JavaScript のテストをしたりできます。

関連

inserted by FC2 system