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)。

使用Nodejs创建基本的网站 Microblog--《Node.js开发指南》 3    cluster.js创建与CPU核心数个数相同的服务器进程,以确保充分利用CPU资源。通过cluster启动的工作进程可以直接实现端口复用,因此所有工作进程只需监听同一个端口。

2.启动脚本

建立mynodeapp文件

#! /bin/sh

NODE_ENV=production
DAEMON="node /home/nick/nodejs/examples/express_example/cluster.js"
NAME=MyNodeApp
DESC=MyNodeApp
PIDFILE="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."
                ;;
esac

exit 0

    

$chmode +x mynodeapp

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

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

使用Nodejs创建基本的网站 Microblog--《Node.js开发指南》 3

使用Nodejs创建基本的网站 Microblog--《Node.js开发指南》 3

Ubuntu 创建开机自启动脚本的方法

自动编号:

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

使用Nodejs创建基本的网站 Microblog--《Node.js开发指南》 3

指定编号:

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

编号必须在 0 至 99 之间。

使用Nodejs创建基本的网站 Microblog--《Node.js开发指南》 3

如果要卸载启动脚本:

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

使用Nodejs创建基本的网站 Microblog--《Node.js开发指南》 3

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