前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Node应用的进程管理器: PM2详细介绍

Node应用的进程管理器: PM2详细介绍

作者头像
Javanx
发布2019-09-04 12:39:19
3.1K0
发布2019-09-04 12:39:19
举报
文章被收录于专栏:web秀web秀

前言

Node应用的进程管理器: PM2详细介绍
Node应用的进程管理器: PM2详细介绍

本文不涉及的前端知识,是NodeJs服务器端的知识点,有兴趣的可以了解一波。

这里的PM2,不是PM2.5,跟空气没有半毛钱的关系。它是NodeJs应用的进程管理器,可以利用它来简化很多Node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等。

PM2主要特性

1、内建负载均衡(使用Node cluster 集群模块) 2、线程守护,keep alive 3、0秒停机重载,维护升级的时候不需要停机. 4、Linux (stable) & MacOSx (stable) & Windows (stable).多平台支持 5、停止不稳定的进程(避免无限循环) 6、控制台检测 7、提供 HTTP API 8、远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

好像很牛x的样子啊?但是我们为什么要使用它了?

PM2使用目的

Node应用的进程管理器: PM2详细介绍
Node应用的进程管理器: PM2详细介绍

Node本身是一个单线程应用,它的特点就是所有方法都是串行一次执行,并且Node并没有能力像Java一样独自去创建一个新的线程来实现异步操作,如果在执行I/O中遇到了阻塞就会降低整个应用的执行效率,导致CPU使用率高等不利原因。

因此在这种模式下,一个线程只能处理一个任务,要想提高吞吐量必须通过多线程。虽然单线程的好处有很多比如避免了线程同步或者死锁、状态同步等等之类的问题,但是在应用和计算能力要求日益倍增的今天,单线程最大的弊端就是无法利用多核CPU带来的优势来提升运行效率。

我们知道node可以利用异步I/O来避免线程阻塞,提高利用率等优点:

Node应用的进程管理器: PM2详细介绍
Node应用的进程管理器: PM2详细介绍

同时为了弥补单线程无法利用多核CPU的问题,提供了“子进程”这个概念,Node.js 实际上是 Javascript 执行线程的单线程,真正的的 I/O 操作,底层 API 调用都是通过多线程执行的。

我总结了两个比较简洁的答案:

1、pm2可以把你的应用部署到服务器所有的CPU上($ pm2 start app.js -i max),有效的解决了上述提出的问题。

2、同样是进程管理器,为什么不用forever?我认为最大的区别是在监控欠缺,进程和集群管理有限。

PM2用法

代码语言:javascript
复制
$ npm install pm2 -g    # 命令行安装 pm2 
$ pm2 start app.js -i 4 #后台运行pm2,启动4个app.js 
                        # 也可以把'max' 参数传递给 start
                        # 正确的进程数目依赖于Cpu的核心数目
$ pm2 start app.js --name my-api # 命名进程
$ pm2 list               # 显示所有进程状态
$ pm2 monit              # 监视所有进程
$ pm2 logs               #  显示所有进程日志
$ pm2 stop all           # 停止所有进程
$ pm2 restart all        # 重启所有进程
$ pm2 reload all         # 0秒停机重载进程 (用于 NETWORKED 进程)
$ pm2 stop 0             # 停止指定的进程
$ pm2 restart 0          # 重启指定的进程
$ pm2 startup            # 产生 init 脚本 保持进程活着
$ pm2 web                # 运行健壮的 computer API endpoint (http://localhost:9615)
$ pm2 delete 0           # 杀死指定的进程
$ pm2 delete all         # 杀死全部进程

运行进程的不同方式:
$ pm2 start app.js -i max  # 根据有效CPU数目启动最大进程数目
$ pm2 start app.js -i 3      # 启动3个进程
$ pm2 start app.js -x        #用fork模式启动 app.js 而不是使用 cluster
$ pm2 start app.js --watch # 监听应用目录源码的变化,一旦发生变化,自动重启。
$ pm2 start app.js -x -- -a 23   # 用fork模式启动 app.js 并且传递参数 (-a 23)
$ pm2 start app.js --name serverone  # 启动一个进程并把它命名为 serverone
$ pm2 stop serverone       # 停止 serverone 进程
$ pm2 start app.json        # 启动进程, 在 app.json里设置选项
$ pm2 start app.js -i max -- -a 23                   #在--之后给 app.js 传递参数
$ pm2 start app.js -i max -e err.log -o out.log  # 启动 并 生成一个配置文件
你也可以执行用其他语言编写的app  ( fork 模式):
$ pm2 start my-bash-script.sh    -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python
Node应用的进程管理器: PM2详细介绍
Node应用的进程管理器: PM2详细介绍

PM2配置文件启动

处理上面的名字可以控制台直接运行外,我们也可以对项目添加一个配置文件(如pm2.json)

代码语言:javascript
复制
{
  "apps": [
    {
      "name": "serverName", // 名称
      "script": "./index.js", // 入口文件
      "env": { // 环境
        "NODE_ENV": "development"
      },
      "env_production": {
        "NODE_ENV": "production"
      },
      "instances": 4, // 启用多少个实例
      "exec_mode": "cluster", // 应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
      "max_restarts" : 3, // 设置应用程序异常退出重启的次数,默认15次(从0开始计数)
      "restart_delay" : 5000, // 异常重启情况下,延时重启时间
      "log_date_format" : "YYYY-MM-DD HH:mm Z",
      "combine_logs" : true,
      "log_file": "<yourpath>/combined.outerr.log", // 日志目录
      "out_file": "<yourpath>/out.log",
      "error_file": "<yourpath>/err.log",
    }
  ]
}

然后json目录直接运行pm2 start pm2.json

开机自动启动

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年5月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • PM2主要特性
  • PM2使用目的
  • PM2用法
  • PM2配置文件启动
  • 开机自动启动
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档