PM2 部署 nodejs 项目

3,446 阅读3分钟

需求分析

客户端启动 Node.js 应用:

node app.js  # 方法一
npm start    # 方法二 Express框架

这样可以正常启动应用,但是如果断开客户端连接,应用也就随之停止了。也就是说这样的启动方式没有给应用一个守护线程。

解决方案

目前最常见的线上部署 nodejs 项目的有forever,pm2这两种。

使用场合:

  1. forever管理多个站点,每个站点访问量不大,不需要监控。
  2. pm2 网站访问量比较大,需要完整的监控界面。

PM2 的基本使用

PM2 的主要特性

  1. 内建负载均衡(使用Node cluster 集群模块)
  2. 后台运行
  3. 0秒停机重载,我理解大概意思是维护升级的时候不需要停机.
  4. 具有Ubuntu和CentOS 的启动脚本
  5. 停止不稳定的进程(避免无限循环)
  6. 控制台检测
  7. 提供 HTTP API
  8. 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

PM2 安装

npm install -g pm2

PM2 启动node项目

 pm2 start app.js 
 
 pm2 start bin/www 

PM2 常见命令

pm2 list

pm2 list 

列出由pm2管理的所有进程信息,还会显示一个进程会被启动多少次,因为没处理的异常。

pm2 monit

pm2 monit

pm2 monit 监视每个node进程的CPU和内存的使用情况

其他选项

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 -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 启动 并 生成一个配置文件

Forever 的基本使用

Forever可以守护Node.js应用,客户端断开的情况下,应用也能正常工作。

安装

安装过Node.js后再安装forever,需要加-g参数,因为forever要求安装到全局环境下:

 npm install forever -g
 

forever 的基本使用

# 启动
forever start ./bin/www  #最简单的启动方式
forever start -l forever.log ./bin/www  #指定forever日志输出文件,默认路径~/.forever
forever start -l forever.log -a ./bin/www  #需要注意,如果第一次启动带日志输出文件,以后启动都需要加上 -a 参数,forever默认不覆盖原文件
forever start -o out.log -e err.log ./bin/www  #指定node.js应用的控制台输出文件和错误信息输出文件
forever start -w ./bin/www  #监听当前目录下文件改动,如有改动,立刻重启应用,不推荐的做法!如有日志文件,日志文件是频繁更改的

# 重启
forever restart ./bin/www  #重启单个应用
forever restart [pid]  #根据pid重启单个应用
forever restartall  #重启所有应用

# 停止(和重启很类似)
forever stop ./bin/www  #停止单个应用
forever stop [pid]  #根据pid停止单个应用
forever stopall  #停止所有应用

# 查看forever守护的应用列表
forever list