express-15生産に関する問題

5861 ワード

実行環境

  • Expressは、本番モード、開発モード、またはテストモードでアプリケーションを実行する方法である実行環境の概念をサポートします.実際には、自分の考え通りに多くの異なる環境を作成することができます.
  • では、開発、生産、テストが「標準」環境であり、Express、Connect、サードパーティ製ミドルウェアがこれらの環境に基づいて決定される可能性があることを覚えておいてください.
  • すなわち、「一時的」な環境がある場合は、本番環境のプロパティを自動的に統合することはできません.

  • は、app.set('env', 'production')を呼び出して実行環境を指定することができるが、これは推奨されない.
  • それは、状況にかかわらず、あなたのアプリケーションがその環境でずっと実行されていることを意味します.
  • はさらに悪いことに、ある環境で実行を開始し、別の環境に切り替える可能性があります.
  • 用環境変数NODE_ENV指定実行環境がより良い
  • // `app.get('env')` :
    
    http.createServer(app).listen(app.get('port'), function(){ 
      console.log( 'Express started in ' + app.get('env') +
                    ' mode on http://localhost:' + app.get('port') +
                    '; press Ctrl-C to terminate.' );
    });
    
  • サーバを起動すると、指定されていない場合、開発モードがデフォルトモードであるため、開発モードが実行されます.
  • // :
    
    $ export NODE_ENV=production
    $ node meadowlark.js
  • Unix/BSDシステムまたはCygwinを使用する場合、ここに便利な構文があり、1回のコマンド実行期間に環境を設定するだけです:
  • $ NODE_ENV=production node meadowlark.js
  • 本番モードでExpressを起動すると、一部のコンポーネントが本番モードで使用する警告情報に適していないことに気づくかもしれません.

  • 環境固有の構成

  • は、実行環境を変更するだけではあまり役に立たないが、Expressは本番モードでコンソールにより多くの警告を出力する(例えば、廃棄されたモジュールが将来削除されることを示す).
  • 本番モードでは、ビューキャッシュがデフォルトで有効になります.
  • 実行環境は、アプリケーションが異なる環境でどのように表現すべきかを簡単に決定するために利用可能なツールです.
  • は、開発、テスト、生産環境の違いをできるだけ縮小し、つまりこの機能を保守的に使用すべきである.
  • の違いは避けられません.たとえば、プログラムが高度なデータベースドライバである場合、開発中に本番データベースを干渉したくない可能性があります.これは環境固有の構成の良好な候補です.
  • のもう一つの影響の少ない分野は、より詳細なログです.開発時に記録したい多くのものを生産環境に記録する必要はありません.

  • ログ#ログ#

  • プログラムにログを追加します.開発環境では、表示しやすいカラーテキストを出力するMorgan npm install --save morganが使用されます.
  • 本番環境では、express-logger npm install --save express-loggerを使用してログサイクルをサポートします(24時間ごとにコピーし、新しいログを開始し、ログファイルが無制限に増加することを防止します).
  • // :
    
    switch(app.get('env')){ 
      case 'development':
        //  、 
        app.use(require('morgan')('dev'));
        break;
      case 'production':
        //  'express-logger' 
        app.use(require('express-logger')({
            path: __dirname + '/log/requests.log'
        }));
        break;
    }

    ログのループ機能を実際に見たい場合は、node_を編集できます.modules/express-logger/logger.jsは、24時間から10秒に変更するなど、変数defaultIntervalを変更します(node_modulesのパッケージを変更するのは実験または学習目的のみです).

    Webサイトの拡張

  • 拡張は、通常、上方または外側に拡張することを意味する.
  • の拡張とは、サーバをより強くすることです.より速いCPU、より良いアーキテクチャ、より多くのカーネル、より多くのメモリなどです.
  • を外部に拡張することは、より多くのサーバを意味するだけです.

  • クラウドコンピューティングの流行と仮想化の普及に伴い、サーバとコンピューティング能力の相関性はますます小さくなり、ウェブサイトの拡張需要にとって、外部に拡張することはコスト収益率の高い方法である.
  • NodeでWebサイトを開発する場合は、常に外部に拡張する可能性を考慮する必要があります.

  • 外部に拡張するように設計されたWebサイトを構築する際に、最も重要なのは永続化です。

  • すべてのサーバがそのファイルシステムにアクセスできない限り、ローカルファイルシステムで永続化するべきではありません.
  • ただし、ログやバックアップなどの読み取り専用データは例外です.
  • では、たとえば、フォームからコミットされたデータをローカルの通常ファイルにバックアップして、データベースの継続的な失効を防ぐことができます.データベースが中断されると、サーバごとにファイルを収集するのは面倒ですが、少なくとも破壊されません.

  • アプリケーションクラスタで拡張

  • ノード自体はアプリケーションクラスタをサポートしており、単純で単一サーバ形式の外部拡張です.
  • アプリケーションクラスタを使用すると、システム上の各カーネル(CPU)に対して独立したサーバを作成できます(カーネル数ではなく、より多くのサーバがプログラムのパフォーマンスを向上させません).
  • アプリケーションクラスタは2つの場所にあります.
  • 第1に、所与のサーバ性能の最大化(ハードウェアまたは仮想マシン)を実現するのに役立つ.
  • は、並列条件下でプログラムをテストする低コスト方式である.

  • は、Webサイトにクラスタサポートを追加します.これらの作業は、プライマリ・プログラム・ファイルで一般的に行われていますが、クラスタ内でプログラムを実行する前に使用していた非クラスタ・プログラム・ファイルを使用する2番目のプログラム・ファイルを作成するつもりです.そのためにはまずmeadowlarkに対してjsはわずかな調整をします:
  • function startServer() { 
      app.listen(process.env.PORT || 3000, function(){
        console.log( 'Express started in ' + app.get('env') +
            ' mode on http://localhost:' + app.get('port') +
            '; press Ctrl-C to terminate.' );
      }); 
    };
    
    if(require.main === module){
      //  ; 
      startServer();
    } else {
      //  "require" :   
      //  
      module.exports = startServer;
    }
    
    // ,meadowlark.js (node meadowlark.js), require 。
  • 新しいスクリプトを作成します.meadowlark_cluster.js:
  • var cluster = require('cluster');
    
    function startWorker() {
      var worker = cluster.fork();
      console.log('CLUSTER: Worker %d started', worker.id);
    } 
    
    if(cluster.isMaster){
    
      require('os').cpus().forEach(function(){ 
        startWorker();
      });
    
      //  。 , ,
      //  exit    
      cluster.on('disconnect', function(worker){
          console.log('CLUSTER: Worker %d disconnected from the cluster.',
                      worker.id);
      });
      //  ( ) , 
      cluster.on('exit', function(worker, code, signal){
        console.log('CLUSTER: Worker %d died with exit code %d (%s)',
              worker.id, code, signal);
        startWorker();
      });
    
    } else {
    
            //  , meadowlark.js
            require('./meadowlark.js')();
    
    }
  • このJavaScriptで実行される場合、またはメインスレッドのコンテキスト(node meadowlark_cluster.jsで直接実行される場合)、またはワークスレッドのコンテキスト(Nodeクラスタシステムで実行される場合)で実行されます.
  • 属性cluster.isMasterとclusterisWorkerは、どのコンテキストで実行されるかを決定します.
  • このスクリプトを実行するとき、それはメインスレッドモードで実行され、clusterを使用します.forkは、システム内のCPUごとにワークスレッドを起動します.
  • また、ワークスレッドのexitイベントをリスニングし、死んだワークスレッドを再構築しました.最後に,else従文で作業スレッドの場合を処理する.私たちがjsはモジュールとして使用されるように構成されており、導入してすぐに呼び出す必要があります(関数として出力し、サーバを起動することを覚えておいてください).
  • OracleのVirtualBoxなどの仮想マシンを使用している場合は、VMを複数のCPUに構成する必要があります.仮想マシンのデフォルトはCPUが1つしかありません.

  • マルチコアシステムにいると仮定すると、いくつかの作業スレッドが起動していることがわかります.異なるワークスレッドが異なるリクエストを処理する証拠を見たい場合は、ルーティング前に次のミドルウェアを追加します.
    app.use(function(req,res,next){
      var cluster = require('cluster');
      if(cluster.isWorker) console.log('Worker %d received request',
          cluster.worker.id);
    });