对部署_nginx_pm2_docker的研究 1

   如何构建⼀个⾼可⽤的node环境
   
   主要解决问题
   故障恢复
   多核利⽤
   http://www.sohu.com/a/247732550_796914
   多进程共享端⼝
 
 
// app.js
const Koa = require('koa');
// 创建⼀个Koa对象表示web app本身:
const app = new Koa();
// 对于任何请求,app将调⽤该异步函数处理请求:
app.use(async (ctx, next) => {
// 随机产⽣错误
Math.random() > 0.9 ? aaa() : '2'
await next();
ctx.response.type = 'text/html';
ctx.response.body = '<h1>Hello, koa2!</h1>';
});
if (!module.parent) {
app.listen(3000);
console.log('app started at port 3000...');
} else {
module.exports = app
}
 
// test.js
var http = require('http');
setInterval(async () => {
try {
await http.get('http://localhost:3000');
} catch (error) {
}
}, 1000)
// cluster.js
var cluster = require('cluster');
var os = require('os'); // 获取CPU 的数量
var numCPUs = os.cpus().length;
var process = require('process')
console.log('numCPUs:', numCPUs)
 
var workers = {};
if (cluster.isMaster) {
// 主进程分⽀
cluster.on('death', 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.use(async (ctx, next) => {
console.log('worker' + cluster.worker.id + ',PID:' + process.pid)
next()
})
app.listen(3000);
}
// 当主进程被终⽌时,关闭所有⼯作进程
process.on('SIGTERM', function () {
for (var pid in workers) {
process.kill(pid);
}
process.exit(0);
});
require('./test')
 
⽂件上传服务器
scp (最原始)
scp docker-compose.yml root@47.98.252.43:/root/source/ #⽂件
scp -r mini-01 root@47.98.252.43:/root/source/ #⽂件夹
git (实际⼯作中)
deploy插件 (debug)
 
PM2的应⽤
内建负载均衡(使⽤Node cluster 集群模块、⼦进程,可以参考朴灵的《深⼊浅出node.js》⼀书
第九章)
线程守护,keep alive
0秒停机重载,维护升级的时候不需要停机.
现在 Linux (stable) & MacOSx (stable) & Windows (stable).多平台⽀持
停⽌不稳定的进程(避免⽆限循环)
控制台检测 https://id.keymetrics.io/api/oauth/login#/register
提供 HTTP API
 
配置
npm install -g pm2
pm2 start app.js --watch -i 2
// watch 监听⽂件变化
// -i 启动多少个实例
pm2 stop all
pm2 list
pm2 start app.js -i max # 根据机器CPU核数,开启对应数⽬的进程
配置process.yml
 
apps:
- script : app.js
instances: 2
watch : true
env :
NODE_ENV: production
Keymetrics在线监控
https://id.keymetrics.io
pm2 link 8hxvp4bfrftvwxn uis7ndy58fvuf7l TARO-SAMPLE
 
pm2设置为开机启动
pm2 startup
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

       

原文地址:https://www.cnblogs.com/zhouyideboke/p/13224323.html