Nodeを実行します.jsのIIS拡張iisnodeインストール構成ノート

4642 ワード

今年の初めにNodeを使うつもりです.jsはExpressフレームワークに基づいてブログプログラムを書き換え、これからASPに別れを告げる.NET.しかし、私が現在使用しているVPSはWindows Serverシステム、IISサーバであり、ExpressとIISの両方に80ポートをリスニングさせると、明らかに競合が発生します.幸いなことに、iisnodeという拡張子がNodeをjsプログラムはIISに管理されている.また,このように管理した後もIIS内の各種機能(プロセス管理,GZip圧縮,ログ,キャッシュ,権限制御,ドメイン名バインドなど)を利用できることを意味する.
iisnodeを使用するには、次の手順に従います.
1.Node.js 2.IISのURL Rewriteモジュール3.iisnode
インストール後、IISマネージャでサイトを作成するか、Expressプログラムのディレクトリを指すか、通常の操作に従ってWebを追加するかが重要です.configファイル:
 
  

   
       
           
       

       
           
               
                   
                   
               

           

       

   




このコンテンツはIISマネージャのビジュアル化インタフェースで構成することもできます.すべてのリクエストをbin/wwwに書き換え、iisnode拡張を使用してbin/wwwを実行することを意味します.しかし、サイトを開くと、次のようなエラーメッセージが表示されます.
 
  
hiddenSegment URL

最初は不明だと思っていたので、急に悟った.NETのbinディレクトリはアクセスが許可されていない特殊なディレクトリです.リクエストをbin/wwwに書き換えて、ちょうどこのルールに命中しました.だから、ディレクトリ名を変えればいいです.例えばbinをlaunchに変えればいいです.configも調整に対応します.
 
  

   
       
           
       

       
           
               
                   
                   
               

           

       

   




IISマネージャでサイトを再起動してから再度アクセスし、やっと稼働したので、大変でした!でも、喜ぶのは早すぎる.
プログラムの機能をテストしているうちに、取得したIPが空であることがわかりました.Expressフレームワークでは、IPはreq.ipは取得し、req.ipはまたリクエストヘッダからのREMOTE_ADDRは値を取得する.簡単なテストコードで、REMOTE_を発見しました.ADDRの値も空です.明らかにIISからノードまでjsの過程で、このヘッダ情報が失われた.Googleはその後、iisnodeにこの問題があることを発見し、公式に提供された解決策はX-Forword-Forを使用することだったが、私はまた別の方法を発見した.
Web.configにはREMOTE_を保持できる構成(前に追加)があります.ADDR:
 
  


説明に従って、保留中のREMOTE_ADDRはx-iisnode-REMOTE_と改名されますADDRだからreqをipの値を1回上書き、Expressのapp.jsにミドルウェア関数を追加します.
 
  
app.use(function(req, res, next) {
    req.ip = req.headers['x-iisnode-REMOTE_ADDR'];
    next();
});

しかし、このように調整すると、取得したIPがまだ空であることは疑わしい、req.ipの付与に失敗したのではないでしょうか.Expressのソースコードを見ると、req.ipはdefine getterで定義されているので、それを上書きするにはもう一度defineしなければなりません.
 
  
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というディレクトリにファイルを転送しますが、実際にはlaunchディレクトリ(つまり元のbinディレクトリ)の下でpublic/uploadフォルダが生成されます.実はプログラムエントリであるwwwファイルがlaunchディレクトリの下にあるため、launchディレクトリはアプリケーションの実行ディレクトリとなっている.私の解決策は、launchディレクトリの名前をbinに変更し、ルートディレクトリの下にlaunchを作成することです.jsはbin/wwwを呼び出します:
 
  
#!/usr/bin/env node

require('./bin/www');


プログラムのエントリをlaunchに変更しますjs:
 
  

   
       
           
       

       
           
               
                   
                   
               

           

       

       
   




明らかにiisnodeはまだ成熟した製品ではありません.もちろんNode.jsもそうではありません(まだ1.0ではありません)、すべてはさらに探求され、改善されなければなりません.