使用pm2部署node生产环境

5次阅读

共计 4218 个字符,预计需要花费 11 分钟才能阅读完成。

一、PM2 是什么

是可以用于生产环境的 Nodejs 的进程管理工具,并且它内置一个负载均衡。它不仅可以保证服务不会中断一直在线,并且提供 0 秒 reload 功能,还有其他一系列进程管理、监控功能。并且使用起来非常简单。
嗯嗯,最好的用处就是监控我们的生产环境下的 node 程序运行状态,让它给我们日以继日的处于工作状态。
pm2 官方文档

二、为森么要使用 pm2

原始社会的我们开发 node 服务端程序一般过程:

编写好 node 程序 app.js,运行 node app.js; 或者写入 script 使用 npm 运行;打开浏览器访问;
好像需要修改内容,浏览器对修改的内容没有显示出来?->node app.js-> 再次运行;
浏览器忽然访问不到服务,好像出错啦?重启下 ->node app.js-> 再次运行;
哎呀开了好多控制台窗口,一不小心关闭了,服务又访问不到了,继续打开控制台 ->node app.js-> 再次运行;

好崩溃!好像有个工具 nodemon;安装使用 nodemon app.js; 哇,可以自动监听文件修改变化自动重启,但是关闭控制台服务还是会被摧毁。
通过这个很常用的场景,我们了解到要避免这些麻烦一个服务器至少需要有:后台运行和自动重启,这两个能力。

再来看看使用 pm2 可拥有的能力:

日志管理;两种日志,pm2 系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中;
负载均衡:PM2 可以通过创建共享同一服务器端口的多个子进程来扩展您的应用程序。这样做还允许以零秒停机时间重新启动应用程序。
终端监控:可以在终端中监控应用程序并检查应用程序运行状况(CPU 使用率,使用的内存,请求 / 分钟等)。
SSH 部署:自动部署,避免逐个在所有服务器中进行 ssh。
静态服务:支持静态服务器功能
支持开发调试模式,非后台运行,pm2-dev start <appName>;
。。。。。太过强大!

pm2 常用命令

启动服务 pm2 start <script_file|config_file> [options] 启动指定应用
pm2 start app.js // 启动 app.js 应用
pm2 start app.js –name app // 启动应用并设置 name
pm2 start app.sh // 脚本启动

pm2 start app.js –watch // 监听模式启动,当文件发生变化,自动重启

//max 表示 PM2 将自动检测可用 CPU 的数量并运行尽可能多的进程
//max 可以自定义,如果是 4 核 CPU,设置为 2 则占用 2 个
pm2 start app.js -i max // 启用群集模式(自动负载均衡)

pm2-dev start … // 开发模式启动,即不启用后台运行

查看启动列表 pm2 list

显示应用程序详细信息 pm2 show <appName> [options] 显示指定应用详情
pm2 show [Name] // 根据 name 查看
pm2 show [ID] // 根据 id 查看

停止指定应用 pm2 stop <appName> [options] 停止指定应用
pm2 stop all // 停止所有应用
pm2 stop [AppName] // 根据应用名停止指定应用
pm2 stop [ID] // 根据应用 id 停止指定应用

重启应用 pm2 reload|restart <appName> [options] 重启指定应用
pm2 restart app.js // 同时杀死并重启所有进程,短时间内服务不可用, 生成环境慎用
pm2 reload app.js // 重新启动所有进程,0 秒重启,始终保持至少一个进程在运行
pm2 gracefulReload all // 以群集模式重新加载所有应用程序

启动静态服务器 pm2 serve ./dist 8080 将目录 dist 作为静态服务器根目录,端口为 8080

删除应用 pm2 delete <appName> [options] 删除指定应用; 如果修改了应用配置行为,需要先删除应用,重新启动后方才会生效,如修改脚本入口文件;
pm2 delete all // 关闭并删除应用
pm2 delete [AppName] // 根据应用名关闭并删除应用
pm2 delete [ID] // 根据应用 ID 关闭并删除应用

pm2 kill 杀掉 pm2 管理的所有进程;

pm2 logs <appName> 查看指定应用的日志,即标准输出和标准错误
pm2 logs // 查看所有应用日志
pm2 logs [Name] // 根据指定应用名查看应用日志
pm2 logs [ID] // 根据指定应用 ID 查看应用日志

pm2 monit 监控各个应用进程 cpu 和 memory 使用情况;

PM2 配置方式

命令生产默认示例配置文件 pm2 ecosystem 或 pm2 init, 运行默认会生成 ecosystem.config.js 配置文件
module.exports = {
apps: [
{
name: ‘back-Api’, // 应用名
script: ‘./server/start.js’, // 应用文件位置
env: {
PM2_SERVE_PATH: “./apidoc”, // 静态服务路径
PM2_SERVE_PORT: 8080, // 静态服务器访问端口
NODE_ENV: ‘development’ // 启动默认模式
},
env_production : {
NODE_ENV: ‘production’ // 使用 production 模式 pm2 start ecosystem.config.js –env production
},
instances:”max”, // 将应用程序分布在所有 CPU 核心上, 可以是整数或负数
instance_var: “INSTANCE_ID”,
exec_mode: “cluster”,
watch:[
“server”,
], // 监听模式,不能单纯的设置为 true,易导致无限重启,因为日志文件在变化,需要排除对其的监听
merge_logs: true, // 集群情况下,可以合并日志
}
],
deploy: {
production : {
user: ‘node’, //ssh 用户
host: ‘212.83.163.1’, //ssh 地址
ref: ‘origin/master’, //GIT 远程 / 分支
repo: ‘git@github.com:repo.git’, //git 地址
path: ‘/var/www/production’, // 服务器文件路径
“post-deploy”: ‘npm install && pm2 reload ecosystem.config.js –env production’ // 部署后的动作
}
}
};

自定义 json 配置文件如:processes.json;启动 pm2 start processes.json

{
“apps”: [{
“name”: “app”, // 名称
“script”: “./”, // 程序入口
“cwd”: “./”, // 根目录
“watch”:[
“views”
],// 需要监控的目录
“error_file”:”./logs/err.log”,// 错误输出日志
“out_file”:”./logs/out.log”, // 日志
“log_date_format”:”YYYY-MM-DD HH:mm Z” // 日期格式
}]
}
pm2 常用配置项解析
1. apps:json 结构,apps 是一个数组,每一个数组成员就是对应一个 pm2 中运行的应用

2. name: 应用程序名称 ”app”

3. cwd: 应用程序所在的目录 ”./”

4. script: 应用程序的脚本路径 ”./”

5. log_date_format: 日志文件名输出日期格式 ”YYYY-MM-DD HH:mm Z”

6. error_file: 自定义应用程序的错误日志文件 ”./logs/app-err.log”,

7. out_file: 自定义应用程序日志文件 ”./logs/app-out.log”

8. instances: 应用启动实例个数,仅在 cluster 模式有效 默认为 fork;或者 max

9. min_uptime: 最小运行时间,这里设置的是 60s 即如果应用程序在 60s 内退出,pm2 会认为程序异常退出,此时触发重启 max_restarts 设置数量

10. max_restarts: 设置应用程序异常退出重启的次数,默认 15 次(从 0 开始计数)

11. cron_restart: 定时启动,解决重启能解决的问题

12. watch: 是否启用监控模式,默认是 false。如果设置成 true,当应用程序变动时,pm2 会自动重载。这里也可以设置你要监控的文件。

13. “ignore_watch”: [// 不用监听的文件
“node_modules”,
“logs”
],
13. merge_logs:// 设置追加日志而不是新建日志

14. exec_interpreter: 应用程序的脚本类型,这里使用的 shell,默认是 nodejs

15. exec_mode: 应用程序启动模式,这里设置的是 cluster_mode(集群),默认是 fork

16. autorestart: 启用 / 禁用应用程序崩溃或退出时自动重启, 默认为 true, 发生异常的情况下自动重启

17. vizion: 启用 / 禁用 vizion 特性 (版本控制)

18. “args”: “”, // 传递给脚本的参数

19. env: {
PM2_SERVE_PATH: “./apidoc”, // 静态服务路径
PM2_SERVE_PORT: 8080, // 静态服务器访问端口
NODE_ENV: ‘development’ // 启动默认模式
},

20. env_production : {
NODE_ENV: ‘production’ // 使用 production 模式 pm2 start ecosystem.config.js –env production
},

pm2 配合 log4js 处理日志

pm2 启动时通常会发现 log4js 记录不到日志信息;
决解方案,安装 pm2 的 pm2-intercom 进程间通信模块

在 log4js 的配置文件 logger.js 里添加如下命令:
pm2: true,
pm2InstanceVar: ‘INSTANCE_ID’

pm2 配置文件中添加 ”instance_var”: “INSTANCE_ID”, // 添加这一行 字段
发现如果没有设置群集模式 ”exec_mode”: “cluster”,也会记录不到;

其他
log4js 日志配置使用详情 Koa 日志中间件封装开发(log4js)

“积跬步、行千里”—— 持续更新中~,喜欢的话留下个赞和关注哦!

往期经典好文:

团队合作必备的 Git 操作
谈谈 Js 前端模块化规范

正文完
 0