• 生产环境下的pm2部署
    • 前言
      • 部署前请先安装Ebookcoin
      • pm2简介
      • pm2主要特性
      • pm2与forever对比
      • pm2安装和升级
      • pm2用法
      • pm2高级用法(远程部署)
    • pm2启动模式分类
      • fork模式
      • cluster模式
    • pm2部署ebookcoin案例
      • 用pm2启动ebookcoin的app.js并将应用名字设置为“ebook”
      • 检查日志
      • pm2重启应用
      • pm2重载应用
      • pm2查看已启动的应用列表
      • pm2查看应用详情
      • pm2停止应用
      • 将应用从pm2中删除
      • 退出pm2

    生产环境下的pm2部署

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


    • 生产环境下的pm2部署
      • 前言
        • 部署前请先安装Ebookcoin
        • pm2简介
        • pm2主要特性
        • pm2与forever对比
        • pm2安装和升级
        • pm2用法
        • pm2高级用法(远程部署)
      • pm2启动模式分类
        • fork模式
        • cluster模式
      • pm2部署ebookcoin案例
        • 用pm2启动ebookcoin的app.js并将应用名字设置为“ebook”
        • 检查日志
        • pm2重启应用
        • pm2重载应用
        • pm2查看已启动的应用列表
        • pm2查看应用详情
        • pm2停止应用
        • 将应用从pm2中删除
        • 退出pm2

      前言

      部署前请先安装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