Nginx的反向代理與負載均衡--配置Nginx

前言

參考鏈接:nginx_百度百科

  • Nginx 是一個非常輕量級的服務(wù)器,他雖輕但是他最大的優(yōu)點就是可以承載大量的并發(fā)华望,所以說一般的話很少有用 Node 直接去做服務(wù)器讓用戶去訪問的蕊蝗,因為 Node 本身就需要做非 常非常多的事情,雖然說簡單的可以使用 Node 直接開啟赖舟,但是對于負載和并發(fā) Node 是弱項蓬戚,就是反向代理和并發(fā)是 Node 整個的弱項,所以我們需要在前面用 Nginx 擋一層宾抓,這樣的話對于我們整個的系統(tǒng)的運維架構(gòu)來講也是一個非常得力的一個助手子漩,還有就是跟其他的比如說我們后層整個架構(gòu)的設(shè)計屬于運維的這一塊,它也是有一種先天優(yōu)勢的這樣的服務(wù)器

概述

主要結(jié)構(gòu)

  • 什么是反向代理與負載均衡
    • 反向代理
    • 負載均衡
  • Nginx 負載均衡的實現(xiàn)
  • HTTP UPstream 模塊
    • 什么是 HTTP Upstream 模塊
    • ip_hash 指令 -- 落到哪個上
    • server 指令 -- server 的權(quán)重
    • UPstream 指令
  • 其他負載均衡的方法
    • 對于我們前端而言只需要將負載子我們的項目里面配置好就可以了不需要去太深入的學(xué)習(xí)石洗,只要給人家運維一眼一口幢泼,然后知道怎么配合就完了,因為對于運維來講讲衫,他們是不太懂 Node 的什么什么東西的缕棵,他們只會配這個 Nginx 的,所以說我們學(xué)這個的話只要學(xué)的夠用就 ok 了

1. 什么是反向代理與負載均衡

  1. 反向代理
image.png
  • 舉例說明:
    • 比如說平時我們上谷歌上不了然后需要翻墻焦人,谷歌是我們明確的去要訪問的站點挥吵,這個時候我們會用一些翻墻的工具(代理服務(wù)器),這個代理服務(wù)器幫我們?nèi)』毓雀杞o我們看花椭,這個就是一個正向的代理
    • 那么反向 代理剛好是相反的:我們不知道去取哪一臺機器忽匈,然后代理幫我們?nèi)ト。缓蟀讶〉降膬?nèi)容返回給我們
    • 一個是明確的知道矿辽,一個是不知道丹允,這就是正向代理和反向代理
  • 上圖解釋
    • 就是用自己的計算機 A 想訪問國外的網(wǎng)站 B 郭厌,訪問不了,就有一個中間的服務(wù)器 C 它去訪問國外的網(wǎng)站 B 雕蔽,其實如果是把這個 C 裝到我們自己的電腦上折柠,我們自己的電腦訪問 C ,然后 C 再去訪問 B 批狐,這個時候這個 C 就叫代理服務(wù)器扇售,這個時候就是正向代理,他有一個特點嚣艇,就是我們一定知道要訪問哪個網(wǎng)站
    • 還有就是當(dāng)我們有一個服務(wù)器集群承冰,而且服務(wù)器集群中的每臺服務(wù)器的內(nèi)容都是一樣的時候,同樣我們從個人的電腦訪問到比如說 現(xiàn)在我們有四臺 Node 的機器 食零,但是我們無法訪問困乒,這個時候有第三方的服務(wù)器是可以訪問到 那四個 Node 的機器的 ,這個時候我們就可以借助這個第三方的服務(wù)器去訪問贰谣, 但是我們并不知道它最后會落到四臺中的哪一臺機器上娜搂,這個就是反向代理
  1. 負載均衡
image.png
  • 跟上面的反向代理有一個息息相關(guān)的東西就是負載均衡
    • 就是上面的四臺機器,你不知道最終要找的是誰吱抚,但是 Nginx 知道百宇,它會幫你找到壓力最小的那個服務(wù)器然后返回給你,就這樣的可以分擔(dān)你的壓力
  • 上圖需要注意的點
    • 在建立很多很多個服務(wù)器的時候频伤,要確保每臺服務(wù)器上的東西得是一樣的
    • 上圖中所說的中間服務(wù)器恳谎,在本章中指的就是 Nginx

2. Nginx 負載均衡的實現(xiàn)

image.png

3. HTTP UPstream 模塊

  1. 什么是 HTTP UPstream 模塊
image.png
  1. ip_hash 指令
image.png
  • 這個是比如用戶落在這樣一臺服務(wù)器上了,然后下次用戶一刷新又落到別的上面了憋肖,這個就不太對了因痛,所以 ip_hash 是為了保證用戶再次刷新的時候還能落到他之前落到的那臺服務(wù)器上,這樣就 ok 了
  1. server 指令
image.png
  • 這個是:你可以指定這臺服務(wù)器的權(quán)重岸更,就是說如果你知道了這臺機器要比別的優(yōu)秀鸵膏,那么你可以給它的權(quán)重給標(biāo)的高一點,那么更多的請求就會落到這個你認為優(yōu)秀的機器上面怎炊,默認是 1:1:1 的谭企,這個 1:1:1 可以舉成 2:1:1 的例子來說明:就是現(xiàn)在有三臺機器,第一臺的權(quán)重被設(shè)置為了 2 后面兩臺都是 1 评肆,這樣的話落到第一臺的幾率就是 2 / 3债查,后面兩臺的都是 1 / 3
  1. UPstream 指令
image.png

4. 其他負載均衡的方法

image.png

上面的主要是理論下面是實戰(zhàn)操作

macOS 部署 Nginx

image.png
  1. 第一步的網(wǎng)址是 MAC 系統(tǒng)下的一個神器,它是一個 macOS 缺失的軟件包管理器 https://brew.sh/index_zh-cn.html
  2. 接著就是打開命令行終端依次輸入命令
//安裝 Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
//查看是否有 nginx 的包
brew search nginx

命令行輸出如下:打了一個對勾就證明是有的瓜挽,接下來就可以安裝了

image.png
//安裝 nginx 
brew install nginx
//裝過之后可以查看 nginx 對應(yīng)的一些版本的信息
brew info nginx
//查看 nginx 版本信息
nginx -v
//啟動 nginx 盹廷,這個默認的端口號是 8080
nginx
//可以暫停 nginx 
nginx -s stop
//再次啟動 nginx 
nginx
  1. 這個是時候在瀏覽器中輸入 localhost:8080 就可以打開 nginx 首頁了
image.png
  • 這個時候你會發(fā)現(xiàn)頁面 title 的 icon 是 Jenkins 的頭像,這個原因是因為如果你裝過 Jenkins 的話久橙,它是非常頑固的會不停的去折騰俄占、重啟你的 8080 端口管怠,你如果是 kill 是殺不掉的,你需要用下面的命令就可以把它給停掉了
//停掉 jenkins 
sudo launchctl unload/Library/LaunchDaemons/org.jenkins-ci.plist
//停掉之后如果想啟動 jenkins 
systemctl start jenkins
  1. 想要進行上面的 反向代理和負載均衡 還需要對 nginx 進行配置
//停止 nginx 服務(wù)
nginx -s stop
//重新加載 nginx 配置文件
nginx -s reload
  1. 打開 nginx 具體安裝目錄 查看配置文件
  • /usr/local/etc/nginx/ 這個是 macOS 下 nginx 的安裝目錄缸榄,其他系統(tǒng)的可能會不大一樣
//先進入 nginx 目錄的上一級目錄
cd /usr/local/etc/
//查看該目錄下的所有文件渤弛,可以在下圖看到 nginx 目錄
ls
image.png
//再進入 nginx 目錄
cd nginx
//查看該目錄下的所有文件,可以在下圖看到 nginx 目錄下的所有文件
ls
image.png
  • 可以看到里面有個 nginx.conf 的文件甚带,這個就是 nginx 的配置文件她肯,上面的 nginx2.conf 是之前做的備份可以忽略掉
//查看配置文件的內(nèi)容,下圖是內(nèi)容的一部分鹰贵,這個里面的內(nèi)容就是 nginx 默認的配置內(nèi)容
cat nginx.conf
image.png
  • 對上圖的一些解釋
    • #user 指的是哪個用戶能用辕宏,可以將后面的 nobody 修改成你指定誰用的那個用戶的用戶名
    • worker_processes 這個是你的一個工作的進程,其實實際上指的就是 CPU 的核數(shù)砾莱,如果你是 4 核的話,這個值就是 4凄鼻,你需要看到自己的電腦是幾核的處理器腊瑟,然后你可以在這里面做相應(yīng)的設(shè)置,最多就是 2 倍块蚌,一般就是標(biāo)準(zhǔn)的幾核就是幾個 或者 2 倍闰非,這個不能亂設(shè)
    • #error_log 這個就是整個產(chǎn)生錯誤的日志
      • nginx 的日志跟我們 Node 的日志比一點都不遜色,它們的區(qū)別是:nginx 可以完全的記錄所有的請求的日志峭范,因為它是一個向外去擴散的一個去做負載均衡的口子财松,你的那個 Node 是你的項目里的一些 log ,兩個人都各自有分工
      • 這個 log 是會非常龐大的纱控,所以像有的一些大公司會有專門去存 log 的服務(wù)器辆毡,那些數(shù)據(jù)挖掘的人或者是運維會每天去查這個日志,從這些日志里其實可以拿到很多很多的東西甜害,所以這個日志是至關(guān)重要的舶掖,對于大公司來講這個是比命還重要的東西,所以 nginx 的日志是萬萬不能丟的尔店,任何語言里的日志它們都會分成 level(級別)
      • 上面的第一行就是 出錯的日志 眨攘,第二行是警告的,第三行是基本信息
    • #pid 這個是 nginx 非常重要的一個配置文件嚣州,這個就別動就好了
    • events -> worker_connections 這個就是整個的連接數(shù)鲫售,就是說你一下子往你的這個上面壓多少
    • http 模塊 在這個里面可以去指定一下所謂的我們平時的 gzip 、Etag 等等都是從這里去開啟的
      • #gzip 把前面的 # 號去掉该肴,然后這個 gzip 就開啟了情竹,在我們?nèi)プ鲂阅軆?yōu)化的時候在這里面把 Etag 一開就很簡單,還包括那個 express 過期時間都在這里
      • server
        • listen 這里是監(jiān)聽 8080 端口
        • #charset koi8-r 這個是它輸出的語言
        • access_log 這個是它的日志
        • location 這個非常重要沙庐,里面的 root 不是指的同戶名鲤妥,而是當(dāng)前的 html 文件夾佳吞,它會從下面的順序依次開始找,直到找到對應(yīng)的一個文件然后去給你吐
        • error_page 這個是 Node 控制出錯的棉安,有時你會發(fā)現(xiàn)百度底扳、騰訊或者是其他的一些公司的 404 是一樣的,原因就是在這的贡耽,所有的請求都固定到這衷模,然后他把一些出錯都控制好 是這樣的一個原因
        • 下面還有一些 500 502 503 504 ,他都把這些出錯導(dǎo)到 50x 去了蒲赂,所以這些不是真正的內(nèi)部的系統(tǒng)去做的阱冶。而是一些做負載均衡的服務(wù)器去做的
        • location ~ \.php$ 這些就是用正則去匹配一些更復(fù)雜的,就是你真正的路由都可以在這里面去寫
  1. 接下來就是我們要給運維做什么
  • 我們要給運維做的東西相對來說比較簡單滥嘴,不用去搞那些雜七雜八的木蹬,注意:修改文件的時候要記得把注釋刪掉
//這個就是我們前端需要給運維做的東西,這個是從復(fù)雜的 nginx 里去抽出來的
worker_processes 4;//這個是你的一個工作的進程若皱,其實實際上指的就是 CPU 的核數(shù)
events{
    worker_connections 1024;//這個就是整個的連接數(shù)镊叁,就是說你一下子往你的這個上面壓多少
}
//上面兩個其實你不給運維的話也是可以的,他都不要走触,你寫了也沒用晦譬,關(guān)鍵的就是下面的 http 
http{
    //這個是負載均衡的所有的 server ,這里的 IP 地址需要寫成你需要用到的真實有效的才行
    upstream firsttest{
        server 192.168.230.128;
        server 192.168.230.129;
    }
    
    server{
        //通過 server 監(jiān)聽的是 8080
        listen 8080;
        //當(dāng)你訪問 / 這個路由地址的時候 通過下面的  proxy_pass 代理去訪問 firsttest 然后就可以了
        location / {
            proxy_pass http://firsttest;
        }
    }
}
  • 無注釋版本
worker_processes 4;
events{
    worker_connections 1024;
}
http{
    upstream firsttest{
        server 192.168.230.128;
        server 192.168.230.129;
    }
    
    server{
        listen 8080;
        location / {
            proxy_pass http://firsttest;
        }
    }
  }

  • 接著是對照上面的設(shè)置修改你的 nginx.conf 文件

    • 先要對之前的 nginx.conf 文件進行備份
    //先進入到系統(tǒng)安裝的 nginx 目錄下
    cd /usr/local/etc/nginx
    //備份配置文件
    cp nginx.conf nginx.conf.back
    //備份之后再查看是否已成功生成文件
    ls
    
    image.png
    • 修改 nginx.conf 文件互广,將下面的代碼片段里面的設(shè)置相應(yīng)的復(fù)制按照規(guī)則復(fù)制進這個文件中敛腌,之后保存即可
    worker_processes 4;
    events{
    worker_connections 1024;
    }
    http{
        upstream firsttest{
        server 192.168.230.128;
        server 192.168.230.129;
      }
    
    server{
        listen 8080;
        location / {
            proxy_pass http://firsttest;
          }
      }
    }
    
  • 修改并保存之后,在瀏覽器中打開你設(shè)置的兩個服務(wù)器 ip 地址進行查看惫皱,打不開的原因也會出現(xiàn)像樊,比如:防火墻未關(guān)閉導(dǎo)致的

image.png

image.png
  • 為了顯示區(qū)別 我將兩臺服務(wù)器上的文字稍作了修改,修改之后逸吵,還需要重載 nginx 才會生效哦
//先暫停
nginx -s stop
//進入 html 目錄修改 index.html
cd /usr/share/nginx/html
vi html
//修改之后保存并退出
ESC 鍵
:
wq
//重載
nginx -s reload
//啟動
nginx
  • 現(xiàn)在刷新瀏覽器凶硅,會發(fā)現(xiàn) 128 和 129 兩臺服務(wù)器分別能落到的幾率為 50%
Animation10.gif
  • 這里我發(fā)現(xiàn)了一個問題,因為我的兩臺服務(wù)器一個是 Centos 一個是 Ubuntu 128扫皱,Centos 129 的里面的 index.html 文件修改成功了多了 192.168.230.129 端口號足绅,但是 Ubuntu 那個沒有

    • 解決上面 Ubuntu 的問題
    //先查看 nginx 配置文件
    cat /etc/nginx/nginx.conf
    
    • 會發(fā)現(xiàn) http 設(shè)置里面有這樣的默認設(shè)置
    image.png
    • 這里我再次分別進入這兩個目錄
    //發(fā)現(xiàn)只有這個目錄下有個 default 文件
    cd /etc/nginx/sites-enabled
    ls
    //查看該文件
    cat default
    
    • 發(fā)現(xiàn)里面引用的是 root 用戶下的 /var/www/html 目錄中的 html
    image.png
    • 這時去修改 /var/www/html 目錄下的 html 文件
    cd /var/www/html
    //查看目錄下包含的文件  發(fā)現(xiàn)只有    index.nginx-debian.html 文件
    ls
    //使用下面的命令以圖形化的方式打開該目錄(適合 Ubuntu 下使用的命令) 再在編輯器中 修改 index.nginx-debian.html 文件 保存并退出  
    nautilus ./
    //先將 nginx 運行暫停
    //再重載
    
    //最后啟動
    systemctl start nginx
    //最后查看是否是 running 狀態(tài)
    systemctl status nginx
    
    image.png
    • Ubuntu 下重啟期間總是會出現(xiàn)一些莫名奇妙的問題,我的解決方法就是
    //先找到在運行中的與 nginx 相關(guān)的所有進程
    ps -eaf |grep nginx
    //然后使用 kill -9 命令將他們一個一個的殺掉
    kill -9 1250
    //再重新啟動 nginx
    systemctl start nginx
    
  • 這個時候再去刷新查看瀏覽器韩脑,會發(fā)現(xiàn)已經(jīng)成功了 129 128 每次落到的幾率都是 50%
Animation11.gif
  • 還可以在修改 nginx.conf 配置文件中的 http 對象氢妈,這里我是在 Ubuntu 下里面的文件
//先暫停 nginx  
systemctl stop nginx
//進入配置文件目錄
cd /etc/nginx
//以圖形化的界面打開該目錄
nautilus ./
//在編輯器中編輯 nginx.conf 配置文件
//在 firsttest 里面增加一個 ip_hash 屬性 一定記得要加 分號
upstream firsttest{
    ip_hash;
}
//之后再重載一遍
nginx -s reload
//運行
nginx
image.png
  • 再刷新瀏覽器,會發(fā)現(xiàn)訪問的是 Ubuntu 這個 128
    的增加了 ip_hash 的服務(wù)器時段多,只要你第一個訪問成功了首量,那么它下次就會默認還訪問這個上次訪問成功了的服務(wù)器 ,不會再落到另一臺服務(wù)器上了,Centos 129 那個服務(wù)器就還是之前的 50% 幾率的動態(tài)落
Animation12.gif
  • 還可以在里面加一個權(quán)重的東西加缘,參照上面的方法鸭叙,權(quán)重是添加到 IP 地址后面的,下圖中加了屬性 值為 2 這樣的話如果是頁面刷新三次的話 落到 128 Ubuntu 這臺服務(wù)器上的幾率就是 3 / 2 拣宏,要先把上面加的 ip_hash 刪掉沈贝,測試才會有效
image.png

下面主要是一些 在 Ubuntu 和 Centos 下與上面的 MAC 下的具體操作差異,還有就是操作時遇到的一些坑

  1. 裝包勋乾,Centos 的話需要 先將Centos的yum源更換為國內(nèi)的阿里云源 參考地址:將Centos的yum源更換為國內(nèi)的阿里云源 再進行安裝
//Centos
yum install nginx

//Ubuntu 
sudo apt-get install nginx
  1. 在修改完 nginx.conf 文件并保存后 重載時會報錯

    • 下面是報錯的文本

    nginx: [error] invalid PID number "" in "/run/nginx.pid"

    • 需要先執(zhí)行一行命令宋下,才能再執(zhí)行重載
    //   /etc/nginx 是 ubuntu  和 centos 下的安裝目錄
    cd /etc/nginx
    nginx -c /etc/nginx/nginx.conf
    //然后再進行重載
    nginx -s reload
    
  2. 啟動和暫停命令使用 systemctl

//啟動 nginx 
systemctl start nginx
//暫停 nginx 
systemctl stop nginx
//重啟 nginx 
systemctl restart nginx
  1. 如果在啟動時遇到下面的錯誤,可移步至 centos7安裝nginx

Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

  1. Ubuntu 和 Centos nginx 的具體文件位置
    • nginx 配置文件的目錄 /etc/nginx/
    • nginx 項目資源文件的目錄 /usr/share/nginx/
  2. 有時在本機打不開的原因:防火墻未關(guān)閉辑莫、nginx 未啟動
  3. 在 Ubuntu 下修改文件時先進入目錄下再使用 nautilus ./ 命令以圖形化的形式打開目錄学歧,再在編輯器中進行編輯并保存比較方便
  4. 這里我使用的是 Centos 和 Ubuntu 兩個虛擬機來模擬的服務(wù)器
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市各吨,隨后出現(xiàn)的幾起案子枝笨,更是在濱河造成了極大的恐慌,老刑警劉巖揭蜒,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伺帘,死亡現(xiàn)場離奇詭異,居然都是意外死亡忌锯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門领炫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偶垮,“玉大人,你說我怎么就攤上這事帝洪∷贫妫” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵葱峡,是天一觀的道長砚哗。 經(jīng)常有香客問我,道長砰奕,這世上最難降的妖魔是什么蛛芥? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮军援,結(jié)果婚禮上仅淑,老公的妹妹穿的比我還像新娘。我一直安慰自己胸哥,他們只是感情好涯竟,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般庐船。 火紅的嫁衣襯著肌膚如雪银酬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天筐钟,我揣著相機與錄音揩瞪,去河邊找鬼。 笑死盗棵,一個胖子當(dāng)著我的面吹牛壮韭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纹因,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喷屋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞭恰?” 一聲冷哼從身側(cè)響起屯曹,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惊畏,沒想到半個月后恶耽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡颜启,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年偷俭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缰盏。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涌萤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出口猜,到底是詐尸還是另有隱情负溪,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布济炎,位于F島的核電站川抡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏须尚。R本人自食惡果不足惜崖堤,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耐床。 院中可真熱鬧倘感,春花似錦、人聲如沸咙咽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜡豹,卻和暖如春麸粮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镜廉。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工弄诲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娇唯。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓齐遵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親塔插。 傳聞我的和親對象是個殘疾皇子梗摇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354