normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Node.js on Windows Azureを試してみる

最近はやりの Node.js 、私のブログの読者各位にも試している方はいるだろうか。 Node.js とは、「サーバサイド JavaScript」の実装の一つだ。画面側(HTML)のロジックとしてのJavaScriptでなく、サーバ側のロジックとしてJavaScriptを記述することが可能である。 Node.js の基礎を最初に学びたい方は、別途以下の記事を参照して頂きたい。

さらに直近、ついに Node.js の Windows 版のバイナリである 「node.exe」 がリリースされた*1。今回は、こちらの node.exe を利用してWindows Azure 上で Node.js を動作させるまでを紹介する。

node.exe 単体で動作させる

Windows Azure 上でなく、 Node.js 単体で動作させる。まず、 Node.js 本家 から node.exe をダウンロードしてほしい。

次に、以下のソースコードを作成する。

  • example.js
var http = require('http');

http.createServer(function (request, response) {
    response.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8;' });
    response.end('node.js on Windows Azure はすごく普通過ぎる。。。エロロス。\n');
}).listen(8080);

詳細な解説は省略するが、以下が主な概要だ。

  • Node.js を利用して example.js を「サーバサイドJavaScript」として実行
  • 8080ポートでユーザからのリクエストを待ち受ける
  • ユーザからのリクエストに対し、「node.js on Windows Azure はすごく普通過ぎる。。。エロロス。」文字列を返す

コマンドラインを利用して、以下の要領で作成したソースコードを実行する。

>node.exe example.js

コマンドラインから node.exe を実行後、ブラウザから http://localhost:8080/ にアクセスしアプリケーションの動作を確認する。以下の画像のようになれば、アプリケーションが正常に動作している。

Windows Azure 上で node.exe を動作させる on Compute Emulator

Node.js の基本的な動作方法を理解したところで、実際に Windows Azure 上で動作させる手順を紹介する。まず、 Visual Studio 2010 を立ち上げ、Workerロールを一つもつ Windows Azure プロジェクトを作成して頂きたい。

node.exe と example.js の配置

次に、作成したソリューション内に「node/」フォルダを作成し、こちらに node.exe と example.js を配置する。以下の画像例を参考にすること。

さらに、プロパティシートから node.exe と example.js に対して 「出力ディレクトリにコピー」を「常にコピーする」に設定すること。

エンドポイントの設定

Workerロールに対し、外部からアクセスするためにエンドポイントを設定する。以下の画像例を参考に設定してほしい。

名前 種類 プロトコル パブリックポート プライベートポート
HttpIn Input tcp 80 8080

こちらで設定する プライベートポートでは以下に注意が必要なので留意して頂きたい。

  • プライベートポートと example.js の http.createServer.listen() メソッド引数の値は一致している必要がある
  • Compute Emulatorでは同じポートに複数インスタンスをバインドできないため、インスタンスを2個以上に指定できない
WorkerRole.cs の修正

以下に修正した WorkerRole.cs の内容を記述する。ソースコードを見れば特に解説は不要だと思うが、 System.Diagnostics.Process クラスを利用して node.exe に実行をデリゲートしている。

using System;
using System.Diagnostics;
using System.Net;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace WorkerRole1
{
    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
        {
            // これはワーカーの実装例です。実際のロジックに置き換えてください。
            Trace.WriteLine("node.js on Windows Azure開始!", "Information");

            var proc = new Process();
            var procStartInfo = new ProcessStartInfo();

            // なぜか Path.Combine() メソッドを利用するとエラーが出る。。。
            //procStartInfo.FileName = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot"), @"approot\node\node.exe");
            //procStartInfo.Arguments = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot"), @"approot\node\example.js");
            
            //ファイル名、パス名ともに絶対パスで指定する
            procStartInfo.FileName = Environment.GetEnvironmentVariable("RoleRoot") + @"\approot\node\node.exe";
            procStartInfo.Arguments = Environment.GetEnvironmentVariable("RoleRoot") + @"\approot\node\example.js";
            procStartInfo.UseShellExecute = false;
            proc.StartInfo = procStartInfo;
            proc.Start();

            //プロセスが終了するまで次行で止まるため、whileループが不要
            proc.WaitForExit();

            throw new Exception("node.js が死亡");
        }

        public override bool OnStart()
        {
            // 同時接続の最大数を設定します
            ServicePointManager.DefaultConnectionLimit = 12;

            // 構成の変更を処理する方法については、
            // MSDN トピック (http://go.microsoft.com/fwlink/?LinkId=166357) を参照してください。

            return base.OnStart();
        }
    }
}

Compute Emulator上で実行する際も、 node.exe 単体で動かした場合と同様 http://localhost:8080/ にアクセスする。無事レスポンスが帰ってくれば、アプリケーションは無事動作している。

Windows Azure 上で node.exe を動作させる on Windows Azure ホスティッドサービス

次に、Windows Azure プロジェクト側を右クリックし、[発行]を選択して任意のホスティッドサービスにアプリケーションを展開する。アプリケーションの展開が完了した後、ホスティッドサービスのURL(例:http://normalian-feasibility-test.cloudapp.net/)に対して、80番として指定したパブリックポートに対してアクセスする。以下の画像例のようになればアプリケーションは無事動作している。

パブリックポートとプライベートポートについて

Compute Emulatorでは8080番ポート/ホスティッドサービス上では80番ポート、この解説に混乱した方も居るのではないだろうか。残念ながら私自身もこちらについて詳細な解説ができるほどの理解はできていない。以下のように twitter 上で議論している段階だ。こちらも合わせて参考にして頂きたい。

次回の Node.js on Windows Azure は?

Node.jsのアプリケーションからストレージサービスの操作を考えている。是非期待して頂きたい。

*1:次の記事を参照のこと http://www.publickey1.jp/blog/11/nodejswindowsnodeexe.html