nginx-負(fù)載均衡

前言

??負(fù)載均衡(又稱為負(fù)載分擔(dān))评雌,英文名稱為Load Balance,其意思就是將負(fù)載(工作任務(wù))進(jìn)行平衡螟加、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行徘溢,例如Web服務(wù)器吞琐、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等然爆,從而共同完成工作任務(wù)站粟。

一、什么是負(fù)載均衡集群技術(shù)

  • 負(fù)載均衡
    ??負(fù)載均衡建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上曾雕,它提供了一種廉價(jià)有效透明的方法擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬奴烙、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力剖张、提高網(wǎng)絡(luò)的靈活性和可用性切诀。負(fù)載均衡(Load Balance)其意思就是分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行,例如Web服務(wù)器搔弄、FTP服務(wù)器幅虑、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。
  • 集群
    ??集群(cluster)技術(shù)是一種較新的技術(shù)顾犹,通過集群技術(shù)倒庵,可以在付出較低成本的情況下獲得在性能、可靠性炫刷、靈活性方面的相對較高的收益擎宝,其任務(wù)調(diào)度則是集群系統(tǒng)中的核心技術(shù)。集群組成后浑玛,可以利用多個(gè)計(jì)算機(jī)和組合進(jìn)行海量請求處理(負(fù)載均衡)绍申,從而獲得很高的處理效率,也可以用多個(gè)計(jì)算機(jī)做備份(高可用),使得任何一個(gè)機(jī)器壞了整個(gè)系統(tǒng)還是能正常運(yùn)行锄奢。
  • 負(fù)載均衡集群技術(shù)
    ??負(fù)載均衡(Load Balance):負(fù)載均衡集群為企業(yè)需求提供了可解決容量問題的有效方案失晴。負(fù)載均衡集群使負(fù)載可以在計(jì)算機(jī)集群中盡可能平均地分?jǐn)偺幚怼?br> ??負(fù)載通常包括應(yīng)用程序處理負(fù)載和網(wǎng)絡(luò)流量負(fù)載,每個(gè)節(jié)點(diǎn)都可以承擔(dān)一定的處理負(fù)載,并且可以實(shí)現(xiàn)處理負(fù)載在節(jié)點(diǎn)之間的動態(tài)分配拘央,以實(shí)現(xiàn)負(fù)載均衡涂屁。

二、負(fù)載均衡技術(shù)的實(shí)現(xiàn)

負(fù)載均衡(Load Balance)

負(fù)載均衡技術(shù)類型:基于 4 層負(fù)載均衡技術(shù)和基于 7 層負(fù)載均衡技術(shù)

負(fù)載均衡實(shí)現(xiàn)方式:硬件負(fù)載均衡設(shè)備或者軟件負(fù)載均衡

硬件負(fù)載均衡產(chǎn)品:F5 灰伟、深信服 拆又、Radware

軟件負(fù)載均衡產(chǎn)品: LVS(Linux Virtual Server)、 Haproxy栏账、Nginx帖族、Ats(apache traffic server)

- 實(shí)現(xiàn)效果圖

負(fù)載均衡展示圖

三、負(fù)載均衡的分類

??負(fù)載均衡根據(jù)所采用的設(shè)備對象(軟/硬件負(fù)載均衡)挡爵,應(yīng)用的OSI網(wǎng)絡(luò)層次(網(wǎng)絡(luò)層次上的負(fù)載均衡)等來分類竖般。根據(jù)應(yīng)用的 OSI 網(wǎng)絡(luò)層次來分類的兩個(gè)負(fù)載均衡類型。

負(fù)載均衡可以大概分為以下幾類:

  • 二層負(fù)載均衡(mac)
    一般是用虛擬mac地址方式茶鹃,外部對虛擬MAC地址請求涣雕,負(fù)載均衡接收后分配后端實(shí)際的MAC地址響應(yīng)艰亮。
  • 三層負(fù)載均衡(ip)
    一般采用虛擬IP地址方式,外部對虛擬的ip地址請求挣郭,負(fù)載均衡接收后分配后端實(shí)際的IP地址響應(yīng)迄埃。
  • 四層負(fù)載均衡(tcp)
    在三層負(fù)載均衡的基礎(chǔ)上,用ip+port接收請求兑障,再轉(zhuǎn)發(fā)到對應(yīng)的機(jī)器侄非。
  • 七層負(fù)載均衡(http)
    根據(jù)虛擬的url或IP,主機(jī)名接收請求流译,再轉(zhuǎn)向相應(yīng)的處理服務(wù)器逞怨。

??四層負(fù)載均衡
??實(shí)現(xiàn)四層負(fù)載均衡的產(chǎn)品有:

  • F5:硬件負(fù)載均衡器,功能很好福澡,但是成本很高骇钦。
  • lvs:重量級的四層負(fù)載軟件
  • nginx:輕量級的四層負(fù)載軟件,帶緩存功能竞漾,正則表達(dá)式較靈活
  • haproxy:模擬四層轉(zhuǎn)發(fā),較靈活
    七層負(fù)載均衡
    實(shí)現(xiàn)七層負(fù)載均衡的軟件有:
  • haproxy:天生負(fù)載均衡技能窥翩,全面支持七層代理业岁,會話保持,標(biāo)記,路徑轉(zhuǎn)移;
  • nginx:只在http協(xié)議和mail協(xié)議上功能比較好搁胆,性能與haproxy差不多昭抒;
  • apache:功能較差
  • Mysql proxy:功能尚可。
    ??由于在實(shí)際應(yīng)用中品抽,我們比較常用的是四層負(fù)載及七層負(fù)載。這里也重點(diǎn)說下這兩種負(fù)載。


    在這里插入圖片描述

    ??四層負(fù)載架構(gòu)設(shè)計(jì)比較簡單较锡,無需解析具體的消息內(nèi)容,在網(wǎng)絡(luò)吞吐量及處理能力上會相對比較高盗痒,而七層負(fù)載均衡的優(yōu)勢則體現(xiàn)在功能多蚂蕴,控制靈活強(qiáng)大。在具體業(yè)務(wù)架構(gòu)設(shè)計(jì)時(shí)俯邓,使用七層負(fù)載或者四層負(fù)載還得根據(jù)具體的情況綜合考慮骡楼。

二、操作步驟

  • nginx四層負(fù)載均衡及七層負(fù)載均衡

  • nginx既有四層的負(fù)載均衡也有七層的負(fù)載均衡
  • 代理實(shí)現(xiàn)


    在這里插入圖片描述

七層負(fù)載均衡

1.首先準(zhǔn)備三臺機(jī)器稽鞭,其中兩臺為真實(shí)服務(wù)器鸟整,一臺為proxy代理服務(wù)器并且關(guān)閉防火墻及l(fā)inux確保三臺機(jī)器之間可以被互相訪問到。

  • 192.168.253.176 webserver1
  • 192.168.253.178 webserver2
  • 192.168.253.189 nginx-proxy

2.在webserver1和webserver2兩臺機(jī)器上分別部署一個(gè)簡單的頁面用于測試朦蕴。為了能夠更好的體現(xiàn)出負(fù)載均衡篮条,這里的兩臺服務(wù)器分別設(shè)置不同的內(nèi)容弟头。
如果有需要可以參考關(guān)于nginx的文章

  • server1
[root@server1 ~]# yum -y install nginx
[root@server1 ~]# systemctl start nginx
[root@server1 ~]# systemctl enable nginx
[root@server1 ~]# echo "hello world!" >/usr/share/nginx/html/index.html
[root@server1 ~]# curl 127.0.0.1
hello world兑燥!
  • server2
[root@server2 ~]# yum -y install nginx
[root@server2 ~]# systemctl start nginx
[root@server2 ~]# systemctl enable nginx
[root@server2 ~]# echo "hi world亮瓷!" >/usr/share/nginx/html/index.html
[root@server2 ~]# curl 127.0.0.1
hi world!

3.在ngonx-proxy 代理服務(wù)器上進(jìn)行配置
upstream配置
這個(gè)配置是寫一組被代理的服務(wù)器地址降瞳,然后配置負(fù)載均衡的算法.

upstream testapp { 
      server 192.168.253.178:80;
      server 192.168.253.176:80;
}
 server {
        ....
        location / {         
           proxy_pass  http://testapp;  #請求轉(zhuǎn)向 testapp 定義的服務(wù)器列表         
        } 
  • upstream支持的幾種算法
    • A嘱支、輪詢(默認(rèn)):每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器;
    • B、ip_hash:每個(gè)請求按訪問IP的hash結(jié)果分配挣饥,同一個(gè)IP客戶端固定訪問一個(gè)后端服務(wù)器除师。可以保證來自同一ip的請求被打到固定的機(jī)器上扔枫,可以解決session問題汛聚。
    • C、url_hash:按訪問url的hash結(jié)果來分配請求短荐,使每個(gè)url定向到同一個(gè)后端服務(wù)器倚舀。
    • D、fair:這是比上面兩個(gè)更加智能的負(fù)載均衡算法忍宋。此種算法可以依據(jù)頁面大小和加載時(shí)間長短智能地進(jìn)行負(fù)載均衡痕貌,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來分配請求,響應(yīng)時(shí)間短的優(yōu)先分配糠排。Nginx本身是不支持 fair的舵稠,如果需要使用這種調(diào)度算法,必須下載Nginx的 upstream_fair模塊入宦。

配置實(shí)例參考
熱備:如果你有兩臺服務(wù)器哺徊,當(dāng)一臺服務(wù)器發(fā)生故障時(shí),才啟用第二臺服務(wù)器提供服務(wù)乾闰;

upstream myweb { 
      server 192.168.253.178:80; 
      server 192.168.253.176:80 backup;  #熱備     
    }

輪詢:nginx默認(rèn)的就是輪詢其權(quán)重默認(rèn)為1落追,請求訪問時(shí) 每臺服務(wù)器訪問一次;

upstream myweb { 
      server 192.168.253.176:8080;    #默認(rèn)80端口可以不用寫端口號
      server 192.168.253.178:8080;      
    }

加權(quán)輪詢:根據(jù)配置的權(quán)重大小從而處理不同數(shù)量的訪問及請求

upstream myweb { 
      server 192.168.253.176:8080 weight=1;
      server 192.168.253.178:8080 weight=2;
}

ip_hash:nginx會讓相同客戶端ip訪問同一個(gè)服務(wù)器涯肩;

upstream myweb { 
      ip_hash;
      server 192.168.253.178:80; 
      server 192.168.253.176:80
    }
  • nginx 負(fù)載均衡配置狀態(tài)參數(shù)
    • down淋硝,表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。
    • backup宽菜,預(yù)留的備份機(jī)器谣膳。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會請求backup機(jī)器铅乡,因此這臺機(jī)器的壓力最輕继谚。
    • max_fails,允許請求失敗的次數(shù)阵幸,默認(rèn)為1花履。當(dāng)超過最大次數(shù)時(shí)芽世,返回proxy_next_upstream 模塊定義的錯誤。
    • fail_timeout诡壁,在經(jīng)歷了max_fails次失敗后济瓢,暫停服務(wù)的時(shí)間單位秒。max_fails可以和fail_timeout一起使用妹卿。
 upstream myweb { 
      server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;
      server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1;    
    }

4.編輯nginx-proxy配置文件旺矾,如下

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    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;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    upstream testapp { 
      server 192.168.253.176;
      server 192.168.253.178;
    }

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
             proxy_pass  http://testapp;

        }


        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

5.接下來就可以訪問測試了

[root@nginx-proxy ~]# curl 127.0.0.1
hi world!
[root@nginx-proxy ~]# curl 127.0.0.1
hello world夺克!

修改配置文件箕宙,增加權(quán)重,重新加載配置文件生效

[root@nginx-proxy ~]# vim /etc/nginx/nginx.conf
 upstream testapp {
      server 192.168.253.176 weight=1;
      server 192.168.253.178 weight=2;
    }
...
[root@nginx-proxy ~]# curl 127.0.0.1
hello world铺纽!
[root@nginx-proxy ~]# curl 127.0.0.1
hi world柬帕!
[root@nginx-proxy ~]# curl 127.0.0.1
hi world!

在此也可以看到配置已經(jīng)生效狡门。

四層負(fù)載均衡

??nginx在1.9.0 的時(shí)候陷寝,增加了一個(gè) stream 模塊,用來實(shí)現(xiàn)OSI第四層協(xié)議(網(wǎng)絡(luò)層和傳輸層)的轉(zhuǎn)發(fā)其馏、代理盼铁、負(fù)載均衡等。stream模塊的用法跟http的用法類似尝偎,允許我們配置一組TCP或者UDP等協(xié)議的監(jiān)聽.

#4層tcp負(fù)載 
stream {
   upstream myweb {
      hash $remote_addr consistent;
      server 172.17.14.2:8080;
      server 172.17.14.3:8080;
}
server {
            listen 82;
            proxy_connect_timeout 10s;
            proxy_timeout 30s;
            proxy_pass myweb;
        }
}

*在這里要注意stream模塊不在http的服務(wù)里邊,采用的是四層的協(xié)議鹏控。
在這里就不重復(fù)操作了致扯,可以參考官方網(wǎng)站學(xué)習(xí)。

總結(jié)

??負(fù)載均衡除了nginx的使用外比較常用的還有 LVS 当辐、Haproxy等抖僵,在使用時(shí)應(yīng)根據(jù)具體的場景進(jìn)行使用,如果條件允許的話缘揪,還可以使用keepalived 高可用等相關(guān)技術(shù)耍群。

??
歡迎一起交流分享!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載找筝,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者蹈垢。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袖裕,隨后出現(xiàn)的幾起案子曹抬,更是在濱河造成了極大的恐慌,老刑警劉巖急鳄,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谤民,死亡現(xiàn)場離奇詭異堰酿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)张足,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門触创,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人为牍,你說我怎么就攤上這事哼绑。” “怎么了吵聪?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵凌那,是天一觀的道長。 經(jīng)常有香客問我吟逝,道長帽蝶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任块攒,我火速辦了婚禮励稳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘囱井。我一直安慰自己驹尼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布庞呕。 她就那樣靜靜地躺著新翎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪住练。 梳的紋絲不亂的頭發(fā)上地啰,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音讲逛,去河邊找鬼亏吝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盏混,可吹牛的內(nèi)容都是我干的蔚鸥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼许赃,長吁一口氣:“原來是場噩夢啊……” “哼止喷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起混聊,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤启盛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僵闯,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卧抗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鳖粟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片社裆。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖向图,靈堂內(nèi)的尸體忽然破棺而出泳秀,到底是詐尸還是另有隱情,我是刑警寧澤榄攀,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布嗜傅,位于F島的核電站,受9級特大地震影響檩赢,放射性物質(zhì)發(fā)生泄漏吕嘀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一贞瞒、第九天 我趴在偏房一處隱蔽的房頂上張望偶房。 院中可真熱鬧,春花似錦军浆、人聲如沸棕洋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掰盘。三九已至,卻和暖如春赞季,著一層夾襖步出監(jiān)牢的瞬間愧捕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工碟摆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叨橱。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓典蜕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罗洗。 傳聞我的和親對象是個(gè)殘疾皇子愉舔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 章節(jié)目錄 什么是負(fù)載均衡 使用負(fù)載均衡要解決的問題 基于LVS的中間件架構(gòu)GSLBSLB四層負(fù)載均衡和七層負(fù)載均衡...
    markfork閱讀 484評論 0 3
  • 章節(jié)目錄 后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài) backup 狀態(tài)演示 后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài) backup...
    markfork閱讀 1,494評論 0 1
  • 1. 負(fù)載均衡的概念 1.1 什么是負(fù)載均衡 Load Balancing,即負(fù)載均衡伙菜,是一種計(jì)算機(jī)技術(shù)轩缤,用來在多...
    一角錢技術(shù)閱讀 2,248評論 2 48
  • linux負(fù)載均衡總結(jié)性說明(四層負(fù)載/七層負(fù)載) 一,什么是負(fù)載均衡1)負(fù)載均衡(Load Balance)建立...
    phpdi閱讀 401評論 0 0
  • 當(dāng)我們單臺機(jī)器不能夠支撐我們用戶的請求時(shí),就會部署多臺機(jī)器火的,此時(shí)用戶一般訪問時(shí)壶愤,會通過DNS服務(wù)器去解析訪問的域名...
    先生zeng閱讀 1,210評論 0 3