2016-03-31 18 views
0

私はmongooseJSドライバを介してMongoDBに接続するNodeJSアプリケーションを実行しています。 AWS上でホストされ、Monitを使用してOpsWorksによって管理され、アプリケーションを存続させます。cURLは動作しますが、ノードアプリケーションのブラウザが動作しません

私が抱えている問題は、初めてアプリケーションをデプロイするときにうまく動作することです。しかし、1時間ほど後に、ブラウザでアプリケーションをロードしようとするとリクエストがタイムアウトし、サーバーからの応答が得られません。

私はアプリケーションがクラッシュしたと思っていましたが、動作していませんでしたが、そうではありません。私はブラウザーやPostmanを使ってサーバーにpingを実行することはできませんが、アプリケーションは実際に実行されており、cURLを使用してサーバーを正常にpingすることができます。

アプリケーションを再起動すると、少なくとももう一度作業が開始されます。

なぜcURLは機能しますが、ブラウザは動作しませんか?

答えて

1

この問題をしばらく追跡した後、私はそれを最終的に理解しました。問題は、アプリケーションがmongodプロセスから切断され、クラッシュまたは再接続していないことでした。

データベースから切断されたときにアプリケーションを終了すると、Monitがそれを再起動し、すべて正常になります。

問題を解決するために、データベースに再接続し、一定期間後に接続しないとアプリケーションを終了するためのロジックを追加しました。

ここに私のserver.jsファイルは、今のようになります:

'use strict'; 
 

 
//---------------------------------------------------------------------------------------------------------------------- 
 
// Dependencies 
 

 
var http = require('http'), 
 
    mongoose = require('mongoose'), 
 
    chalk = require('chalk'); 
 

 
//---------------------------------------------------------------------------------------------------------------------- 
 
// Variables 
 

 
var initialConnection = true, 
 
    connected = false, 
 
    reconnectTries = 30, 
 
    reconnectInterval = 1000; 
 

 
//---------------------------------------------------------------------------------------------------------------------- 
 
// Start Server 
 

 
function startServer() { 
 

 
    console.log(chalk.green.bold('\nSTARTING SERVER')); 
 

 
    // initialize express application 
 
    var app = require('./server/express.js')(mongoose); 
 

 
    // start http server 
 
    http.createServer(app).listen(process.env.PORT, function() { 
 
     console.log(chalk.green(' application started on port '+process.env.PORT)); 
 
    }); 
 

 
} 
 

 
//---------------------------------------------------------------------------------------------------------------------- 
 
// Stop Server 
 

 
function stopServer() { 
 

 
    console.log(chalk.red.bold('\nSTOPPING SERVER')); 
 
    console.error(chalk.red(' '+new Date())); 
 

 
    if (connected) { 
 
     mongoose.connection.close(function() { 
 
      process.exit(0); 
 
     }); 
 
    } else { 
 
     process.exit(0); 
 
    } 
 
} 
 

 
process.on('SIGINT', stopServer); 
 

 
//---------------------------------------------------------------------------------------------------------------------- 
 
// Timestamp 
 

 
console.log(chalk.bold('\n********************')); 
 
console.log(chalk.bold('\nSTARTING APPLICATION')); 
 
console.log(' '+new Date()); 
 

 
//---------------------------------------------------------------------------------------------------------------------- 
 
// Environment Variables 
 

 
console.log(chalk.blue.bold('\nENVIRONMENT VARIABLES')); 
 

 
[ 
 
    {var: 'NODE_ENV', default: 'development'}, 
 
    {var: 'PORT', default: '3000'}, 
 
    {var: 'DB_CONNECTION', default: 'localhost'} 
 
].forEach(function(env) { 
 
    if (!process.env[env.var]) {process.env[env.var] = env.default;} 
 
    console.log(chalk.blue(' '+env.var+'='+process.env[env.var])); 
 
}); 
 

 
//---------------------------------------------------------------------------------------------------------------------- 
 
// Database Connection 
 
// - http://mongoosejs.com/docs/connections.html 
 
// - http://theholmesoffice.com/mongoose-connection-best-practice/ 
 

 
console.log(chalk.cyan.bold('\nCONNECTING DATABASE')); 
 

 
// create connection 
 
mongoose.connect(
 
    'mongodb://'+process.env.DB_CONNECTION+'/signal-noise', 
 
    { 
 
     server: { 
 
      auto_reconnect: true, 
 
      reconnectTries: reconnectTries, 
 
      reconnectInterval: reconnectInterval 
 
     } 
 
    } 
 
); 
 

 
// success 
 
mongoose.connection.on('connected', function() { 
 
    if (initialConnection) { 
 
     console.log(chalk.cyan(' connected to mongodb at ' + process.env.DB_CONNECTION)); 
 
     initialConnection = false; 
 
     connected = true; 
 
     startServer(); 
 
    } else { 
 
     console.log(chalk.cyan.bold('\nRECONNECTING DATABASE')); 
 
     console.log(chalk.cyan(' connected to mongodb at ' + process.env.DB_CONNECTION)); 
 
     console.log(chalk.cyan(' '+new Date())); 
 
     connected = true; 
 
    } 
 
}); 
 

 
// error 
 
mongoose.connection.on('error',function (err) { 
 
    console.error(chalk.red.bold('\nERROR: Could not connect to MongoDB.')); 
 
    console.error(chalk.red(' '+err)); 
 
    console.error(chalk.red(' '+new Date())); 
 
    stopServer(); 
 
}); 
 

 
// disconnected 
 
mongoose.connection.on('disconnected', function() { 
 
    console.error(chalk.red.bold('\nMONGODB DISCONNECTED')); 
 
    console.error(chalk.red(' '+new Date())); 
 
    connected = false; 
 
    setTimeout(
 
     function() { if (!connected) { stopServer(); } }, 
 
     reconnectTries*reconnectInterval 
 
    ); 
 
});

関連する問題