美文网首页
Node部署指南 && Docker入门

Node部署指南 && Docker入门

作者: Sommouns | 来源:发表于2020-01-30 15:27 被阅读0次

传统方案: 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("连接数据库失败"));

相关文章

网友评论

      本文标题:Node部署指南 && Docker入门

      本文链接:https://www.haomeiwen.com/subject/gnvithtx.html