• 一套完整的web项目框架:在使用Docker环境下,nginx+nodejs部署后端服务,mysql作数据库存储,vue处理前端展示,Jenkins构建自动化发布,git代码托管(三)


      本篇BLOG主要分为7个小节讲解,每个小节独立一篇,方便编写和阅读:

     (最后更新日期:未完)

    第三节:nginx+nodejs部署后端服务

       1.docker安装nginx

       使用如下命令查询docker镜像库中nginx的版本信息:

    sudo docker search nginx

       

        使用命令拉取最新版本的nginx镜像:

    sudo docker pull nginx

       命令结束后,通过如下命令查看已拉取的镜像:

    sudo docker images

       

        使用如下命令以latest版本的镜像创建容器,并映射8004端口,容器命名为mynginx。

    sudo docker run -d -p 8004:8004 --name mynginx nginx:latest

       使用如下命令查看容器,到这一步,证明nginx的容器已成功创建。

    sudo docker ps

       2.docker安装node.js

       安装步骤基本与docker安装nginx一致,唯一不同就是创建node.js的容器命令,如下:

    sudo docker run -d -p 8888:8888 --name mynode node:latest

       安装完成,通过查看容器的命令,可以看到如:

      3.在node.js容器npm安装express框架,使用pm2管理node.js

       这里说明一下,express是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。express框架的好处,后续可以一起开发。这里先引用试一下水深。

       通过如下命令,进入mynode容器:

    sudo docker exec -it mynode /bin/bash

        此时可以使用以下命令查看node的版本:

    node -v

        因为新版node.js已集成npm(node包管理工具),同样可以使用以下命令查看npm的版本:

    npm -v

      4.在node.js容器npm安装pm2

       pm2是一个node.js的管理器,可以很方便管理,有效监控node.js的运行情况。   

       执行如下命令来安装pm2:  

    npm install -g pm2

       有可能安装到最后有两个警告,可以忽略不计。安装完后,可以看到:

       5.使用pm2管理node.js

       本节的例子引用echarts,作一个简单展示,后续讲解vue的时候,会另作例子说明。

       创建目录/root/node_demo/node_express/04,并创建文件text.html和node_express_04.js,内容分别如下:

    <!DOCTYPE html>
    <html>
        <head>
                <meta charset="utf-8">
                    <title>第一个 ECharts 实例</title>
                        <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
        </head>
        <body>
                    <div id="main" style=" 600px;height:400px;"></div>
                    <script type="text/javascript">
                    var myChart = echarts.init(document.getElementById('main'));
                    var option = {
                          title: {text: '第一个 ECharts 实例'},
                          tooltip: {},
                          legend: {data:['销量']},
                          xAxis: {data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]},
                          yAxis: {},
                          series: [{
                                        name: '销量',
                                        type: 'bar',
                                        data: [5, 20, 36, 10, 10, 20]
                                    }]
                    };
    myChart.setOption(option); </script> </body> </html>
    var express = require('express');
    var app = express();
    
    app.get('/text.html', function (req, res) {
                           res.sendFile( __dirname + "/" + "text.html" );
    })
    
    var server = app.listen(8888, function () {
    
                  var host = server.address().address
                  var port = server.address().port
                  console.log("应用实例,访问地址为 http://%s:%s", host, port)
    
    })

       以上的js文件内容,大致意思是,引用express框架,创建一个web服务,返回一个指定页面。

       接下落可以使用pm2启动node.js,先执行如下命令查看目前node.js运行情况:

    /usr/local/bin/pm2 list

        再执行启动node.js的命令:

    /usr/local/bin/pm2 start /root/node_demo/node_express/04/node_express_04.js -i max

        

        到这一步时,已经可以先看一下半成品,激励一下自己了。打开浏览器,云主机的IP+端口8888

       但这不是我们的目的,我们目的是构建经nginx做反向代理,node.js做服务逻辑处理过程,接下来咱们继续。

       pm2资料补充,常用的命令有见如下,详细可查看nodeJS进程管理器pm2的blog。

    pm2 start app.js -i 4                #后台运行pm2,启动4个app.js 
                                                   # 也可以把'max' 参数传递给 start
                                                   # 正确的进程数目依赖于Cpu的核心数目
    pm2 start app.js --name my-api         # 命名进程
    pm2 list                                 # 显示所有进程状态
    pm2 monit                                # 监视所有进程
    pm2 logs                                 #  显示所有进程日志
    pm2 stop all                             # 停止所有进程
    pm2 restart all                          # 重启所有进程
    pm2 reload all                           # 0秒停机重载进程 (用于 NETWORKED 进程)
    pm2 stop 0                               # 停止指定的进程
    pm2 restart 0                            # 重启指定的进程
    pm2 startup                              # 产生 init 脚本 保持进程活着
    pm2 web                                  # 运行健壮的 computer API endpoint (http://localhost:9615)
    pm2 delete 0                             # 杀死指定的进程
    pm2 delete all                           # 杀死全部进程

      6.设置nginx作反向代理

       执行完第2到5步后,已经完成了用node.js部署web服务的环节,但不是我们此次框架的目标。我们是要使用nginx作为反向代理,统一处理对外部请求的分配和负载均衡等等操作,再通过内部网络指向node.js服务,处理业务逻辑计算。

       下面以最简单的方式开始配置nginx:

        在云主机终端上输入如下命令,获取node.js服务容器的内部IP,以便接下来的配置使用。

       接下来,进入第1点中介绍的nginx容器mynginx,并进入如下指定的目录、

    sudo docker exec -it mynginx /bin/bash
    cd /etc/nginx/conf.d

       创建文件odoo.conf,里面内容如下:

    server{
            listen 8004;
    
            location /{
    
            proxy_pass http://172.18.0.2:8888;   #反向代理,指向具体的node监听端口,配置node内部IP和端口
    
            root   /root/node_demo/node_express/04;
    
            index  text.html;
    
            proxy_redirect     off;                           #关闭地址的重定向
    
            # 在代理请求头中加入下面的信息,方便我们用nodejs获取一些客户端信息
    
            proxy_set_header   Host             $host;        #本机地址(ip或域名)
    
            proxy_set_header   X-Real-IP        $remote_addr; #客户端真实ip
    
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;#客户端真实ip
    
        }
    }

       在nginx容器里,通过如下命令重启nginx服务。   

     

        此时,可以在浏览器上输入地址,云主机的IP+端口8004。如同样访问到node.js的web服务。 

      

      7.总结:访问云主机的IP+端口8888,就是直接访问一node.js服务器;而访问云主机的IP+端口8004,是访问nginx服务器,由nginx做反向代理指到node.js服务处理request和返回response。正式环境下,对外不会开放端口8888的,只会由端口8004统一对外的接口。

      第三节完,如有任何问题,请留意。

    ---------------------------------------------------------------------

  • 相关阅读:
    matlab sort函数
    演化计算实数空间变异算子
    SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子
    matlab优化函数fminunc
    mat文件读写
    matlab基本函数 randn,rand,orth
    matlab @(x)构造匿名函数
    java读取写入CSV文件
    递归解决遍历问题
    递归解决全排列问题
  • 原文地址:https://www.cnblogs.com/soulleoo/p/12532213.html
Copyright © 2020-2023  润新知