PM2
PM2 是线上环境下 node 进程管理工具,可以利用它来简化很多 node 应用管理的繁琐任务,如性能监控、自动重启、负载均衡等。
主要特性
进程守护,应用崩溃自动重启
开发中出现问题导致服务挂了,需要解决问题后重新 node index.js 手动重启服务,PM2 遇到错误能够自动重启,保证其他服务能够访问
启动多进程,自动做负载均衡,充分利用 CPU 和 内存
为何使用多进程
服务端: CPU 性能、内存、稳定性、安全性
操作系统会限制一个进程的最大可用内存、单个进程的内存毕竟是受限的。单进程如果出错会导致整个服务崩溃,其他服务也无法正常提供;多进程如果一个进程崩溃了和其他进程没有太大的关系,能够提高服务器的稳定性
能够充分利用多核 CPU 的优势
多进程和 redis
系统内存里面,多个进程之间资源是无法共享的,如 session,可以多个进程访问一个 redis,轻松实现数据共享
自带日志功能,记录自定义日志内容
PM2 会自动搜集项目中的 console.log、console.error 的输出日志到文件当中,应用日志会被保存到服务器硬盘目录~/.pm2/logs/。也可以自定义日志的输出路径
后台运行
不像平时本地开发时,启动本地服务需要占用一个终端窗口,PM2 启动服务后在后台运行
安装
|
默认会在安装用户目录下生成几个log文件
/Users/heiliu/.pm2/logs/index-error.log
/Users/heiliu/.pm2/logs/index-out.log
/Users/heiliu/.pm2/pids/index-0.pid
常用命令
- pm2 start
/ - pm2 restart
/ - pm2 stop
/ - pm2 delete
/ - pm2 info
/ // 查看基本信息 - pm2 list
启动服务
|
在业务开发与测试过程中,我们经常会遇到文件更新后需要重启业务的情况。对于本地环境我们可以使用如 Webpack Dev Server 或 nodemon 等工具监听文件变化,然后在文件发生改变后重新运行服务器。而 PM2 同样提供了类似的功能帮助我们实现这一需求
|
这样只要当前目录下有任意文件发生改变,PM2都会尝试重启进程。
在使用这一参数的时候,有几个需要注意的地方:
- 请在程序所在的目录执行启动命令,否则将会监视的不是程序所在目录,而是你执行目录当前所在的目录。
- 开启
--watch
参数后,就算你手动停止进程(不删除),进程也会在文件发生改变后自动启动,解决该问题的方法是在停止进程的时候加入如下参数:$ pm2 stop [id] --watch
停止进程
|
也可以通过 namespace 关键字一次性停止该命名空间下的所有的进程
进程列表
|
某个进程信息
|
日志查看
我们可以通过打开日志文件查看日志外,还可以通过 pm2 logs 来查看实时日志,这点有对于线上问题排查;日志查看命令如下:
|
监控
监控进程的 CPU、内存、其他指定指标的具体使用情况或者日志输出
|
负载均衡
自动给你做负载均衡
|
PM2的内置HTTP服务器
最后想介绍一个极为实用但极少有人提及的功能:
HTTP 服务器、之前和很多同学探讨大前端项目前后端分离的时候,发现他们大多都使用 Nginx、Apache 甚至 Tomcat 来托管前端的静态页面,然后使用 PM2 来托管后端 API。但为了一个简单的前端页面专门撰写一堆配置文件,实在是太浪费时间了,PM2 可能也发现了这一点,于是贴心的内置了 HTTP 服务器:
|
是的,就这么简单,一条命令就能启动一个 HTTP 服务器。由于这个 HTTP 服务器使用的是 NodeJS 实现,因此性能同样非常优异,在大部分情况下足够使用。如果是负载非常大的业务,一般也不会考虑使用 PM2,而会使用更具扩展性的Kubernetes。
配置
可以通过配置文件对 PM2(包括进程数量、日志文件目录等)进行配置
新建 pm2 的配置文件 pm2.config.json
修改 PM2 启动命令,使用配置文件重启
检查相应配置是否生效
|
修改启动命令
|