一套完整的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="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統一對外的接口。

 

 

 

 

  第三節完,如有任何問題,請留意。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM