美文网首页
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