生产环境下的pm2部署


    请参考官方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:

    pm2主要特性

    pm2与forever对比

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

    pm2安装和升级

    pm2用法

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

    生成远程部署所需的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. },
    1. $ pm2 deploy ecosystem.json production

    更新部署

    fork模式

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

    cluster模式

    本案例演示了如何利用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

    检查日志

    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

    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
    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查看已启动的应用列表

    pm2查看应用详情

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