寻求Nodejs的故障恢复方法

寻求Nodejs的故障恢复方法

抽空看了下《node.js开发指南》 里面提到: –“当程序有错误发生时,整个进程就会结束,需要重 新在终端中启动服务器。这一点在开发中无可厚非,但在产品环境下就是严重的问题 了,因为一旦用户访问时触发了程序中某个隐含的bug,整个服务器就崩溃了,将无 法继续为所有用户提供服务。在部署Node.js 应用的时候一定要考虑到故障恢复,提 高系统的可靠性。”

想想看确实是啊,而有google上搜了一下也没有相关介绍。

还请大虾们有空来讨论一下啊。

15 回复

在生产环境中使用 Node.js 时,确保应用程序能够在遇到错误时自动恢复是一个非常重要的方面。这不仅可以提高系统的可用性,还能减少运维人员的工作负担。以下是一些常见的故障恢复策略和实现方法:

1. 使用 foreverpm2

foreverpm2 是两个流行的 Node.js 进程管理工具,它们可以自动重启崩溃的应用程序。

使用 forever

首先,你需要全局安装 forever

npm install -g forever

然后,你可以通过以下命令启动你的 Node.js 应用程序:

forever start app.js

如果应用崩溃或意外退出,forever 会自动重新启动它。

使用 pm2

安装 pm2

npm install -g pm2

启动应用:

pm2 start app.js

pm2 还提供了更多的功能,如日志管理、负载均衡等。

2. 自动化脚本

你也可以编写简单的自动化脚本来监控和重启应用。例如,一个简单的 Bash 脚本:

#!/bin/bash

while true; do
    node app.js
    sleep 1
done

保存这个脚本并运行它:

./restart_app.sh

3. 错误处理

在代码层面,你应该添加适当的错误处理逻辑来捕获和处理异常。例如:

process.on('uncaughtException', (err) => {
    console.error('Uncaught Exception:', err);
    process.exit(1); // 可以选择使用自动重启工具
});

process.on('unhandledRejection', (reason, p) => {
    console.error('Unhandled Rejection at: Promise ', p, ' reason: ', reason);
});

4. 日志记录

使用日志库(如 Winston)记录应用的日志信息,以便在出现问题时能够快速定位问题所在。

const winston = require('winston');

const logger = winston.createLogger({
    levels: winston.config.npm.levels,
    transports: [
        new winston.transports.Console({ level: 'info' })
    ]
});

logger.info('Application started');

这些方法可以帮助你在生产环境中更可靠地运行 Node.js 应用程序。结合使用这些策略,可以大大提高应用的稳定性和可用性。


有相关的模块和插件能控制。另外如果你部署在云服务上的话,这样的问题他们会去做。

楼主自相矛盾啊

“一旦用户访问时触发了程序中某个隐含的bug,整个服务器就崩溃”

“在部署Node.js 应用的时候一定要考虑到故障恢复”

如果用户不断触发这个BUG呢,故障是不是也要无限循环恢复(重启进程)? JS的致命错误会导致进程终止这是事实,解决方法无非2个

1.做好容错方面的测试,让程序没有BUG;对于功能固定的应用,这是容易办到的

2.多使用try catch语句

不过应用不是自己开发的,单纯的重启进程非常危险;一般情况下该死进程的时候还是让它死掉比较好

这该说什么好呢,还是感谢这位兄弟的热心回答。

说到底,这是个质量控制的问题,用什么web server都一样,能预测的致命的bug就不应该存在! 推广一下,假设操作系统也有这样的bug,你又能怎样呢?比如windows的蓝屏~,windows能自己处理蓝屏的话,蓝屏就不会存在了。

程序是人写的,不能指望程序自己“永远不死”,真有这一天的话…尼奥必须出来拯救世界了~~

process.on('uncaughtException', function (err) {
  // 当有异常未处理时(原本应该是自动退出进程的),监听uncaughtException事件可以
  // 避免进程退出,在此处记录err出错信息,以便以后找到你的程序中隐含的Bug
});

参考这里:http://nodejs.org/api/process.html#process_event_uncaughtexception

不过,在写程序时就应该考虑到,你的程序有可能被随时重启的,不要太依赖这个。

靠谱,还是对nodejs自身的东西了解的不够啊,感谢!

Linux 可以使用upstart 自动维护进程

进程未死,V8已挂,植物人有何意义

建议使用cluster,然后fork多个worker,使用心跳包,当master失去和worker的心跳,则重启worker,这样就可以避免僵尸进程的存在

嗯,正准备尝试cluster

同时你可以再worker发送心跳包的时候发送内存使用情况,让master做内存检测,如果超过内存使用标准,就记录日志,然后重启worker。

必要的系统监控是需要的。

在生产环境中,Node.js 应用的稳定性至关重要。为了实现故障恢复,可以使用一些工具和策略来确保应用程序能够在遇到错误时自动重启,并保持运行状态。以下是几种常见的方法:

  1. PM2: PM2 是一个非常流行的 Node.js 进程管理器,它提供了自动重启、负载均衡和日志管理等功能。

    安装 PM2:

    npm install -g pm2
    

    使用 PM2 启动应用:

    pm2 start app.js
    

    PM2 的配置文件 ecosystem.config.js 示例:

    module.exports = {
      apps : [{
        name: "app",
        script: "./app.js",
        instances: "max",
        autorestart: true,
        watch: true,
        max_memory_restart: "1G",
        env: {
          NODE_ENV: "development"
        },
        env_production: {
          NODE_ENV: "production"
        }
      }]
    };
    

    使用配置文件启动应用:

    pm2 start ecosystem.config.js
    
  2. nodemon: nodemon 是一个开发工具,可以在代码更改时自动重启应用,但也可以用于生产环境的基本监控。

    安装 nodemon:

    npm install -g nodemon
    

    使用 nodemon 启动应用:

    nodemon app.js
    
  3. try-catch 块: 在代码中使用 try-catch 块来捕获和处理异常,避免整个进程崩溃。

    示例代码:

    function riskyFunction() {
      // 一些可能抛出异常的操作
      throw new Error("Something went wrong");
    }
    
    process.on('uncaughtException', (err) => {
      console.error(`Caught exception: ${err}`);
      // 可以在这里记录错误并安全地退出程序
      process.exit(1);
    });
    
    try {
      riskyFunction();
    } catch (error) {
      console.error(`Caught error: ${error}`);
    }
    

通过这些方法,你可以大大提高 Node.js 应用的稳定性和可靠性。

回到顶部