一套完整的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

   

扫描二维码关注公众号,回复: 10085256 查看本文章

    使用如下命令以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="width: 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统一对外的接口。

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

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

猜你喜欢

转载自www.cnblogs.com/soulleoo/p/12532213.html