1. 程式人生 > >Nginx的安裝以及反向代理和負載均衡的配置

Nginx的安裝以及反向代理和負載均衡的配置

發布 event 檢驗 true 環境搭建 user moni 三臺 p地址

環境說明

由於我使用的是windows系統,所以我用虛擬機虛擬出來了3臺linux系統

  • 虛擬機一:192.168.1.20 (Nginx反向代理和負載均衡服務器,系統kali linux)
  • 虛擬機二:192.168.1.19 (node服務器一,系統ubuntu 17.10)
  • 虛擬機三:192.168.1.22(node服務器二,系統ubuntu 17.10)

環境需要的程序

  • git
  • Node
  • Nginx
  • pm2

首先環境的搭建,由於這三臺電腦都是我剛剛虛擬出來的,所以什麽環境都沒有!

虛擬機一的環境搭建

由於我們的虛擬機一主要是用來做Nginx的反向代理和負載均衡的,那麽我們只需要安裝Nginx就可以

$ sudo apt-get install nginx -y

ok我們訪問下Nginx反向代理服務器是否正常啟動
技術分享圖片

虛擬機二和虛擬機三的環境搭建

我比較喜歡使用nvm去安裝node,因為nvm能讓我自由的去切換node的版本(兩臺node服務器環境必須一致哦!)

//安裝git工具
$ sudo apt-get install git

//從github網站把nvm的源碼下載下來放到當前登錄用戶的.nvm目錄下(以後方便我們找)
$ git clone https://github.com/creationix/nvm.git ~/.nvm

//讓nvm命令在每次打開shell窗口的時候生效
$ echo "source ~/.nvm/nvm.sh" >> ~/.bashrc

//讓nvm的命令立即生效(關閉shell窗口重新打開也可以生效)
$ source ~/.nvm/nvm.sh

//查看nvm是否安裝成功和查看當前的node版本信息
$ nvm ls

技術分享圖片

我們安裝下node,此處直接安裝stable最新的穩定版本

//這個時間會比較長,稍微有點耐心
$ nvm install stable

技術分享圖片

安裝pm2

$ npm install pm2 -g

技術分享圖片

編寫我們的項目代碼

初始化項目創建package.json

$ mkdir nodeapp && cd $_
$ npm init
$ npm install koa --save

創建我們的node主程序入口文件app.js(由於我們只關註與上線發布和負載均衡所以node項目只是一個Hello Koa)

const Koa = require(‘koa‘);
const app = new Koa();
 
app.use(ctx => {
  ctx.body = ‘Hello Koa‘;
});
 
app.listen(3000);

編寫pm2的配置文件pm2.json

pm2 是一個帶有負載均衡功能的Node應用的進程管理器.
當你要把你的獨立代碼利用全部的服務器上的所有CPU,並保證進程永遠都活著,0秒的重載。pm2官網
pm2重用的命令

  • pm2 start app.js : 啟動服務,入口文件是app.js。
  • pm2 start app.js -i [n] --name [name] : 啟動n個進程,名字命名為name。
  • npm stop [name or id] : 停止服務。
  • npm stop all : 停止所有服務。
  • npm delete [name or id] : 刪除服務。
  • npm delete all : 刪除所有服務。
  • npm restart [name or id] : 重啟服務。
  • npm reload [name or id] : 和rastart功能相同,但是可以實現0s的無縫銜接;如果有nginx的使用經驗,可以對比nginx reload指令。
  • pm2 monit : 對服務進行監控。
  • pm2 start **.json : 啟動制定配置文件的服務

ok知道pm2怎麽用了,我們采用配置文件的方式啟動,接下來編寫我們的pm2.json配置文件

{
    "name"      : "nodeApp",
    //max_memory_restart: "300M",//設置node單個進程可占用最大的內存,如果內存使用率超過300M,pm2自動重啟該進程
    "script"    : "app.js",//node主入口文件
    "out_file" : "logs/out.log",
    "error_file" : "logs/error.log",
    "instances"  : "max",//讓node程序占滿你的cpu,發揮cpu最大的功效
    "exec_mode"  : "cluster",//以主進程的方式啟動
    "watch":true
}

那pm2的配置文件和node程序寫好了我們在本地測試下pm2和node程序能不能正常的啟動(有點小尷尬,自己本機I7的6700K的CPU居然被這個小程序給占滿了~~~)
技術分享圖片
技術分享圖片

上線部署到我們的兩臺node服務器中

其實說到上線部署呢,我們應該有自己的git服務器,所有的代碼都應該從git服務器上去拉取,部署呢?應該有一個統一部署的方式通常使用的是jenkins,編寫好我們統一部署的shell腳本(在這裏體現出來為什麽所有的服務器環境必須一致了,方便管理啊),用jenkins一鍵部署,但是.....本次只是做個小實驗,沒必要這麽大動幹戈,所以呢,我們還是手動的上傳下代碼手動起下服務吧!(下次介紹如何搭建自己的git服務器和jenkins的使用)
我們把項目中的node_moudles文件夾刪除然後給項目打個包準備上傳服務器,項目結構應該是這樣的

技術分享圖片

我們使用scp命令用於將一個文件從本地上傳至服務器,或者從服務器上把一個文件下載至本地
鄭重說明:由於我本地用的windows系統,為了演示我把項目文件拽進了另一個linux虛擬機中進行的上傳

//scp 本地文件 遠程服務器用戶名@遠程服務器地址:/home/shuoer

//把項目文件上傳至虛擬機一
scp nodeapp.zip [email protected]/home/shuoer

//把項目文件上傳至虛擬機二
scp nodeapp.zip [email protected]/home/shuoer

額.....報錯了!

技術分享圖片

額...好像ssh服務沒起來,好像也沒有安裝

//安裝ssh
$ sudo apt-get install ssh -y

//不管ssh啟動沒有直接重啟ssh
$ sudo service ssh restart

技術分享圖片

ok,好不容易上傳成功了,我們分別進入這兩臺服務器進行項目解壓和安裝依賴最後啟動服務

技術分享圖片

為了明顯我們在兩臺服務器上分別讓頁面輸出自己的ip地址

技術分享圖片

重頭戲來了,Nginx的反向代理和負載均衡

進入我們的虛擬機一,配置nginx.conf
溫馨提示:

  • nginx的配置文件默認在/etc/nginx/nginx.conf
  • 網站根目錄默認在/var/www/html

技術分享圖片

upstream模塊

負載均衡模塊用於從”upstream”指令定義的後端主機列表中選取一臺主機。nginx先使用負載均衡模塊找到一臺主機,再使用upstream模塊實現與這臺主機的交互。

nginx 的兩種負載均衡方式

  • 輪訓加權(也可以不加權,就是1:1負載)
    我們可以根據兩臺服務器的性能進行分配權重,比如192.168.1.19服務器比較牛逼,另外一個比較差我們可以這麽配置,按照4:1分配,比如5次訪問有4次訪問的是192.168.1.19服務器
    shell upstream test { server 192.168.1.19:3000 weight=4; server 192.168.1.22:3000 weight=1; }
  • ip_hash(同一ip會被分配給固定的後端服務器,解決session問題)
    shell #”ip_hash”只能在upstream {}中使用。這條指令用於通知nginx使用ip hash負載均衡算法。 #如果沒加這條指令,nginx會使用默認的round robin負載均衡模塊。 upstream test { ip_hash; server 192.168.1.19:3000; server 192.168.1.22:3000; }

打開nginx.conf我的可能和你們的都不一樣(我把所有的註釋都刪除了,是不是整潔了很多?)
填入如下代碼,這裏我沒有采用負載均衡的任何算法

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    #include /etc/nginx/conf.d/*.conf;
    #include /etc/nginx/sites-enabled/*;
    #用於設置負載的服務器列表
    upstream test {
        #虛擬機二
        server 192.168.1.19:3000;
        #虛擬機三
        server 192.168.1.22:3000;
    }
    server {
        #監聽80端口
        listen 80;
        location / {
            #轉發的地址,此處為upstream模塊
            proxy_pass http://test;
        }
    }
}

ok,將配置文件保存好之後重啟我們的nginx

$ sudo service nginx restart

打開瀏覽器檢驗下我們的成果

技術分享圖片

Nginx的安裝以及反向代理和負載均衡的配置