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

本文主要是介绍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 pageres.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 下读取应用并启动;

这篇关于node 第十五天 生产环境log日志记录 服务器宕机重启 开发环境 热重载 体验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/345279

相关文章

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Java 日志中 Marker 的使用示例详解

《Java日志中Marker的使用示例详解》Marker是SLF4J(以及Logback、Log4j2)提供的一个接口,它本质上是一个命名对象,你可以把它想象成一个可以附加到日志语句上的标签或戳... 目录什么是Marker?为什么使用Markejavascriptr?1. 精细化的过滤2. 触发特定操作3

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke