暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

pm2 学习总结

原创 雪狼sunny 2024-01-30
1028

1 pm2简介

pm2是什么?
PM2是 node 进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,这里推荐一个 node 版本控制工具--nvm。
为什么要用pm2?
对于线上项目,如果直接通过 node app 来启动,因为 node 是单线程的,所以如果报错了可能会使项目直接停止,从而导致整个服务崩溃。

一般监控 node 有几种方案:

supervisor: 一般用作开发环境的使用;
forever: 管理多个站点,一般每个站点的访问量不大的情况,不需要监控;
PM2: 网站的访问量比较大,需要完整的监控页面。


pm2优点

后台运行(关掉cmd窗口依然运行)
0 秒停机重载,维护升级时不需要停机
Linux (stable) & MacOSx (stable) & Windows (stable).多平台支持
进程守护 (停止不稳定的进程,避免无限循环)
内建负载均衡
实时控制台检测
提供 HTTP API等
远程控制和实时的接口API ( nodejs 模块,允许和PM2进程管理器交互 )
不仅仅可以启动node程序,对于一般的脚本程序同样可以,

在项目需求中会遇到不同版本的node服务,一台node服务器上面会运行多个项目,所以只能用pm2 这个工具进行多个项目的管理,重启,停止,启动,删除;

2 pm2 常用的命令:

启动

pm2 start app.js (如果提示找不到命令且你已安装成功,则可能你没有配置环境变量,需要自己手动配一下)

参数说明:

  • --watch:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
  • -i --instances:启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目。
  • --ignore-watch:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules "
  • -n --name:指定应用的名称。查看应用信息的时候可以用到。
  • -o --output <path>:标准输出日志文件的路径。
  • -e --error <path>:错误输出日志文件的路径。
  • --interpreter <interpreter>:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script来编写应用。
  • -x:用fork模式启动app.js,而不是cluster模式
  • fork模式:单实例多进程,常用于多语言混编,比如php、python等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码。
    • 缺点:就是单服务器实例容易由于异常会导致服务器实例崩溃。
  • cluster模式:多实例多进程,但是只支持node,端口可以复用,不需要额外的端口配置,0代码实现负载均衡。
    • 优点:就是由于多实例机制,可以保证服务器的容错性,就算出现异常也不会使多个服务器实例同时崩溃也可以单独恢复

查看与监视进程

  • pm2 list:显示所有进程信息;
  • pm2 show 11pm2 info 11:查看进程id为 11 的详细信息;
  • pm2 monit:进入监视页面,监视每个node进程的CPU和内存的使用情况。

重载、重启

  • pm2 restart 11:重启id为 11 的进程;
  • pm2 restart all:重启所有进程;
  • pm2 reload 11:0秒停机重载id为 11 进程(用于 NETWORKED 进程);
  • pm2 reload all:重载所有进程;

停止、删除进程

  • pm2 stop/delete 11:停止/删除id为 11 的进程;
  • pm2 stop/delete all:停止/删除所有进程;

日志操作

  • pm2 logs:显示所有进程的日志;
  • pm2 logs 11:显示进程id为 11 的日志;
  • pm2 flush:清空所有日志文件;
  • pm2 reloadLogs:重载所有日志;
  • pm2 startup:产生 init 脚本,保持进程活着;

杀进程

  • pm2 kill:杀死pm2进程 ;

开机自动启动

1、通过pm2 save保存当前进程状态。
2、通过pm2 startup [platform]生成开机自启动的命令。例如:pm2 startup centeros
3、将步骤2生成的命令,粘贴到控制台进行,搞定。

pm2配置文件启动

在上面的启动命令例子中,有一条pm2 start app.json命令,可以在app.json文件中添加配置

apps:json结构,apps是一个数组,数组中的每一个对象就对应一个pm2中运行的应用

参数说明:

  • name:应用程序名称
  • args:脚本的参数域
  • cwd:应用程序所在的目录
  • script:应用程序的脚本路径
  • log_date_format:
  • node_args:node 的参数域
  • error_file:自定义应用程序的错误日志文件
  • out_file:自定义应用程序日志文件
  • pid_file:自定义应用程序的pid文件
  • instances:
  • min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
  • max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)
  • cron_restart:定时启动,解决重启能解决的问题
  • watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时, pm2会自动重载。这里也可以设置你要监控的文件。
  • merge_logs:
  • exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
  • exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
  • autorestart:启用/禁用应用程序崩溃或退出时自动重启
  • vizion:启用/禁用vizion特性(版本控制)

3 PM2实战应用

公司所有的项目和前端开发人员沟通,设置不同的node版本编译打包推送到我的node服务器上面;我的node服务器安装了不同版本的node服务;

启动项目的node服务过程:

A,确定node的版本执行环境变量:nvm use v14.18.0

B,进入项目制定的目录启动项目: 启动命令 npm run pm2:test

C, 前端nginx根据不同项目node服务的端口就行proxy调用;

D,当项目更新以后只需要前端程序员提交代码到gitlab,然后自动化脚本会拉去代码,进行编译打包推送到node服务器上的对应项目目录,pm2管理的node项目会自动更新无需人工操作;

[root@ip-10-101-3-27 ~]# pm2 list
┌────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
 id  name          namespace    version  mode     pid       uptime       status     cpu       mem       user      watching 
├────┼──────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
 4   B3S           default      1.2.0    cluster  4313      5h      61    online     0%        113.1mb   root      disabled 
 7   B3S-blast     default      1.2.0    cluster  7192      4h      3     online     0%        104.8mb   root      enabled  
 3   Gracton       default      N/A      cluster  11664     43D     535   online     0%        54.4mb    root      enabled  
 2   KappyCat      default      N/A      cluster  20280     4M      4     online     0%        67.6mb    root      enabled  
 5   Loan-abc      default      N/A      cluster  30639     2M      180   online     0%        69.0mb    root      enabled  
 1     abcd        default      N/A      cluster  10044     5M      547   online     0%        55.2mb    root      enabled  
└────┴──────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
[PM2][WARN] Current process list is not synchronized with saved list. Type 'pm2 save' to synchronize.


重启项目:pm2 restart id/name

删除项目:pm2 delete id/name

执行pm2 save可以确保服务器重启的时候所有项目都自动启动;

这种方法解决了在开发过程中很多项目不同的node版本控制,多个项目可以在一台服务器上面共生的问题;

还有一个就是对各个项目的node服务的监控,pm2自带监控很不好用,改用端口监控,如果项目的node服务异常挂掉,直接zabbix报警;

希望这篇文章可以帮助那些管理多个node版本多个前端项目的人一些帮助。



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论