node forever安装pm2

但是,forever能做更多的事情,比如分别记录输出和错误日志,比如可以在js中作为api使用。
$ sudo npm install forever -g #安装
$ forever start app.js #启动
$ forever stop app.js #关闭
$ forever start -l forever.log -o out.log -e err.log app.js #输出日志和错误

alinode http://alinode.aliyun.com/dashboard/apps/30

forever命令行的中文解释

子命令actions:
start:启动守护进程
stop:停止守护进程
stopall:停止所有的forever进程
restart:重启守护进程
restartall:重启所有的foever进程
list:列表显示forever进程
config:列出所有的用户配置项
set : 设置用户配置项
clear : 清楚用户配置项
logs: 列出所有forever进程的日志
logs : 显示最新的日志
columns add : 自定义指标到forever list
columns rm : 删除forever list的指标
columns set: 设置所有的指标到forever list
cleanlogs: 删除所有的forever历史日志
配置参数options:
-m MAX: 运行指定脚本的次数
-l LOGFILE: 输出日志到LOGFILE
-o OUTFILE: 输出控制台信息到OUTFILE
-e ERRFILE: 输出控制台错误在ERRFILE
-p PATH: 根目录
-c COMMAND: 执行命令,默认是node
-a, –append: 合并日志
-f, –fifo: 流式日志输出
-n, –number: 日志打印行数
–pidFile: pid文件
–sourceDir: 源代码目录
–minUptime: 最小spinn更新时间(ms)
–spinSleepTime: 两次spin间隔时间
–colors: 控制台输出着色
–plain: –no-colors的别名,控制台输出无色
-d, –debug: debug模式
-v, –verbose: 打印详细输出
-s, –silent: 不打印日志和错误信息
-w, –watch: 监控文件改变
–watchDirectory: 监控顶级目录
–watchIgnore: 通过模式匹配忽略监控
-h, –help: 命令行帮助信息

  1. forever服务器管理

创建一个web项目(express3+ejs),使用forever管理服务器。
安装express3

~ D:\workspace\javascript>express -e nodejs-forever
~ D:\workspace\javascript>cd nodejs-forever && npm install
通过forever启动应用

~ D:\workspace\javascript\nodejs-forever>forever start app.js
warn: –minUptime not set. Defaulting to: 1000ms
warn: –spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info: Forever processing file: app.js
打开浏览器: http://localhost:3000,可以看到web界面
在win下面查看forever状态

~ D:\workspace\javascript\nodejs-forever>forever list
info: No forever processes running

~ D:\workspace\javascript\nodejs-forever>forever stop app.js
error: Forever cannot find process with index: app.js
我们发现forever的程序,工作不对了!!程序明明是运行状态,通过list确看不到。接下来,切换成Linux Ubuntu继续测试。

  1. forever在Ubuntu进行服务器管理

Linux的系统环境
Linux: Ubuntu 12.04.2 64bit Server
Node: v0.11.2
Npm: 1.2.21
初始化项目:安装命令不解释了

~ cd /home/conan/nodejs
~ express -e nodejs-forever
~ cd nodejs-forever && npm install
~ sudo npm install forever -g
启动forever

~ forever start app.js
warn: –minUptime not set. Defaulting to: 1000ms
warn: –spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info: Forever processing file: app.js
查看node服务器状态

~ forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] L2tY /usr/local/bin/node app.js 18276 18279 /home/conan/.forever/L2tY.log 0:0:0:37.792

系统进程

~ ps -aux|grep node
Warning: bad ps syntax, perhaps a bogus ‘-‘? See http://procps.sf.net/faq.html
conan 18296 0.5 1.1 597696 23776 ? Ssl 15:48 0:00 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor app.js
conan 18299 0.4 0.8 630340 18392 ? Sl 15:48 0:00 /usr/local/bin/node /home/conan/nodejs/nodejs-forever/app.js

端口占用

~ netstat -nltp|grep node
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 18299/node
停止服务器

~ forever stop app.js
info: Forever stopped process:
data: uid command script forever pid logfile uptime
[0] L2tY /usr/local/bin/node app.js 18276 18279 /home/conan/.forever/L2tY.log 0:0:0:45.621
我们看到在Linux Ubuntu环境中是正常的。

  1. 模拟服务器宕机

两种测试方案:

  1. 用Linux命令,直接杀死node进程
  2. 在应用中,模拟异常退出
    1). 用Linux命令,直接杀死node进程

查看node进程,PID=18299

~ ps -aux|grep node

conan 18296 0.0 1.1 597696 23776 ? Ssl 15:48 0:00 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor app.js
conan 18299 0.0 0.8 630340 18392 ? Sl 15:48 0:00 /usr/local/bin/node /home/conan/nodejs/nodejs-forever/app.js
conan 18315 0.0 0.0 13584 956 pts/5 R+ 15:52 0:00 grep –color=auto node

杀死PID=19299

~ kill -9 18299

再看node进程,node自动重启,新的PID=18324

~ ps -aux|grep node

conan 18296 0.0 1.1 597696 23916 ? Ssl 15:48 0:00 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor app.js
conan 18316 2.6 0.8 630340 18412 ? Sl 15:52 0:00 /usr/local/bin/node /home/conan/nodejs/nodejs-forever/app.js
conan 18324 0.0 0.0 13584 956 pts/5 R+ 15:52 0:00 grep –color=auto node
我们看到看杀死node进程,forever会帮助我们,重启node。
杀死forever的monitor

~ kill -9 18296
~ ps -aux|grep node

conan 18316 0.0 0.9 630340 18644 ? Sl 15:52 0:00 /usr/local/bin/node /home/conan/nodejs/nodejs-forever/app.js
conan 18333 0.0 0.0 13584 952 pts/5 S+ 15:57 0:00 grep –color=auto node

再杀死node进程

~ kill -9 18316
~ ps -aux|grep node

conan 18336 0.0 0.0 13584 956 pts/5 S+ 15:58 0:00 grep –color=auto node
我们尝试杀死了forever的monitor,monitor程序没有自动重启,然后再杀死node进程后,node也不会自动重启了。
2). 在应用中,模拟异常退出
修改文件:app.js

~ vi app.js

//..
http.createServer(app).listen(app.get(‘port’), function(){
console.log(new Date());
console.log(‘Express server listening on port ‘ + app.get(‘port’));
});

setTimeout(function(){
console.log(new Date());
throw new Error(‘App is error from inner!’);
},10*1000);
通过node命令启动

~ node app.js
Thu Sep 26 2013 16:08:44 GMT+0800 (CST)
Express server listening on port 3000
Thu Sep 26 2013 16:08:54 GMT+0800 (CST)

/home/conan/nodejs/nodejs-forever/app.js:41
throw new Error(‘App is error from inner!’);
^
Error: App is error from inner!
at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
10秒后,由于内部错误, node进程挂掉了。
通过forever命令启动

~ mkdir logs
~ chmod 777 -R logs
~ forever -p . -l ./logs/access.log -e ./logs/error.log start app.js

检查错误日志

~ cat logs/access.log ls
Thu Sep 26 2013 16:15:02 GMT+0800 (CST)
Express server listening on port 3000
Thu Sep 26 2013 16:15:12 GMT+0800 (CST)

/home/conan/nodejs/nodejs-forever/app.js:41
throw new Error(‘App is error from inner!’);
^
Error: App is error from inner!
at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
error: Forever detected script exited with code: 8
error: Forever restarting script for 1 time
Thu Sep 26 2013 16:15:13 GMT+0800 (CST)
Express server listening on port 3000
Thu Sep 26 2013 16:15:23 GMT+0800 (CST)

/home/conan/nodejs/nodejs-forever/app.js:41
throw new Error(‘App is error from inner!’);
^
Error: App is error from inner!
at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
error: Forever detected script exited with code: 8
error: Forever restarting script for 2 time
Thu Sep 26 2013 16:15:23 GMT+0800 (CST)
Express server listening on port 3000
Thu Sep 26 2013 16:15:33 GMT+0800 (CST)

/home/conan/nodejs/nodejs-forever/app.js:41
throw new Error(‘App is error from inner!’);
^
Error: App is error from inner!
at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
error: Forever detected script exited with code: 8
error: Forever restarting script for 3 time
Thu Sep 26 2013 16:15:33 GMT+0800 (CST)
Express server listening on port 3000
Thu Sep 26 2013 16:15:43 GMT+0800 (CST)

/home/conan/nodejs/nodejs-forever/app.js:41
throw new Error(‘App is error from inner!’);
^
Error: App is error from inner!
at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
error: Forever detected script exited with code: 8
error: Forever restarting script for 4 time
我们发现每10秒种,node内部挂掉,然后再被forever重启!!
通过list我们手动刷新几次也可以看到pid是变的。

~ forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] SmtT /usr/local/bin/node app.js 18444 18579 logs/access.log 0:0:0:7.211

~ forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] SmtT /usr/local/bin/node app.js 18444 18579 logs/access.log 0:0:0:8.921

~ forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] SmtT /usr/local/bin/node app.js 18444 18604 logs/access.log 0:0:0:0.177

~ forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] SmtT /usr/local/bin/node app.js 18444 18604 logs/access.log 0:0:0:2.206
这样forever就帮助我们完成了,几项比较重要服务器管理功能:“启动/停止命令简单”,“支持热部署”,“宕机重启”,“监控界面和日志”。
比起upstart管理,省略了配置脚本的步骤(/etc/init/nodejs-xx.conf)。其他的功能,还要更近一步的使用才知道。

  1. 开发环境和生产环境的启动配置

开发环境

~ cd /home/conan/nodejs/nodejs-forever/
~ forever -p . -l ./logs/access.log -e ./logs/error.log -a -w start app.js
生产环境

~ export LOG=/var/log/nodejs/project
~ export PID=/var/log/nodejs/project/forever.pid
~ export APP_PATH=/home/conan/nodejs/nodejs-forever
~ export APP=$APP_PATH/app.js

~ forever -p $APP_PATH -l $LOG/access.log -e $LOG/error.log -o $LOG/out.log -a –pidFile $PID start $AP

================================================================

pm2的详解 充分利用cpu核心数

pm2 是一个带有负载均衡功能的Node应用的进程管理器.
当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的。它非常适合IaaS结构,但不要把它用于PaaS方案(随后将开发Paas的解决方案).

备注:SaaS、PaaS和IaaS是云服务模式。
SaaS 软件即服务,例如Google的 Gmail 邮箱服务.面向应用型用户.
PaaS 平台即服务.例如Google的GAE,面向开发型用户
IaaS 基础架构即服务,例如亚马逊的AWS,IaaS对于不知道新推出的应用程序/网站会有多成功的创业公司来说非常有用
请参考 云服务模式:SaaS、PaaS和IaaS,哪一种适合你?

主要特性:

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

测试过Nodejs v0.11 v0.10 v0.8版本,兼容CoffeeScript,基于Linux 和MacOS.

安装
npm install -g pm2

用法
$ 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 -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

0秒停机重载:
这项功能允许你重新载入代码而不用失去请求连接。
注意:
仅能用于web应用
运行于Node 0.11.x版本
运行于 cluster 模式(默认模式)
$ pm2 reload all

CoffeeScript:
$ pm2 start my_app.coffee #这就是全部

PM2准备好为产品级服务了吗?
只需在你的服务器上测试
$ git clone https://github.com/Unitech/pm2.git
$ cd pm2
$ npm install # 或者 npm install –dev ,如果devDependencies 没有安装
$ npm test

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

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

https://cnodejs.org/topic/563f6e708e90ab7c391e9f71

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器