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

相关文章

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优