1. 使用cluster模块

      创建cluster.js,调用app.js

var cluster = require('cluster');var os = require('os');//获取CPU数量var numCPUs = os.cpus().length;var workers = {};if(cluster.isMaster) {  //主进程分支  cluster.on('exit', function (worker) {    //当一个工作进程结束时,重启工作进程    delete workers[worker.pid];    worker = cluster.fork();    workers[worker.pid] = worker;  });  //初始开启与CPU数量相同的工作进程  for(var i = 0; i < numCPUs; i++) {    var worker = cluster.fork();    workers[worker.pid] = worker;  }} else {  //工作进程分支,启动服务器  var app = require('./app');  app.listen(3000);}//当主进程被终止时,关闭所有工作进程process.on('SIGTERM', function() {  for( var pid in workers) {    process.kill = (pid);  }  process.exit(0);});

    在终端运行

$node cluster.js

    可以看到进程列表中启动了多个node进程(4核CPU)。

cluster.js创建与CPU核心数个数相同的服务器进程,以确保充分利用CPU资源。通过cluster启动的工作进程可以直接实现端口复用,因此所有工作进程只需监听同一个端口。

2.启动脚本

建立mynodeapp文件

#! /bin/shNODE_ENV=productionDAEMON="node /home/nick/nodejs/examples/express_example/cluster.js"NAME=MyNodeAppDESC=MyNodeAppPIDFILE="mynodeapp.pid"case "$1" in  start)        echo "Starting $DESC: "                nohup $DAEMON > /dev/null &        echo $1 > $PIDFILE        echo "$NAME."                ;;   stop)        echo "Stopping $DESC: "                pid='cat $PIDFILE'        kill $pid                rm $PIDFILE        echo "$NAME."                ;;esacexit 0

    

$chmode +x mynodeapp

    赋予执行权限,其通过nohup启动服务器,使进程不会因为退出终端而关闭,同时将主进程pid写入文件,当调用结束时,从文件读取pid,终止主进程以关闭服务器。

    运行结果却不好,可以启动程序,但是无法关闭。

自动编号:

$ cd /etc/init.d$ sudo chmod 755 /etc/init.d/filename$ sudo update-rc.d filename defaults

指定编号:

$ cd /etc/init.d$ sudo chmod 755 /etc/init.d/filename$ sudo update-rc.d filename defaults N

编号必须在 0 至 99 之间。

如果要卸载启动脚本:

$ cd /etc/init.d$ sudo update-rc.d -f filename remove

    重新启动系统之后,mynodeapp并没有开机启动cluster.js程序,依然如上所示,只可以start,但是出现故障,无法stop,必须手动kill进程。