node 第十五天 生产环境log日志记录 服务器宕机重启 开发环境 热重载 体验

  1. 前言
    当我们的项目上线服务器后, 我们不可能24小时守在服务器身边, 所以我们需要一些操作来记录服务器日志, web服务器一般需要记录用户接口请求操作等等, 除此以外当程序破溃, 服务器意外宕机等原因发生时, 我们需要采取合适的手段来处理, 比如及时结束服务, 保护数据库, 防止cpu飙高, 又比如, 自动重启服务, 开机自动重启服务等
  2. pm2

Node.js Production Process Manager with a built-in Load Balancer.
内置负载均衡的 Node.js 生产流程管理器。

  • 额 负载均衡这个问题我们目前不用考虑
  • 当我们启动node服务后, 不可能一直开着cli界面不让进程结束, 使用pm2可以实现进程守护
  • 当我们启动node服务后, 不可能一直人为监控着console.log, 使用pm2可以将日志写入文件, 包括标准输出流日志和错误日志
  • pm2 天生集群cluster应用启动模式(fork可选) 额 这里又和负载均衡扯上了
  1. 一个标准的express生成器生成的express项目 配置pm2脚本命令如下
//package.json script
  "scripts": {
    "pm2:pro": "pm2 start pm2.json --env pro --time",
    "pm2:dev": "pm2 start pm2.json --env dev --time",
    "pm2:re": "pm2 restart 0",
    "pm2:list": "pm2 list",
    "pm2:exit": "pm2 del all"
  }
//pm2.json
{
  "apps": {
    "name": "myapp",
    "script": "./bin/www", // 入口文件
    "cwd": "./", // 文件根目录
    "args": "", // 传递给脚本的参数
    "interpreter": "",// 指定的脚本解释器
    "interpreter_args": "",// 传递给解释器的参数
    "watch": false,// 是否监听文件变动然后重启
    "ignore_watch": ["node_modules", "public", "logs"],// 不用监听的文件
    "exec_mode": "cluster_mode",// 应用启动模式,支持 fork 和 cluster 模式
    "instances": "1", // 应用启动实例个数,仅在 cluster 模式有效 默认为 fork
    "error_file": "./logs/app-err.log",// 错误日志输出文件
    "out_file": "./logs/app-out.log",// 正常日志输出文件
    "merge_logs": true,// 设置追加日志而不是新建日志
    "log_date_format": "YYYY-MM-DD HH:mm:ss",// 指定日志文件的时间格式
    "min_uptime": "60s", // 应用运行少于时间被认为是异常启动
    "max_restarts": 30,// 最大异常重启次数
    "autorestart": true, // 默认为 true, 发生异常的情况(程序奔溃)下自动重启
    "restart_delay": "60",// 异常重启情况下,延时重启时间
    "env_pro": {// 环境参数,通过指定pm2脚本 --env pro/dev/test  参数设置服务启动时的环境常量
      "NODE_ENV": "production",
      "REMOTE_ADDR": ""
    },
    "env_dev": {
      "NODE_ENV": "development",
      "REMOTE_ADDR": ""
    },
    "env_test": {
      "NODE_ENV": "test",
      "REMOTE_ADDR": ""
    }
  }
}
  1. 开发时使用npm run pm2:dev (开发环境可以用nodemon替换) 生产环境使用 npm run pm2:pro

实现:

  • 程序崩溃自动重启服务

    修改文件自动重启(一般在开发环境使用, 可以用nodemon代替, nodemon具有良好的开发环境体验, 见下面介绍)
    在生产环境一般 都是 watch: false 因为如果某个报错引起了受监听的文件改动, 那么pm2就会无限重启
    报错–>文件改动–>重启–>报错—>死循环
    导致不断将错误信息产生的log写入文件, 硬盘都被写满
    设置了max_restarts也没用

  • 根据需要注入不同的环境变量

  • 指定标准日志输出文件(可以用下面介绍的morgan 来加强标准日志输出 非常好用)

  • 指定错误日志输出文件

  1. nodemon代替 pm2watch: true 功能

    刚开始接触node时, 当我们修改文件后需要手动去重启服务才能看到效果, 什么? 前端都实现了热重载, 服务端还要手动操作?
    所以让我们来使用nodemon吧,
    npm install nodemon -g 使用 nodemon app.js 代替 node app.js 实现修改文件自动重启服务, 开发体验++

  2. morgan express好用的日志记录中间件

    const logger = require('morgan');
    const accessLogStream = fs.createWriteStream(path.join(__dirname, '/logs/daily.log'), { flags: 'a' });
    // Standard Apache combined log output. time in china +8h
    // 标准的Apache组合日志输出, 时间(时区 +0000)加8小时转换为中国时间
    app.use(logger('combined', { stream: accessLogStream }));
    
  3. 顺带一提, 错误处理

    在express中处理全局的未捕获错误使用一个放在最后的中间件即可

    // error handler
    app.use(function (err, req, res, next) {	
      // render the error page
      res.status(err.status || 500);
      res.render('error'); 
    });
    

    原生node捕获主要使用到process模块 (process的使用前提是你必须知道自己在干什么)

    process.on('uncaughtException', (err, origin) => {
      console.log(err, origin);
    });
    
  4. pm2进阶 文档 高级用法
    服务器宕机重启, 开机启动服务

    在 linux 中,设置开机自启动,只需要执行以下两个步骤:
    运行 pm2 startup,即在/etc/init.d/ 目录下生成 pm2-root 的启动脚本,且自动将 pm2-root 设为服务;
    运行 pm2 save ,会将当前 pm2 所运行的应用保存在 /root/.pm2/dump.pm2 下,当开机重启时,运行pm2-root 服务脚本,并且到 /root/.pm2/dump.pm2 下读取应用并启动;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值