Node.js_node.js を実行するための IIS 拡張機能 iisnode のインストールと構成に関するメモ

WBOY
リリース: 2016-05-16 16:11:44
オリジナル
1490 人が閲覧しました

今年の初めに、Node.js を使用して Express フレームワーク に基づいてブログ プログラムを書き直し、ASP.NET に別れを告げる予定でした。ただし、現在使用している VPS は Windows Server システムと IIS サーバーであり、Express と IIS の両方がポート 80 をリッスンできる場合、明らかに競合が発生します。幸いなことに、IIS で Node.js プログラムをホストできる iisnode という拡張機能があります。さらに、このようなホスティングは、IIS のさまざまな機能 (プロセス管理、GZip 圧縮、ログ、キャッシュ、アクセス許可制御、ドメイン名のバインドなど) を使用できることも意味します。

iisnode を使用するには、以下をインストールする必要があります:

1.Node.js
2.IIS の URL 書き換えモジュール
3.iisnode

インストール後、通常の操作に従って、Express プログラムのディレクトリを指定してサイトを作成します。
は、web.config ファイルを追加することです。

コードをコピー コードは次のとおりです:

<設定>

                                                                                     
                                                                                         
                                                                                                                                                                                                                                                                                                           &lt; match url = " /*" /&gt;

で                                                                                        
                                                                                           




このコンテンツは、IIS マネージャーのビジュアル インターフェイスを通じて構成することもできます。おそらく、すべてのリクエストを bin/www に書き換え、iisnode 拡張機能を使用して bin/www を実行することを意味します。ただし、サイトを開いた後、次のエラー メッセージが表示されました:



コードをコピー


コードは次のとおりです:

リクエスト フィルタリング モジュールは、hiddenSegment セクション を含む URL のパスを拒否するように構成されています。 最初はよくわからないと思っていましたが、ASP.NET の bin ディレクトリはアクセスが許可されていない特別なディレクトリであることに突然気づきました。リクエストを bin/www に書き換えると、たまたまこのルールにヒットします。したがって、ディレクトリ名を変更するだけです。たとえば、起動する bin を変更します (これは良い習慣ではないことがわかりました。これについては後ほど説明します)。web.config もそれに応じて調整する必要があります。


コードをコピー


コードは次のとおりです:

<設定>

                                                                                     
                                                                                         
                                                                                                                                                                                                                                                                                                           &lt; match url = " /*" /&gt;


                                                                                       
                                                                                           




IIS マネージャーでサイトを再起動し、再度アクセスします。これは簡単ではありません。しかし、喜ぶにはまだ早すぎました。

プログラムの機能をテストする過程で、取得した IP が空であることがわかりました。 Express フレームワークでは、IP は req.ip を通じて取得され、リクエスト ヘッダーの REMOTE_ADDR から値が取得されます。簡単なテスト コードにより、REMOTE_ADDR の値も空であることがわかりました。明らかに、このヘッダー情報は IIS から Node.js へのプロセスで失われています。 Google で調べた結果、iisnode には
この問題

があることがわかりました。公式の解決策は X-Forword-For を使用することですが、別の方法を見つけました。

Web.config には REMOTE_ADDR を保持できる構成 ( の前に追加) があります:

コードをコピー


コードは次のとおりです:
指示に従って、予約された REMOTE_ADDR は x-iisnode-REMOTE_ADDR という名前に変更されるため、req.ip の値を一度上書きし、Express app.js にミドルウェア関数を追加する必要があります。


コードをコピー



しかし、このように調整しても取得した IP は空のままであるため、req.ip の割り当てが失敗したのではないかと疑ってしまいます。 Express のソース コードを見ると、req.ip がdefine getter によって定義されていることがわかります。そのため、上書きするには、再度定義する必要があります。



コードをコピー

コードは次のとおりです: app.use(function(req, res, next) { Object.defineProperty(req, 'ip', { get: function() { return this.headers['x-iisnode-REMOTE_ADDR'] } });
next();
});



この問題は最終的には解決されましたが、これは良い方法ではありません。将来、Express が req.ip を読み取り専用に設定すると面倒になります。

テストを続けていると、別の問題が発見されました。通常、ブログバックグラウンドのファイルアップロード機能では、public/uploadディレクトリにファイルを転送しますが、実際には、public/uploadフォルダは起動ディレクトリ(元のbinディレクトリ)に生成されます。実際、その理由は、プログラム エントリとしての www ファイルが起動ディレクトリにあるため、起動ディレクトリがアプリケーションの実行ディレクトリになるためです。私の解決策は、起動ディレクトリの名前を bin に戻し、ルート ディレクトリに bin/www を呼び出す launch.js を作成することです。

コードをコピー


コードは次のとおりです: #!/usr/bin/env ノード require('./bin/www');

その後、程序エントリーを launch.js に変更します:

复制代 代码如下:

<設定>
   
        <ハンドラー>
           
       

<書き換え>
            <ルール>
                <ルール名="すべて">
                    <一致 url="/*" />
                   
               
           
       



   

しかし、iisnode も成熟した製品ではなく、当然 Node.js も成熟した製品ではなく (現在は 1.0 ではありません)、すべてが今後の探索と完成を待っています。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!