サーチ…


備考

ビューを使った仮想ディレクトリ/ネストされたアプリケーション

View Engineを使用してExpressを使用してビューをレンダリングする場合、ビューにvirtualDirPath値を渡す必要があります

`res.render('index', { virtualDirPath: virtualDirPath });`

これを行う理由は、アプリケーションと静的リソースパスによる他のビューホストへのハイパーリンクを、展開後にすべてのビューを変更することなくサイトがホストされている場所を知ることができるようにするためです。これは、IISNodeで仮想ディレクトリを使用する場合、より面倒で退屈な落とし穴の1つです。

バージョン

上のすべての例は

  • Express v4.x
  • IIS 7.x / 8.x
  • Socket.io v1.3.x以上

入門

IISNodeを使用すると、.NETアプリケーションのようにNode.js Web AppsをIIS 7/8でホストすることができます。もちろん、Windows上でnode.exeプロセスを自分でホストすることはできますが、IISでアプリケーションを実行するだけの理由は何ですか。

IISNodeは複数のコアのプロセスmanageementオーバースケーリング処理するnode.exe 、およびを自動リサイクルアプリが更新されるたびに、ちょうどその数名にあなたのIISアプリケーションの利点を

要件

IISでNode.jsアプリケーションをホストするには、IISNodeにいくつかの要件があります。

  1. Node.jsは、32ビットまたは64ビットのいずれかのIISホストにインストールする必要があります。
  2. IISNodeはx86またはx64をインストールしましたが、これはIISホストのビット数と一致する必要があります。
  3. IISホストにインストールされたIIS用Microsoft URL書き換えモジュール
    • これは重要です。そうしないと、Node.jsアプリケーションへのリクエストは期待どおりに機能しません。
  4. Node.jsアプリケーションのルートフォルダにあるWeb.config
  5. Web.config内のiisnode.ymlファイルまたは<iisnode>要素を使用したIISNode構成。

Expressを使用した基本的なHello Worldの例

この例を有効にするには、IISホストでIIS 7/8アプリケーションを作成し、Node.js Web Appを含むディレクトリを物理ディレクトリとして追加する必要があります。アプリケーション/アプリケーションプールIDがNode.jsのインストールにアクセスできることを確認します。この例では、Node.jsの64ビットインストールを使用しています。

プロジェクトストラクチャ

これは、IISNode / Node.js Webアプリケーションの基本的なプロジェクト構造です。 Web.config追加する以外は、IISNode以外のWebアプリケーションとほぼ同じWeb.config

- /app_root
  - package.json
  - server.js
  - Web.config

server.js - Expressアプリケーション

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

// We need to get the port that IISNode passes into us 
// using the PORT environment variable, if it isn't set use a default value
const port = process.env.PORT || 3000;

// Setup a route at the index of our app    
server.get('/', (req, res) => {
    return res.status(200).send('Hello World');
});

server.listen(port, () => {
    console.log(`Listening on ${port}`);
});

構成とWeb.config

Web.configは、他のIIS Web.config同様Web.configが、URL <rewrite><rules>とIISNode <handler> 2つが存在しなければなりません。これらの要素は両方とも<system.webServer>要素の子です。

構成

IISNodeは、 iisnode.ymlファイルを使用するか、 <iisnode>要素をWeb.config <system.webServer>子として追加することで構成できます。これらの設定の両方がしかし、この場合には、互いに組み合わせて使用することができますWeb.config指定する必要がありますiisnode.ymlファイルをAND 任意の構成の競合から取るだろうiisnode.yml代わりにファイル 。この構成のオーバーライドは、逆もありえません。

IISNodeハンドラ

IISがserver.jsにNode.js Web Appがserver.jsれていることを知るには、明示的にそれを伝える必要があります。これを行うには、IISNode <handler><handlers>要素に追加し<handlers>

<handlers>
  <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
</handlers>

URL書き換えルール

設定の最後の部分は、Node.jsアプリケーションがIISインスタンスに送られることを意図したトラフィックがIISNodeに向けられていることを保証することです。 URL書き換えルールがなければ、 http://<host>/server.jsにアクセスしてアプリケーションを訪問する必要がありhttp://<host>/server.jsさらに悪いことに、 server.jsから提供されるリソースをリクエストしようとすると404が表示されます。これは、IISNode WebアプリケーションでURLの書き換えが必要な理由です。

<rewrite>
    <rules>
        <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
        <rule name="StaticContent" patternSyntax="Wildcard">
            <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
            <conditions>
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
            </conditions>
            <match url="*.*"/>
        </rule>

        <!-- All other URLs are mapped to the Node.js application entry point -->
        <rule name="DynamicContent">
            <conditions>
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
            </conditions>
            <action type="Rewrite" url="server.js"/>
        </rule>
    </rules>
</rewrite>

これは、 64ビットのNode.jsインストール用に設定された、 この例の作業用のWeb.configファイルです


これで、IISサイトにアクセスし、Node.jsアプリケーションが動作することを確認します。

IIS仮想ディレクトリまたはネストされたアプリケーションを経由する

IISで仮想ディレクトリまたはネストされたアプリケーションを使用するのが一般的なシナリオであり、おそらくIISNodeを使用するときに活用したいと考えています。

IISNodeは、仮想ディレクトリまたはネストされたアプリケーションを構成経由で直接サポートしていないため、これを実現するために構成の一部ではなく、あまり知られていないIISNodeの機能を活用する必要があります。 AppSettingキーを使用して、 Web.configを持つ<appSettings>要素のすべての子がプロパティとしてprocess.envオブジェクトに追加されます。

<appSettings>ディレクトリに仮想ディレクトリを作成します。

<appSettings>
  <add key="virtualDirPath" value="/foo" />
</appSettings>

Node.jsアプリケーション内で、 virtualDirPath設定にアクセスできます

console.log(process.env.virtualDirPath); // prints /foo

これで設定用の<appSettings>要素を使用できるようになりました。これを利用して、サーバーコードで使用できます。

// Access the virtualDirPath appSettings and give it a default value of '/'
// in the event that it doesn't exist or isn't set
var virtualDirPath = process.env.virtualDirPath || '/';

// We also want to make sure that our virtualDirPath 
// always starts with a forward slash
if (!virtualDirPath.startsWith('/', 0))
  virtualDirPath = '/' + virtualDirPath;

// Setup a route at the index of our app    
server.get(virtualDirPath, (req, res) => {
    return res.status(200).send('Hello World');
});

virtualDirPathを静的リソースとともに使用することもできます

// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));

それらのすべてをまとめることができます

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

const port = process.env.PORT || 3000;

// Access the virtualDirPath appSettings and give it a default value of '/'
// in the event that it doesn't exist or isn't set
var virtualDirPath = process.env.virtualDirPath || '/';

// We also want to make sure that our virtualDirPath 
// always starts with a forward slash
if (!virtualDirPath.startsWith('/', 0))
  virtualDirPath = '/' + virtualDirPath;

// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));

// Setup a route at the index of our app    
server.get(virtualDirPath, (req, res) => {
    return res.status(200).send('Hello World');
});

server.listen(port, () => {
    console.log(`Listening on ${port}`);
});

IISNodeでSocket.ioを使用する

IISNodeでSocket.ioを使用するには、 Web.config内に仮想ディレクトリ/ネストされたアプリケーションを使用しない場合に必要な変更のみが必要Web.config

/socket.ioは/socket.ioで始まる要求を送信するので、IISNodeはIISにも通信する必要があります。これはIISNodeも処理する必要があり、静的ファイル要求やその他のトラフィックではありません。これには、標準IISNodeアプリケーションとは異なる<handler>が必要です。

<handlers>
    <add name="iisnode-socketio" path="server.js" verb="*" modules="iisnode" />
</handlers>

<handlers>変更に加えて、追加のURL書き換えルールも追加する必要があります。書き換えルールは、すべての/socket.ioトラフィックを、Socket.ioサーバーが実行されているサーバーファイルに送信します。

<rule name="SocketIO" patternSyntax="ECMAScript">
    <match url="socket.io.+"/>
    <action type="Rewrite" url="server.js"/>
</rule>

IIS 8を使用している場合は、 Web.config WebSockets設定を無効にし、上記のハンドラとルールを書き換える必要があります。これはwebSocketのサポートがないためIIS 7では不要です。

<webSocket enabled="false" />



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow