リバースプロキシを構成して Node.js を IIS 上でホストする方法

Node.js + Express によるテスト用ウェブサーバー

ここでは詳細は省きますが、次のようなコードで Express を用いた簡易ウェブサーバーを作成したとします。ファイル名は server.js とします。

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('Hello, world!'); 
});

app.listen(3000, () => {
    console.log('Listening on port 3000...');
});

これを実行すると、ポート 3000番で HTTP リクエストを待ち受け、GET リクエストがあった時に Hello, world! という文字を返します。

% node server.js
Listening on port 3000...

この Node.js + Express のウェブサーバーに、http://localhost/myapp/ という URL でアクセスできるようにしましょう。

URL Rewite と Application Request Routing のインストール

IIS でリバースプロキシを構成するには Application Request Routing (ARR) が必要です。 ARR は URL Rewrite モジュールに依存しているので、先に URL Rewrite をインストールします。

iis.net のウェブサイトから URL Rewite エクステンションをダウンロードしてインストールします。

Web Platform インストーラが先にインストールされていれば、WPI で URL Rewrite を探すことでもインストールできます。

引き続き Application Request Routing (ARR) をインストールします。

ARR は、IIS マネージャでサイトレベル以下ではなく、コンピュータレベルの IIS カテゴリに表示されます。

IIS のウェブアプリケーションの作成

ここでは http://localhost/myapp/ として Node.js のウェブサーバーにアクセスしたいので、 IIS のウェブアプリケーションを作成します。

物理パス (Physical path) は適当な場所で OK です。(空の専用のディレクトリをポイントすると良いと思います。)

リバースプロキシールールの設定

IIS マネージャで URL Rewrite を開きます。

新規のルールを追加します。

Reverse Proxy を選択します。

Reverse Proxy が表示されない

ルールの追加のテンプレート選択画面で、Reverse Proxy が表示されない場合は IIS のノードのレベルを間違えている可能性があります。コンピュータレベルではリバースプロキシは設定できないので、 サイト以下のレベルで Reverse Proxy テンプレートが利用可能です。

ARR のプロキシ機能が有効になっていない場合、次のような警告画面が表示されます。表示されたら OK をクリックしてください。

リバースプロキシーのルールでは、IIS から Express ウェブサーバーにどのようにアクセスするか指定します。 ここではポート番号 3000 番で待ち受けることにしていましたので、次のように設定します。

Enable SSL Offloading をチェックしておくと、クライアントと IIS 間を HTTPS 通信しているときでも IIS と Node.js (Express) 間は HTTP で通信します。

これによって、HTTPS 通信の負荷や証明書等の管理は IIS で受け持つことができ、Node.js 側では HTTP だけの設定をすれば良いことになります。

以上で設定は完了です。

動作確認

ブラウザから http://localhost/myapp/ を要求してみます。次のように表示されれば OK です。

尚、Node.js も常時起動しておく必要がありますが、PM2 などのプロセスモニターを使うと便利です。

もし、Node.js のプロセスが停止していて、IIS と Node.js 間の通信が失敗した場合には、次のようなエラーメッセージが表示されます。

以上で、IIS 上で Node.js のアプリケーションをホストする方法について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Node.js 入門