【问题标题】:Issue with node.js app stopping on AWSnode.js 应用程序在 AWS 上停止的问题
【发布时间】:2017-12-11 02:51:33
【问题描述】:

我有一个 node.js 应用程序,它会 ping 一个 url,然后在收到错误代码时向 Slack 发送一条消息。 它可以正常工作两天,但随后停止工作。 我正在使用 Screen 来保持它运行,但它似乎仍然停止。 任何帮助将不胜感激。

代码如下:

var request = require("request")
var Hapi = require('hapi');
var Slack = require('slack-node');
var h = 0;
var s = 0;
var e = 0;

function onlineBooking(){
request({
    url: "http://example.com",
    json: true
}, function (error, response, body) {

    if (!error && response.statusCode === 200) {

        // 'if/else' checks that it receives an up respsose four times in a row 
        // the variable e is increased by .25 for every 200(ok response) until e reaches 1
        // it will then send a message that the server is up
        if(e < 1  && response.statusCode === 200){
            setTimeout(function () {
           console.log(response.statusCode) // Print the response code
            e =e+0.25;
            }, 6000); // 6 seconds delay between each response 
        }

    else {
          while(h == 0){
        console.log(response.statusCode) // Print the response code
        console.log("********************")
        slackReviewBot("Website :robot_face: ", response.statusCode + " - OK", "http://example.com", "");
            h++;
            s = 0; 
          } 
        }// end of else
    }// end of if
    else {
        console.log(response.statusCode) // Print the response code
        e = 0;
        setTimeout(function () {  
        while(s == 0){

        console.log(response.statusCode) // Print the response code
        console.log("********************")
        slackReviewBot("Website :robot_face: ", response.statusCode, "http://example.com", "");
            s++;
            h=0;
        }}, 3000);
    } // end of else

})

}

// sets the loop for checking every 7 seconds

setInterval(function(){

    onlineBooking();

}, 7000); 


//  this function sends server name, a message and url to slack
function slackReviewBot(servername, body, urls, bod) {

var time = require('time');
// Create a new Date instance
var now = new time.Date();
now.setTimezone("Europe/London");

    var bo = body; 
    var bod = bod;
    var urls = urls;
    var sname = servername; 
    // you'll need to replace the slack webhook below
    // you'll find info on webhooks here https://api.slack.com/incoming-webhooks
    var webhook_url = 'https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxx';
    slack = new Slack();
    slack.setWebhook(webhook_url);

        slack.webhook({
        channel: "#server-uptime",
        username: "Server:",
        icon_emoji: "http://4.bp.blogspot.com/-mYCTaPOu-60/VK98X5CJEyI/AAAAAAAAApM/0oplbclvnUY/s1600/unnamed.png",
        text: " " + "\n" + 
            "*" + sname + " * " + "\n" +
            "Status: " + bo + "\n" +
            now + "\n" +
            "Check the status here: " + urls + "\n" 

        }, function(err, response) {      
        console.log(response);
        }); 
}



// below is so you can send a test json object to the server
// http POST localhost:1337/jsonpost test=Test 
// you'll get a slack message letting you know the server is running
var server = new Hapi.Server();
server.connection({
    port: 1337
});

exports.add = function(i, j) {
    return i + j;
};

//  Slack function for sending the test reply
function slackReviewBot2(testserver) {
    testserver = testserver;
      // you'll need to replace the slack webhook below
    // you'll find info on webhooks here https://api.slack.com/incoming-webhooks
    var webhook_url = 'https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxx';
    slack2 = new Slack();
    slack2.setWebhook(webhook_url);


        slack.webhook({
        channel: "#server-uptime",
        username: "Server-Test-Reply:",
        icon_emoji: "http://www.wonderfulwebsites.ie/logo.png",
        text: ":star: :star: :star: :star: :star:" + "\n" + 
            "\n" + 
            "Sever is up and running!!!"

        }, function(err, response) {

        console.log(response);
        });
}


// take the json object for testing
server.route({
  method: 'POST'
, path: '/jsonpost',
handler: function(req, reply) {

     var review = {
      userName: req.payload.userName
      }
            //passes the review to the slackbot function 
            slackReviewBot2(review.userName);
            reply("Received");
    } 
});

// prints a server running message 
server.start(function(){
    console.log('server running at: ', server.info.url);
});

您可以在下面找到解释其工作原理的帖子 http://codingyoda.com/slack-pinging-tool.php

【问题讨论】:

  • 节点进程失败时是否有日志信息?有 Slack API rate limits 所以可能你没有处理来自 Slack 的 HTTP 500 错误,当你发现脚本已经死亡时,速率限制窗口已经过期,使得脚本看起来运行得很好。重启它
  • 你需要检查错误日志并显示出来。

标签: javascript node.js amazon-web-services amazon-ec2


【解决方案1】:

日志肯定会帮助我们在这里找到根本原因 - 请检查您的日志并在此处发布。正如其他答案所暗示的那样 - 任何生产环境我都建议使用 foreverPM2 在应用程序死机时重新启动它。正如@sebastian 建议的那样,如果不是原因,可能会解决问题 - 通过自动重启您的应用程序。另一个好处是这些应用程序会将您的控制台消息记录到文件中 - 这将使您(和我们)更好地了解正在发生的事情。

再想一想:您可能正在处理一个未捕获的异常。如果您认为这种情况正在发生,您可以添加一些代码来优雅地捕获、报告甚至关闭。 George Ornbo 在here 上写了一篇很棒的文章,我建议您在考虑如何处理这些异常时阅读该文章。

这是一个过于简化的代码示例,用于捕获应捕获错误的未捕获异常,更重要的是,您需要跟踪问题的根源(假设您捕获了这些日志)的堆栈跟踪:

//catches uncaught exceptions
process.on('uncaughtException', function (err) {
    console.trace("Uncaught Exception", err);
    gracefulShutdown(err);
});

// implementation beyond the scope of this question. 
function gracefulShutdown(error) {
    process.exit(error);
} 

希望对你有帮助!

【讨论】:

    【解决方案2】:

    我不知道为什么会发生这种情况,但您可以使用forever 解决此问题,如果变为非活动或崩溃(这会替换屏幕),它将重新启动进程。

    【讨论】:

    • 我在生产中广泛使用这个工具,它工作得很好,你也可以通过添加这行@reboot /usr/bin/forever start /var/www/server.json将它添加到 cron 以在启动时启动
    • 或者它可以被 docker 容器包装并使用 --restart=always 选项运行
    • 是的。 PM2 重量较重,但对于多进程环境来说是黄金。
    • PM2 更好,我在我的产品中使用它:)
    猜你喜欢
    • 2020-01-28
    • 2010-10-31
    • 2013-08-06
    • 2016-12-21
    • 1970-01-01
    • 2015-11-29
    • 2013-09-09
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多