传统方案: nginx
+pm2
现在的话可以用Docker一键部署
首先说一下什么是Cluster
模块
var cluster = require('cluster');
var os = require('os'); // 获取CPU 的数量
var numCPUs = os.cpus().length;
var process = require('process')
console.log('numCPUs:', os.cpus())
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')
JS是默认单进程的,我们的服务器很多都是16核,32,64等等,如果只有单核运作,是不是很多资源就被浪费了。Cluster就使得可以多进程同享受一个端口,一个主进程去管理其他子进程。当进程出现异常就重启。
当然再这之前要利用多核资源的话,可以采用child_process
的方法,但是不能共享一个端口。
基于cluster就出现了一个node工具 pm2
pm2
基于cluster模块,可以更好的发挥性能
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核数,开启对应数⽬目的进程
当然直接写命令,也很繁琐,可以写一下 配置文件
apps:
- script : app.js
instances: 2
watch : true
env :
NODE_ENV: production
然后运行
pm2 start process.yml --env production
在线监控平台:https://id.keymetrics.io
那么后端服务跑起来了,前端怎么部署呢???nginx就是一个常见的方案
nginx
配置静态服务,以及反向代理(解决跨域问题)
# /etc/nginx/sites-enable
# taro
server {
listen 80;
server_name taro.josephxia.com;
location / {
root /root/source/taro-node/dist;
index index.html index.htm;
}
location ~ \.(gif|jpg|png)$ {
root /root/source/taro-node/server/static;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
} }
# 验证Nginx配置
nginx -t
# 重新启动Nginx
service restart nginx
nginx -s reload
上面说的这些,是不是光是装个环境就麻烦的要死。所以现代的Docker就应运而生了。
Docker
优势google一搜一大堆,总结下就是轻量,快,管理容易
# 拉取官⽅方镜像
docker pull nginx
# 查看
docker images nginx
# 启动镜像
mkdir www
echo 'hello docker!!' >> www/index.html
# 启动
# www⽬目录⾥里里⾯面放⼀一个index.html
docker run -p 80:80 -v $PWD/www:/usr/share/nginx/html -d nginx
# 查看进程
docker ps
docker ps -a // 查看全部
# 伪终端 ff6容器器的uuid
# -t 选项让Docker分配⼀一个伪终端(pseudo-tty)并绑定到容器器的标准输⼊入上,
# -i 则让容器器的标准输⼊入保持打开
docker exec -it ff6 /bin/bash
# 停⽌
docker stop ff6
# 删除镜像
docker rm ff6
常见命令知道之后是不是大概心里有数是干嘛的了,
主要的核心概念就是,仓库(远程源),镜像(拉下来跑在本地的),容器(本地用来跑镜像的虚拟机)
如果想要快速部署,是不是可以自己制作镜像源,然后服务器拉下镜像,装到容器,是不是就直接部署好了,什么环境都不用装了(除了docker)
#Dockerfile
#制定node镜像的版本
FROM node:10-alpine #移动当前⽬目录下⾯面的⽂文件到app⽬目录下 ADD . /app/ #进⼊入到app⽬目录下⾯面,类似cd WORKDIR /app
#安装依赖
RUN npm install
#对外暴暴露露的端⼝口
EXPOSE 3000
#程序启动脚本
CMD ["node", "app.js"]
# Dockerfile
FROM keymetrics/pm2:latest-alpine
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN npm config set registry https://registry.npm.taobao.org/ && \
npm i
EXPOSE 3000
#pm2在docker中使⽤用命令为pm2-docker
CMD ["pm2-runtime", "start", "process.yml"]
# 定制镜像
docker build -t mypm2 .
# 运⾏
docker run -p 3000:3000 -d mypm2
那数据库这种要怎么搞?也很简单,直接用docker-compose自动拉镜像,跑起来
#docker-compose.yml
version: '3.1'
services:
mongo:
image: mongo
restart: always
ports:
- 27017:27017
mongo-express:
image: mongo-express
restart: always
ports:
- 8081:8081
# 运⾏
docker-compose up
# 后台运⾏
docker-compose up -d
用的地方要改一个地方,比如localhost改成mongo
// mongoose.js
const mongoose = require("mongoose");
// 1.连接
mongoose.connect("mongodb://mongo:27017/test", { useNewUrlParser: true }); const conn = mongoose.connection;
conn.on("error", () => console.error("连接数据库失败"));
网友评论