Nginx技術(shù)專題(1)基于Nginx負(fù)載均衡機(jī)制實現(xiàn)負(fù)載均衡介紹和配置

前言介紹

  • 由于目前現(xiàn)有網(wǎng)絡(luò)的各個核心部分隨著業(yè)務(wù)量的提高温自,訪問量和數(shù)據(jù)流量的快速增長已维,其處理能力和計算強(qiáng)度也相應(yīng)地增大,使得單一的服務(wù)器設(shè)備根本無法承擔(dān)阔墩。在此情況下嘿架,如果扔掉現(xiàn)有設(shè)備去做大量的硬件升級,這樣將造成現(xiàn)有資源的浪費(fèi)啸箫,而且如果再面臨下一次業(yè)務(wù)量的提升時耸彪,這又將導(dǎo)致再一次硬件升級的高額成本投入,甚至性能再卓越的設(shè)備也不能滿足當(dāng)前業(yè)務(wù)量增長的需求忘苛。
  • 針對此情況而衍生出來的一種廉價有效透明的方法以擴(kuò)展現(xiàn)有網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬蝉娜、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力扎唾、提高網(wǎng)絡(luò)的靈活性和可用性的技術(shù)就是負(fù)載均衡(Load Balance)召川。

負(fù)載均衡是什么?

  • 什么是負(fù)載均衡?單從字面上的意思來理解就可以解釋N臺服務(wù)器平均分擔(dān)負(fù)載稽屏,不會因為某臺服務(wù)器負(fù)載高宕機(jī)而某臺服務(wù)器閑置的情況扮宠。那么負(fù)載均衡的前提就是要有多臺服務(wù)器才能實現(xiàn)西乖,也就是兩臺以上即可狐榔。負(fù)載均衡是高并發(fā)、大流量網(wǎng)站必須要實現(xiàn)的技術(shù)获雕。
  • 讓客戶端的請求均勻地分布到各個服務(wù)器上薄腻。客戶端的請求先到達(dá)負(fù)載均衡器届案,由負(fù)載均衡器通過一系列算法將請求轉(zhuǎn)發(fā)到某臺上游的業(yè)務(wù)服務(wù)器上庵楷。

負(fù)載均衡策略

實現(xiàn)負(fù)載均衡的方式有很多,下面將列出幾種方式楣颠,并對比優(yōu)劣:

  1. 通過硬件來進(jìn)行解決尽纽,常見的硬件有NetScaler、F5童漩、Radware和Array等商用的負(fù)載均衡器弄贿,但是它們是比較昂貴的。
  2. 通過軟件來進(jìn)行解決的矫膨,常見的軟件有LVS差凹、Nginx期奔、apache等,它們是基于Linux系統(tǒng)并且開源的負(fù)載均衡策略。

硬件層面

通過F5實現(xiàn)負(fù)載均衡危尿,性能優(yōu)異呐萌,F(xiàn)5的底層是在芯片層面做了優(yōu)化,這樣就使得它的性能不依賴主機(jī)操作系統(tǒng)的處理能力谊娇,但是F5價格高昂肺孤,一般小公司用不起軟件層面可以通過LVS來實現(xiàn)負(fù)載均衡,這是一款中國人開發(fā)的軟件济欢。

軟件層面

性能受到主機(jī)運(yùn)算能力的制約除了LVS之外渠旁,還可以通過Nginx實現(xiàn)負(fù)載均衡,為了實現(xiàn)高可用需要和keepalived配合使用船逮,Nginx實現(xiàn)負(fù)載均衡也是本文講解的重點還可以在DNS層面做負(fù)載均衡顾腊,在域名解析的時候解析到不同的服務(wù)器上。

優(yōu)點是配置簡單挖胃,非常容易實現(xiàn)杂靶,缺點是沒有檢測機(jī)制,不夠均衡酱鸭,容錯能力比較差

硬件層面可以通過F5實現(xiàn)負(fù)載均衡吗垮,性能優(yōu)異。F5的底層是在芯片層面做了優(yōu)化凹髓,這樣就使得它的性能不依賴主機(jī)操作系統(tǒng)的處理能力烁登,但是F5價格高昂,一般小公司用不起
軟件層面可以通過LVS來實現(xiàn)負(fù)載均衡蔚舀,這是一款中國人開發(fā)的軟件饵沧。因為是軟件層面的負(fù)載均衡,性能受到主機(jī)運(yùn)算能力的制約
除了LVS之外赌躺,還可以通過Nginx實現(xiàn)負(fù)載均衡狼牺,為了實現(xiàn)高可用需要和keepalived配合使用,Nginx實現(xiàn)負(fù)載均衡也是本文講解的重點
還可以在DNS層面做負(fù)載均衡礼患,在域名解析的時候解析到不同的服務(wù)器上是钥。優(yōu)點是配置簡單,非常容易實現(xiàn)缅叠,缺點是沒有檢測機(jī)制悄泥,不夠均衡,容錯能力比較差

Nginx是什么肤粱?

Nginx(發(fā)音同 engine x)是一款輕量級的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器弹囚,并在一個BSD-like 協(xié)議下發(fā)行。由俄羅斯的程序設(shè)計師Igor Sysoev(伊戈爾·西索夫)所開發(fā)狼犯,供俄國大型的入口網(wǎng)站及搜索引擎Rambler(漫步者)(俄文:Рамблер)使用余寥。其特點是占有內(nèi)存少领铐,并發(fā)能力強(qiáng),事實上nginx的并發(fā)能力確實在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好宋舷,中國大陸使用nginx網(wǎng)站用戶有:新浪绪撵、網(wǎng)易、 騰訊等祝蝠。

優(yōu)點

  1. 可運(yùn)行l(wèi)inux,并有 Windows移植版音诈。
  2. 在高連接并發(fā)的情況下,Nginx是Apache服務(wù)器不錯的替代品Nginx在美國是做虛擬主機(jī)生意的老板們經(jīng)常選擇的軟件平臺之一绎狭。能夠支持高達(dá)50,000個并發(fā)連接數(shù)的響應(yīng)

負(fù)載均衡的功能

  • 轉(zhuǎn)發(fā)
  • 故障移除
  • 恢復(fù)添加
  • 高可用 Ha

我們想要使用Nginx那么就必須滿足上面的四個條件.
我們配置負(fù)載均衡的目的是在于當(dāng)用戶訪問我們的服務(wù)器的時候, 首先會通過 Nginx服務(wù)器來決定轉(zhuǎn)發(fā)到哪個Tomcat服務(wù)器上去給用戶提供服務(wù), 當(dāng)然這個概率是我們通過權(quán)重來配置的. 經(jīng)過Nginx指派之后, 我們就可以處理高并發(fā)的訪問了, 這里就能達(dá)到負(fù)載均衡的目的.

Nginx如何實現(xiàn)負(fù)載均衡

Nginx的負(fù)載均衡是通過upstream來實現(xiàn)的细溅,在upstream中指定若干個 server,格式如下:

image

myserver就是通過 upstream 定義的一組負(fù)載均衡模板儡嘶,其中:

image

在配置完upstream后喇聊,還要讓客戶端過來的請求反向代理到myserver,格式如下:


image

完成了負(fù)載均衡的配置蹦狂,但是在實際需求中除了上面的設(shè)置外誓篱,還會增加一些額外設(shè)置:

負(fù)載均衡策略設(shè)置請求上游服務(wù)器攜帶請求頭信息upstream模塊中其他參數(shù)設(shè)置

Nginx的負(fù)載均衡策略有5種方式:
image

除以上5種,還有一種:least-connected — 下一個請求被分配到擁有最少活動連接數(shù)的服務(wù)器凯楔。

編輯nginx配置文件(例中為/usr/local/ngnix/conf/nginx.conf)窜骄,找到http結(jié)點,

配置案例
http {
    upstream myapp1 {
        server 192.168.1.103:8080;
        server 192.168.1.104:8080;
   }
   server {
        listen 80;
        server_name  localhost;
        location /webautotest/ {
            proxy_buffering off;
            proxy_pass http://myapp1;
        }
    }
}
重新加載配置文件
[root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -s reload
默認(rèn)的負(fù)載均衡配置
http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}
最少連接負(fù)載均衡
  • 另一個負(fù)載均衡原則為least-connected摆屯。當(dāng)一些請求花費(fèi)較長時間來完成時邻遏,least-connected更“公平”的控制應(yīng)用程序?qū)嵗系呢?fù)載。
  • 配置了least-connected的負(fù)載均衡機(jī)制的情況下虐骑,nginx會盡量不讓負(fù)載繁忙的應(yīng)用服務(wù)器上負(fù)載過多的請求准验,相反的,會把新的請求發(fā)送到比較不繁忙的服務(wù)器富弦。
配置示例:
upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
}
會話持久性

注意沟娱,round-robin或least-connected負(fù)載均衡下,每個后續(xù)的客戶端可能被分發(fā)至不同服務(wù)器腕柜,不保證相同客戶端的請求總是被發(fā)送到相同的服務(wù)器。

如果有必要把客戶端綁定至特定服務(wù)器矫废,則可使用ip-hash負(fù)載均衡機(jī)制盏缤。

ip-hash機(jī)制

ip-hash機(jī)制下,客戶端ip地址被用作hash key來判斷客戶端請求應(yīng)該發(fā)送到哪個服務(wù)器蓖扑,這種方法保證了來自相同客戶端的請求總是發(fā)送到相同服務(wù)器(如果服務(wù)器可用的話)

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

負(fù)載均衡權(quán)重

可通過配置服務(wù)器權(quán)重來影響負(fù)載均衡機(jī)制唉铜。上面的例子中,都未配置服務(wù)器權(quán)重律杠,這意味著所有服務(wù)器都擁有相同的權(quán)重潭流。
針對round-robin負(fù)載機(jī)制竞惋,權(quán)重意味著更多或更少的請求傳送至服務(wù)器---假設(shè)有足夠的請求,且按統(tǒng)一方式處理請求灰嫉,且足夠快完成請求處理拆宛。

配置示例:
  upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
}

上例配置中,每發(fā)送至服務(wù)器實例的5個新的請求中讼撒,有3個發(fā)送到srv1,1個發(fā)送到srv2,另1個發(fā)送到srv3浑厚。

注:當(dāng)前版本似乎只實現(xiàn)了round-robin機(jī)制下的權(quán)重設(shè)置

健康檢測

  • nginx反向代理實現(xiàn)包含服務(wù)器健康檢查。如果來自特定服務(wù)器的響應(yīng)失敗根盒,報錯钳幅,nginx將標(biāo)記該服務(wù)器為failed,一段時間內(nèi)盡量避免選擇此服務(wù)器作為隨后請求的分發(fā)服務(wù)器炎滞。

  • max_fails機(jī)制設(shè)置fail_timeout期間敢艰,和服務(wù)器溝通失敗的連續(xù)重試次數(shù),默認(rèn)為1.當(dāng)設(shè)置為0時册赛,不做服務(wù)器健康檢測盖矫。fail_timeout定義了服務(wù)器被標(biāo)記為failed的時長。fail_timeout時間間隔過后击奶,nginx將開始使用活動客戶端請求來探測服務(wù)器辈双,如果探測成功則標(biāo)記服務(wù)器為活動服務(wù)器。

Nginx負(fù)載均衡配置項介紹

下面我們將介紹一下proxy模塊的參數(shù):

image

各個參數(shù)介紹:

image

設(shè)置proxy_connect_timeout 為2秒柜砾,縮短超時時間湃望,使其不至于太慢。

參考鏈接:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痰驱,一起剝皮案震驚了整個濱河市证芭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌担映,老刑警劉巖废士,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝇完,居然都是意外死亡官硝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門短蜕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氢架,“玉大人,你說我怎么就攤上這事朋魔♂校” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵警检,是天一觀的道長孙援。 經(jīng)常有香客問我害淤,道長,這世上最難降的妖魔是什么拓售? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任窥摄,我火速辦了婚禮,結(jié)果婚禮上邻辉,老公的妹妹穿的比我還像新娘溪王。我一直安慰自己,他們只是感情好值骇,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布莹菱。 她就那樣靜靜地躺著,像睡著了一般吱瘩。 火紅的嫁衣襯著肌膚如雪道伟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天使碾,我揣著相機(jī)與錄音蜜徽,去河邊找鬼。 笑死票摇,一個胖子當(dāng)著我的面吹牛拘鞋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矢门,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼盆色,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祟剔?” 一聲冷哼從身側(cè)響起隔躲,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎物延,沒想到半個月后宣旱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叛薯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年浑吟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片案训。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡买置,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出强霎,到底是詐尸還是另有隱情,我是刑警寧澤蓉冈,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布城舞,位于F島的核電站轩触,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏家夺。R本人自食惡果不足惜脱柱,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拉馋。 院中可真熱鬧榨为,春花似錦、人聲如沸煌茴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔓腐。三九已至矩乐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間回论,已是汗流浹背散罕。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留傀蓉,地道東北人欧漱。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像葬燎,于是被迫代替她去往敵國和親误甚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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