生产环境下的pm2部署

标签(空格分隔): EBOOKCHAIN PM2 NODEJS


前言

部署前请先安装Ebookcoin

请参考官方wiki:https://github.com/Ebookcoin/ebookcoin/wiki/

pm2简介

Node.js默认单进程运行,对于32位系统最高可以使用512MB内存,对于64位最高可以使用1GB内存。对于多核CPU的计算机来说,这样做效率很低,因为只有一个核在运行,其他核都在闲置,pm2利用的node原生的cluster模块可以顺利解决该问题。
在线上服务器部署nodejs项目并且管理node服务会遇到诸多问题,在服务器上开启了node进程以后,我们很难统一管理进程,也不能查看详细信息和日志,如果一个接口报错了,我们需要进到服务器中,关闭进程,重启服务,然后查看命令行打印出的日志判断到底是什么问题,这明显加大了调试的难度。
pm2可以使node服务在后台运行(类似于linux的nohup),另外它可以在服务因异常或其他原因被杀掉后进行自动重启。由于Node的单线程特征,自动重启能很大程度上的提高它的健壮性。并且它是一个带有负载均衡功能的Node应用的进程管理器。当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载,PM2是完美的。它非常适合IaaS结构,但不要把它用于PaaS方案(随后将开发Paas的解决方案)。

更多信息请查看:
pm2 官网:http://pm2.keymetrics.io/
pm2 github:https://github.com/Unitech/pm2

pm2主要特性

  • 原生的集群化支持(使用Node cluster集群模块)
  • 记录应用重启的次数和时间
  • 后台daemon模式运行
  • 0秒停机重载,非常适合程序升级
  • 停止不稳定的进程(避免无限循环)
  • 控制台监控
  • 实时集中log处理
  • 强健的API,包含远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )
  • 退出时自动杀死进程
  • 内置支持开机启动(支持众多linux发行版和macos)

更多特性请查看:pm2的官网:http://pm2.keymetrics.io/

pm2与forever对比

到目前为止,我们仍然依赖漂亮俏皮的node-forever模块.它是非常伟大的模块,不过依然缺失一些功能:

  • 有限的监控和日志功能
  • 进程管理配置的支持差
  • 未内置支持cluster以及优雅重启
  • 代码库老化(意味着在升级node.js时频繁的失败)
  • 未内置支持开机启动
  • 重启可能失败

pm2安装和升级

  1. $ npm install -g pm2

pm2用法

  1. 基础用法:
  2. $ pm2 start app.js -i 4 # 后台运行pm2,启动4个app.js
  3. # 也可以把'max' 参数传递给 start
  4. # 正确的进程数目依赖于Cpu的核心数目
  5. $ pm2 start app.js --name my-api # 命名进程
  6. $ pm2 list # 显示所有进程状态
  7. $ pm2 monit # 监视所有进程
  8. $ pm2 logs # 显示所有进程日志
  9. $ pm2 startup # 产生init 脚本保持进程活着
  10. $ pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)
  11. $ pm2 reload all/app_name # 0秒停机重载进程,会算在服务重启的次数中,类似于平滑重启
  12. $ pm2 restart id/all/app_name # 会重新加载代码,因为需要杀掉原有进程,所以服务会中断
  13. $ pm2 stop id/all/app_name # 停止指定名称的进程,如果是一个名称多进程,则一起停止,不会释放端口
  14. $ pm2 delete id/all/app_name # 删除指定名称的进程,如果是一个名称多进程,则一起删除,不会释放端口
  15. $ pm2 kill # 杀掉所有pm2进程并释放资源,包含pm2自身,会释放端口
  16. $ pm2 updatePM2 # 更新内存里的pm2
  17. 运行进程的不同方式:
  18. $ pm2 start app.js -i max # 根据有效CPU数目启动最大进程数目
  19. $ pm2 start app.js -i 3 # 启动3个进程
  20. $ pm2 start app.js -x # 用fork模式启动app.js,而不是使用cluster
  21. $ pm2 start app.js -x -- -a 23 # 用fork模式启动app.js,并且传递参数 (-a 23)
  22. $ pm2 start app.js --name serverone # 启动一个进程并把它命名为serverone
  23. $ pm2 stop serverone # 停止serverone进程
  24. $ pm2 start app.json # 启动进程, 在app.json里设置选项
  25. $ pm2 start app.js -i max -- -a 23 # 在--之后给app.js传递参数
  26. $ pm2 start app.js -i max -e err.log -o out.log # 启动,并将日志输出到指定文件中
  27. 你也可以执行用其他语言编写的app(fork模式):
  28. $ pm2 start my-bash-script.sh -x --interpreter bash #pm2以fork模式运行bash shell脚本
  29. $ pm2 start my-python-script.py -x --interpreter python #pm2以fork模式运行python脚本
  30. 硬重启:
  31. $ pm2 dump
  32. $ pm2 resurrect

pm2高级用法(远程部署)

生成远程部署所需的json文件,在应用程序目录下生成ecosystem.json

  1. $ pm2 ecosystem

编辑修改ecosystem.json文件

  1. {
  2. "apps" : [{
  3. "name" : "ebook", //项目的名字
  4. "script" : "app.js", //项目主入口(Node.js)
  5. "env": {
  6. "COMMON_VARIABLE": "true"
  7. },
  8. "env_production" : {
  9. "NODE_ENV": "production"
  10. }
  11. }],
  12. deploy : {
  13. production : {
  14. user : "root", // 登陆用户名
  15. host : "192.168.1.100", // 要部署的目标服务器IP地址或域名
  16. ref : "origin/master", // 用于部署的Git仓库分支
  17. repo : "https://github.com/Ebookcoin/ebookcoin.git", // Git仓库位置
  18. path : "/var/www/production", // 部署目标服务器文件系统位置
  19. "post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production" // 部署后执行的命令,本案例:先安装依赖再启动
  20. },
  21. }

执行部署(自动发布网站项目)

  1. $ pm2 deploy ecosystem.json production

更新部署

  1. $ pm2 deploy production update

pm2启动模式分类

fork模式

pm2默认用fork模式启动,该模式有如下特性。

  • 可以修改exec_interpreter,比如你的代码不是纯js,而是类似coffee script或者是其它语言如python/php
  • 适合做本地开发测试用,只使用一个cpu

cluster模式

  • 不可以修改exec_interpreter,只适合node开发的纯js程序
  • 适合生产坏境部署用,尽可能多地使用cpu/内存等系统资源
  • 用cluster来做负载均衡,业务代码零改动

pm2部署ebookcoin案例

本案例演示了如何利用pm2进行ebook blockchain的基本管理工作。

用pm2启动ebookcoin的app.js并将应用名字设置为“ebook”

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 start app.js --name ebook
  2. [PM2] Spawning PM2 daemon with pm2_home=/home/clark/.pm2
  3. [PM2] PM2 Successfully daemonized
  4. [PM2] Starting /data/blockchain/ebookcoin/app.js in fork_mode (1 instance)
  5. [PM2] Done.
  6. ┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
  7. App name id mode pid status restart uptime cpu mem watching
  8. ├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
  9. ebook 0 fork 20130 online 0 0s 49% 13.2 MB disabled
  10. └──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
  11. Use `pm2 show <id|name>` to get more details about an app

检查日志

该日志包含pm2自身、应用程序的日志(支持实时刷新,类似linxu的tail -f模式)

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 logs
  2. [TAILING] Tailing last 10 lines for [all] processes (change the value with --lines option)
  3. /home/clark/.pm2/pm2.log last 10 lines:
  4. PM2 | 2016-09-26 15:00:25: PM2 PID file : /home/clark/.pm2/pm2.pid
  5. PM2 | 2016-09-26 15:00:25: RPC socket file : /home/clark/.pm2/rpc.sock
  6. PM2 | 2016-09-26 15:00:25: BUS socket file : /home/clark/.pm2/pub.sock
  7. PM2 | 2016-09-26 15:00:25: Application log path : /home/clark/.pm2/logs
  8. PM2 | 2016-09-26 15:00:25: Process dump file : /home/clark/.pm2/dump.pm2
  9. PM2 | 2016-09-26 15:00:25: Concurrent actions : 1
  10. PM2 | 2016-09-26 15:00:25: SIGTERM timeout : 1600
  11. PM2 | 2016-09-26 15:00:25: ===============================================================================
  12. PM2 | 2016-09-26 15:00:25: Starting execution sequence in -fork mode- for app name:ebook id:0
  13. PM2 | 2016-09-26 15:00:25: App name:ebook id:0 online
  14. /home/clark/.pm2/logs/ebook-error-0.log last 10 lines:
  15. /home/clark/.pm2/logs/ebook-out-0.log last 10 lines:
  16. 0|ebook | info 2016-09-26 15:00:26 Forging enabled on account: 18314120909703123221L
  17. 0|ebook | info 2016-09-26 15:00:26 Forging enabled on account: 13969847998693785080L
  18. 0|ebook | info 2016-09-26 15:00:26 Forging enabled on account: 15336887350336188475L
  19. 0|ebook | info 2016-09-26 15:00:26 Forging enabled on account: 15106553597056061290L
  20. 0|ebook | info 2016-09-26 15:00:26 Forging enabled on account: 13719766223485644534L

pm2重启应用

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 restart ebook
  2. [PM2] Applying action restartProcessId on app [ebook](ids: 0)
  3. [PM2] [ebook](0) ?
  4. ┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
  5. App name id mode pid status restart uptime cpu mem watching
  6. ├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
  7. ebook 0 fork 28059 online 1 0s 0% 10.5 MB disabled
  8. └──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
  9. Use `pm2 show <id|name>` to get more details about an app

pm2重载应用

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 reload ebook
  2. [PM2] Applying action reloadProcessId on app [ebook](ids: 0)
  3. [PM2] [ebook](0) ?
  4. ┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
  5. App name id mode pid status restart uptime cpu mem watching
  6. ├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
  7. ebook 0 fork 28128 online 2 0s 0% 10.5 MB disabled
  8. └──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
  9. Use `pm2 show <id|name>` to get more details about an app

pm2查看已启动的应用列表

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 list
  2. ┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
  3. App name id mode pid status restart uptime cpu mem watching
  4. ├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
  5. ebook 0 fork 28128 online 2 41s 0% 86.6 MB disabled
  6. └──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
  7. Use `pm2 show <id|name>` to get more details about an app

pm2查看应用详情

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 show ebook
  2. Describing process with id 0 - name ebook
  3. ┌───────────────────┬─────────────────────────────────────────┐
  4. status online
  5. name ebook
  6. restarts 2
  7. uptime 59s
  8. script path /data/blockchain/ebookcoin/app.js
  9. script args N/A
  10. error log path /home/clark/.pm2/logs/ebook-error-0.log
  11. out log path /home/clark/.pm2/logs/ebook-out-0.log
  12. pid path /home/clark/.pm2/pids/ebook-0.pid
  13. interpreter node
  14. interpreter args N/A
  15. script id 0
  16. exec cwd /data/blockchain/ebookcoin
  17. exec mode fork_mode
  18. node.js version 0.12.15
  19. watch & reload ?
  20. unstable restarts 0
  21. created at 2016-09-26T09:05:29.979Z
  22. └───────────────────┴─────────────────────────────────────────┘
  23. Revision control metadata
  24. ┌──────────────────┬─────────────────────────────────────────────┐
  25. revision control git
  26. remote url https://github.com/Ebookcoin/ebookcoin.git │
  27. repository root /data/blockchain/ebookcoin
  28. last update 2016-09-26T09:06:26.562Z
  29. revision f708fa4f523ec954b1a73694dec51ece7bb744c4
  30. comment Merge pull request #4 from robbinhan/master │
  31. branch master
  32. └──────────────────┴─────────────────────────────────────────────┘
  33. Code metrics value
  34. ┌────────────┬────────┐
  35. Loop delay 0.12ms
  36. └────────────┴────────┘
  37. Add your own code metrics: http://bit.ly/code-metrics
  38. Use `pm2 logs ebook [--lines 1000]` to display logs
  39. Use `pm2 monit` to monitor CPU and Memory usage ebook

pm2停止应用

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 stop ebook
  2. [PM2] Applying action stopProcessId on app [ebook](ids: 0)
  3. [PM2] [ebook](0) ?
  4. ┌──────────┬────┬──────┬─────┬─────────┬─────────┬────────┬─────┬────────┬──────────┐
  5. App name id mode pid status restart uptime cpu mem watching
  6. ├──────────┼────┼──────┼─────┼─────────┼─────────┼────────┼─────┼────────┼──────────┤
  7. ebook 0 fork 0 stopped 2 0 0% 0 B disabled
  8. └──────────┴────┴──────┴─────┴─────────┴─────────┴────────┴─────┴────────┴──────────┘
  9. Use `pm2 show <id|name>` to get more details about an app

将应用从pm2中删除

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 delete ebook
  2. [PM2] Applying action deleteProcessId on app [ebook](ids: 0)
  3. [PM2] [ebook](0) ?
  4. ┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬─────┬─────┬──────────┐
  5. App name id mode pid status restart uptime cpu mem watching
  6. └──────────┴────┴──────┴─────┴────────┴─────────┴────────┴─────┴─────┴──────────┘
  7. Use `pm2 show <id|name>` to get more details about an app

退出pm2

  1. clark@E540:/data/blockchain/ebookcoin$ pm2 kill
  2. [PM2] Stopping PM2...
  3. [PM2][WARN] No process found
  4. [PM2] All processes have been stopped and deleted
  5. [PM2] PM2 stopped