nginx之負(fù)載均衡

用Nginx實(shí)現(xiàn)四層負(fù)載均衡

可以使用Nginx的Stream模塊症革,該模塊能夠?qū)CP和UDP流量進(jìn)行負(fù)載均衡慈省。下面是具體實(shí)現(xiàn)步驟:
安裝Nginx并開(kāi)啟Stream模塊读存。
配置Stream模塊微姊,定義上游服務(wù)器和負(fù)載均衡算法洼哎√逃常可以在nginx.conf文件中添加如下配置:

stream {
    upstream backend {
        server backend1.example.com:80;
        server backend2.example.com:80;
    }

    server {
        listen 80;
        proxy_pass backend;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_next_upstream error;
    }
}

在這個(gè)配置中,我們定義了一個(gè)名為“backend”的上游服務(wù)器組噩峦,其中包含兩個(gè)服務(wù)器锭沟,分別是backend1.example.com和backend2.example.com,它們都監(jiān)聽(tīng)80端口识补。然后定義了一個(gè)監(jiān)聽(tīng)80端口的Server族淮,使用了proxy_pass指令將請(qǐng)求轉(zhuǎn)發(fā)給上游服務(wù)器組。此外,我們還設(shè)置了一些負(fù)載均衡器的相關(guān)參數(shù)祝辣,例如連接超時(shí)時(shí)間贴妻、請(qǐng)求超時(shí)時(shí)間和錯(cuò)誤處理方式等。

重新加載Nginx配置文件蝙斜∶停可以使用如下命令:

sudo nginx -t
sudo nginx -s reload

測(cè)試負(fù)載均衡≡熊可以使用類似telnet的工具測(cè)試:

telnet localhost 80

這時(shí)娩鹉,Nginx會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到后端的服務(wù)器上,從而實(shí)現(xiàn)四層負(fù)載均衡岛琼。

需要注意的是底循,使用Nginx進(jìn)行四層負(fù)載均衡巢株,它只能對(duì)TCP和UDP的流量進(jìn)行負(fù)載均衡槐瑞,而不能對(duì)HTTP等應(yīng)用層協(xié)議進(jìn)行負(fù)載均衡。如果需要實(shí)現(xiàn)應(yīng)用層的負(fù)載均衡阁苞,就需要使用七層負(fù)載均衡了困檩。

7層負(fù)載均衡的示例

包括常用的配置參數(shù)和詳細(xì)解析:

http {
    upstream backend {
        server backend1.example.com weight=5;
        server backend2.example.com;
        server unix:/var/run/backend3.sock;
    }
    
    server {
        listen 80;
        server_name example.com;
        
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

upstream: 指定后端服務(wù)器列表及相關(guān)參數(shù),可以使用域名那槽、IP地址或Unix socket作為服務(wù)器地址悼沿。在這個(gè)例子中,backend1.example.com服務(wù)器的權(quán)重為5骚灸,backend2.example.com服務(wù)器的權(quán)重為默認(rèn)值1糟趾,backend3.sock是Unix socket類型的服務(wù)器。
server: 定義Nginx監(jiān)聽(tīng)的端口和域名甚牲。在這個(gè)例子中义郑,監(jiān)聽(tīng)80端口,server_name為example.com丈钙。
location: 定義請(qǐng)求的路徑和代理方式非驮。在這個(gè)例子中,路徑為/雏赦,代理方式為proxy_pass劫笙,即將請(qǐng)求轉(zhuǎn)發(fā)給upstream中定義的后端服務(wù)器列表,同時(shí)在請(qǐng)求頭中添加Host和X-Real-IP兩個(gè)字段星岗,用于傳遞請(qǐng)求的目標(biāo)地址和客戶端真實(shí)IP地址填大。
此外,還可以通過(guò)設(shè)置其他的參數(shù)來(lái)進(jìn)一步優(yōu)化負(fù)載均衡效果俏橘,比如:

proxy_connect_timeout: 設(shè)置連接后端服務(wù)器的超時(shí)時(shí)間栋盹。
proxy_read_timeout: 設(shè)置從后端服務(wù)器讀取響應(yīng)的超時(shí)時(shí)間。
proxy_send_timeout: 設(shè)置向后端服務(wù)器發(fā)送請(qǐng)求的超時(shí)時(shí)間。
proxy_next_upstream: 設(shè)置當(dāng)一個(gè)后端服務(wù)器無(wú)法響應(yīng)請(qǐng)求時(shí)例获,Nginx應(yīng)該如何處理汉额。比如可以使用error選項(xiàng)表示立即停止請(qǐng)求,使用timeout選項(xiàng)表示在超時(shí)后重試下一個(gè)服務(wù)器榨汤。
ip_hash: 將同一個(gè)客戶端的請(qǐng)求路由到同一個(gè)后端服務(wù)器蠕搜,可以減少后端服務(wù)器之間的會(huì)話復(fù)雜度。
需要注意的是收壕,7層負(fù)載均衡比4層負(fù)載均衡更加復(fù)雜妓灌,需要更多的配置和參數(shù)調(diào)整,因此建議根據(jù)實(shí)際情況進(jìn)行適當(dāng)調(diào)整和優(yōu)化蜜宪。

以下是常用的幾種負(fù)載均衡算法及其配置方法:

輪詢算法(Round Robin)

該算法將請(qǐng)求依次分配給后端服務(wù)器虫埂,實(shí)現(xiàn)方法如下:

upstream backend {
  server 192.168.1.1;
  server 192.168.1.2;
  server 192.168.1.3;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

IP Hash算法

該算法通過(guò)對(duì)客戶端 IP 地址進(jìn)行 Hash 計(jì)算,將同一客戶端的請(qǐng)求分配給同一臺(tái)后端服務(wù)器圃验。實(shí)現(xiàn)方法如下:

upstream backend {
  ip_hash;
  server 192.168.1.1;
  server 192.168.1.2;
  server 192.168.1.3;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

最小連接數(shù)算法(Least Connections)

該算法將請(qǐng)求分配給當(dāng)前連接數(shù)最少的服務(wù)器掉伏,實(shí)現(xiàn)方法如下:

upstream backend {
  least_conn;
  server 192.168.1.1;
  server 192.168.1.2;
  server 192.168.1.3;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

加權(quán)輪詢算法(Weighted Round Robin)

該算法將請(qǐng)求按照預(yù)設(shè)的權(quán)重分配給后端服務(wù)器,實(shí)現(xiàn)方法如下:

upstream backend {
  server 192.168.1.1 weight=3;
  server 192.168.1.2 weight=2;
  server 192.168.1.3 weight=1;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

加權(quán)最小連接數(shù)算法(Weighted Least Connections)

該算法將請(qǐng)求分配給連接數(shù)最少且權(quán)重最高的服務(wù)器澳窑,實(shí)現(xiàn)方法如下:

upstream backend {
  least_conn;
  server 192.168.1.1 weight=3;
  server 192.168.1.2 weight=2;
  server 192.168.1.3 weight=1;
}

server {
  listen 80;
  location / {
    proxy_pass http://backend;
  }
}

除了上面提到的常用參數(shù)斧散,還有以下一些常見(jiàn)的參數(shù):

proxy_set_header: 設(shè)置轉(zhuǎn)發(fā)請(qǐng)求頭的字段,可以將客戶端的請(qǐng)求頭中的一些字段轉(zhuǎn)發(fā)給后端服務(wù)器摊聋。例如:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 可以將客戶端的真實(shí)IP地址傳遞給后端服務(wù)器鸡捐。
proxy_cache: 啟用緩存功能,將后端服務(wù)器的響應(yīng)緩存到本地麻裁,可以減輕后端服務(wù)器的負(fù)載箍镜。需要設(shè)置緩存目錄、緩存時(shí)間和緩存規(guī)則等參數(shù)煎源。
proxy_ssl: 啟用SSL連接色迂,將客戶端和后端服務(wù)器之間的通信加密。需要設(shè)置SSL證書(shū)和私鑰等參數(shù)薪夕。
proxy_buffering: 是否啟用緩沖脚草,默認(rèn)情況下,nginx會(huì)將響應(yīng)全部緩存到內(nèi)存中再一次性發(fā)送給客戶端原献×罂可以設(shè)置為off關(guān)閉緩沖,將響應(yīng)實(shí)時(shí)發(fā)送給客戶端姑隅,可以降低延遲和內(nèi)存使用写隶。
proxy_redirect: 重定向配置,可以將后端服務(wù)器返回的重定向響應(yīng)自動(dòng)重寫(xiě)為新的URL讲仰。
proxy_pass_request_headers: 設(shè)置哪些請(qǐng)求頭需要傳遞給后端服務(wù)器慕趴。默認(rèn)情況下,所有請(qǐng)求頭都會(huì)被傳遞。
proxy_pass_request_body: 是否傳遞POST請(qǐng)求的body數(shù)據(jù)給后端服務(wù)器冕房,默認(rèn)情況下是不傳遞的躏啰。

proxy_ignore_headers: 忽略一些響應(yīng)頭字段,可以節(jié)省內(nèi)存和網(wǎng)絡(luò)帶寬耙册,例如:proxy_ignore_headers Set-Cookie Expires Cache-Control; 可以忽略這些響應(yīng)頭字段给僵。
proxy_cache_valid: 緩存有效時(shí)間,可以設(shè)置緩存多長(zhǎng)時(shí)間后過(guò)期详拙,例如:proxy_cache_valid 200 1h; 表示緩存200狀態(tài)碼的響應(yīng)1小時(shí)過(guò)期帝际。
proxy_cache_bypass: 緩存繞過(guò)規(guī)則,可以設(shè)置某些請(qǐng)求不走緩存饶辙,例如:proxy_cache_bypass http_pragma; 表示如果請(qǐng)求頭中帶有Pragma字段蹲诀,則不走緩存。 proxy_cache_key: 緩存鍵名弃揽,可以根據(jù)請(qǐng)求URL和一些請(qǐng)求頭字段生成緩存鍵名脯爪,例如:proxy_cache_key "schemerequest_methodhost$request_uri"; 表示根據(jù)請(qǐng)求URL生成緩存鍵名。
proxy_cache_path: 緩存目錄配置蹋宦,可以設(shè)置緩存目錄的位置披粟、大小和清理規(guī)則等參數(shù)咒锻,例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m; 表示將緩存目錄設(shè)置為/var/cache/nginx冷冗,并設(shè)置緩存大小和清理規(guī)則。
proxy_next_upstream: 設(shè)置當(dāng)后端服務(wù)器出現(xiàn)錯(cuò)誤時(shí)惑艇,nginx應(yīng)該重試哪些服務(wù)器蒿辙,例如:proxy_next_upstream error timeout http_500 http_502 http_503 http_504; 表示當(dāng)出現(xiàn)錯(cuò)誤、超時(shí)滨巴、500思灌、502、503恭取、504狀態(tài)碼時(shí)泰偿,nginx會(huì)嘗試下一個(gè)后端服務(wù)器。

proxy_connect_timeout: 連接后端服務(wù)器的超時(shí)時(shí)間蜈垮,例如:proxy_connect_timeout 5s; 表示連接后端服務(wù)器超時(shí)時(shí)間為5秒耗跛。
proxy_read_timeout: 讀取后端服務(wù)器響應(yīng)的超時(shí)時(shí)間,例如:proxy_read_timeout 10s; 表示讀取后端服務(wù)器響應(yīng)超時(shí)時(shí)間為10秒攒发。
proxy_send_timeout: 發(fā)送請(qǐng)求到后端服務(wù)器的超時(shí)時(shí)間调塌,例如:proxy_send_timeout 5s; 表示發(fā)送請(qǐng)求到后端服務(wù)器超時(shí)時(shí)間為5秒。
proxy_buffer_size: 緩存響應(yīng)的大小惠猿,可以提高響應(yīng)速度羔砾,例如:proxy_buffer_size 4k; 表示緩存響應(yīng)大小為4KB。
proxy_buffers: 緩存響應(yīng)的緩沖區(qū)大小和數(shù)量,可以提高響應(yīng)速度姜凄,例如:proxy_buffers 4 32k; 表示使用4個(gè)32KB大小的緩沖區(qū)緩存響應(yīng)政溃。
proxy_busy_buffers_size: 緩存響應(yīng)時(shí),如果緩沖區(qū)被占滿了态秧,nginx應(yīng)該如何處理玩祟,例如:proxy_busy_buffers_size 64k; 表示如果緩沖區(qū)被占滿了,nginx會(huì)等待響應(yīng)被寫(xiě)入到磁盤(pán)中屿聋。
proxy_temp_file_write_size: 緩存響應(yīng)時(shí)空扎,如果緩沖區(qū)被占滿了,nginx會(huì)將響應(yīng)寫(xiě)入到臨時(shí)文件中润讥,該參數(shù)設(shè)置臨時(shí)文件的大小转锈,例如:proxy_temp_file_write_size 64k; 表示臨時(shí)文件的大小為64KB。

proxy_redirect: 當(dāng)后端服務(wù)器返回重定向時(shí)楚殿,nginx會(huì)根據(jù)該參數(shù)進(jìn)行處理撮慨,例如:proxy_redirect default; 表示使用默認(rèn)的重定向方式處理。
proxy_set_header: 設(shè)置請(qǐng)求頭的值脆粥,例如:proxy_set_header Host $host; 表示將請(qǐng)求頭的Host字段設(shè)置為當(dāng)前的主機(jī)名砌溺。
proxy_pass_request_headers: 是否傳遞請(qǐng)求頭給后端服務(wù)器,例如:proxy_pass_request_headers on; 表示傳遞請(qǐng)求頭給后端服務(wù)器变隔。
proxy_pass_request_body: 是否傳遞請(qǐng)求體給后端服務(wù)器规伐,例如:proxy_pass_request_body on; 表示傳遞請(qǐng)求體給后端服務(wù)器。
proxy_method: 指定使用的HTTP方法匣缘,例如:proxy_method POST; 表示使用POST方法猖闪。
proxy_cookie_domain: 修改請(qǐng)求頭中Cookie域的值,例如:proxy_cookie_domain localhost example.com; 表示將請(qǐng)求頭中的Cookie域從localhost修改為example.com肌厨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末培慌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子柑爸,更是在濱河造成了極大的恐慌吵护,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件表鳍,死亡現(xiàn)場(chǎng)離奇詭異馅而,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)进胯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門用爪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胁镐,你說(shuō)我怎么就攤上這事偎血≈钕危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵颇玷,是天一觀的道長(zhǎng)笨农。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帖渠,這世上最難降的妖魔是什么谒亦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮空郊,結(jié)果婚禮上份招,老公的妹妹穿的比我還像新娘。我一直安慰自己狞甚,他們只是感情好锁摔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著哼审,像睡著了一般谐腰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涩盾,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天十气,我揣著相機(jī)與錄音,去河邊找鬼春霍。 笑死砸西,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的终畅。 我是一名探鬼主播籍胯,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竟闪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼离福!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起炼蛤,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妖爷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后理朋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體絮识,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年嗽上,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了次舌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兽愤,死狀恐怖彼念,靈堂內(nèi)的尸體忽然破棺而出挪圾,到底是詐尸還是另有隱情,我是刑警寧澤逐沙,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布哲思,位于F島的核電站,受9級(jí)特大地震影響吩案,放射性物質(zhì)發(fā)生泄漏棚赔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一徘郭、第九天 我趴在偏房一處隱蔽的房頂上張望靠益。 院中可真熱鬧,春花似錦残揉、人聲如沸捆毫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绩卤。三九已至,卻和暖如春江醇,著一層夾襖步出監(jiān)牢的瞬間濒憋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工陶夜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凛驮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓条辟,卻偏偏與公主長(zhǎng)得像黔夭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羽嫡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • Nginx負(fù)載均衡 1本姥、負(fù)載均衡的作用 如果你的nginx服務(wù)器給2臺(tái)web服務(wù)器做代理,負(fù)載均衡算法采用輪詢杭棵,那...
    漫步云端vv閱讀 547評(píng)論 0 1
  • 一婚惫、負(fù)載均衡 負(fù)載均衡是一種集群技術(shù),旨在解決高并發(fā)場(chǎng)景下的服務(wù)問(wèn)題魂爪。其硬件環(huán)境模型可以由一臺(tái)前置服務(wù)器和多臺(tái)服務(wù)...
    大魚(yú)燉海棠閱讀 415評(píng)論 0 8
  • 負(fù)載均衡 將用戶的請(qǐng)求均勻的或者按照一定的優(yōu)先級(jí)分配到一組服務(wù)器中的一臺(tái)上先舷,而接收到請(qǐng)求的服務(wù)器獨(dú)立的處理請(qǐng)求并返...
    大喬是個(gè)美少女閱讀 456評(píng)論 0 0
  • linux負(fù)載均衡總結(jié)性說(shuō)明(四層負(fù)載/七層負(fù)載) 一,什么是負(fù)載均衡1)負(fù)載均衡(Load Balance)建立...
    phpdi閱讀 402評(píng)論 0 0
  • day49Nginx負(fù)載均衡實(shí)戰(zhàn)集群開(kāi)機(jī)順序:1滓侍、從后往前開(kāi)蒋川。 編譯安裝nginx負(fù)載均衡下載:mkdir -p ...
    國(guó)王12閱讀 297評(píng)論 0 0