前言
本文收錄于我是沐風(fēng)曉月的csdn專欄《linux基本功-系統(tǒng)服務(wù)實(shí)戰(zhàn)》, 關(guān)于nginx的系列后面會(huì)匯總起來,關(guān)注我,一起學(xué)習(xí)與成長。
本專欄寫作的過程中,聯(lián)合了csdn幾位大佬,目前正在整理更新目錄,力爭讓大家學(xué)到一些真東西,將所學(xué)的理論落地,幫助你更快的提升自己。
學(xué)技術(shù)最難的地方,其實(shí)是找到最優(yōu)資料的過程,這次聯(lián)合幾位csdn的云原生方向的博主大佬,一起打造易學(xué),易懂,落地的架構(gòu)和云原生專欄。
一. 重點(diǎn)知識(shí)回顧
1.1 Nginx內(nèi)核與模塊劃分
- 內(nèi)核
其設(shè)計(jì)非常微小和簡潔,完成的工作也非常簡單。僅通過查找配置文件將客戶端請(qǐng)求映射到一個(gè)location block(location是nginx配置中的一個(gè)指令,用例URL匹配),而在這個(gè)location中所配置的每個(gè)指令將會(huì)啟動(dòng)不同的模塊取完成相應(yīng)的工作。
- 從結(jié)構(gòu)上劃分:
- 核心模塊:HTTP模塊、EVENT模塊和MAIL模塊。 基礎(chǔ)模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP
- Proxy模塊和HTTP Rewrite模塊。 第三方模塊:HTTP Upstream Request
- Hash模塊、Notice模塊和HTTP Access Key模塊。
一般我們需要記住 模塊名字即可,做到心里有底。
- 從功能上劃分
- Core(核心模塊):構(gòu)建nginx基礎(chǔ)服務(wù)、管理其他模塊。
- Handlers(處理器模塊):此類模塊直接處理請(qǐng)求,并進(jìn)行輸出內(nèi)容和修改headers信息等操作。
Handlers
處理器模塊一般只能有一個(gè)。 - Filters (過濾器模塊):此類模塊主要對(duì)其他處理器模塊輸出的內(nèi)容進(jìn)行修改操作,最后由Nginx輸出。
- Proxies (代理類模塊):此類模塊是Nginx的
HTTP Upstream
之類的模塊,這些模塊主要與后端一些服務(wù)
比如FastCGI
等進(jìn)行交互,實(shí)現(xiàn)服務(wù)代理和負(fù)載均衡等功能。
1.2 Nginx模塊處理流程
- 收到HTTP請(qǐng)求。
- Nginx基于配置文件中的位置選擇一個(gè)合適的處理模塊(Handlers)。
- Handlers模塊需要把請(qǐng)求反向代理到后端服務(wù)器,就需要就變成另外一類的模塊:
load-balancers
(負(fù)載均衡模塊) - 負(fù)載均衡模塊的配置中有一組后端服務(wù)器,當(dāng)一個(gè)
HTTP請(qǐng)求
過來時(shí),它決定哪臺(tái)服務(wù)器應(yīng)當(dāng)獲得這個(gè)請(qǐng)求。 - 處理完成后,
filters
(過濾模塊)將被調(diào)用。每個(gè)請(qǐng)求都可以被壓縮成塊,依次經(jīng)過多個(gè)filters
過。它們的執(zhí)行順序在編譯時(shí)決定。過濾模塊鏈以流水線的方式高效率地向客戶端發(fā)送響應(yīng)信息。每個(gè)filters
不會(huì)等上一個(gè)filters
全部完成,就像是流水線一樣。 - 最后把響應(yīng)發(fā)給客戶端。
Nginx本身做的工作實(shí)際很少,當(dāng)它接到一個(gè)HTTP請(qǐng)求時(shí),它僅僅是通過查找配置文件將此次請(qǐng)求映射到一個(gè)location block
,而此location中所配置的各個(gè)指令則會(huì)啟動(dòng)不同的模塊去完成工作,因此模塊可以看做Nginx真正的勞動(dòng)工作者
。
1.3 nginx負(fù)載均衡的作用
- 解決服務(wù)器的高并發(fā)壓力,提高應(yīng)用程序的處理性能;
- 提供故障轉(zhuǎn)移,實(shí)現(xiàn)高可用;
- 通過添加或減少服務(wù)器數(shù)量,增強(qiáng)網(wǎng)站的可擴(kuò)展性;
- 在負(fù)載均衡器上進(jìn)行過濾,可以提高系統(tǒng)的安全性。
二. 負(fù)載均衡的算法
2.1 關(guān)于負(fù)載均衡的理論回顧
負(fù)載均衡,就是 Nginx 把請(qǐng)求均勻的分?jǐn)偨o上游的應(yīng)用服務(wù)器,這樣即使某一個(gè)服務(wù)器宕機(jī)也不會(huì)影響請(qǐng)求的處理,或者當(dāng)應(yīng)用服務(wù)器扛不住了,可以隨時(shí)進(jìn)行擴(kuò)容。
nginx將客戶端的請(qǐng)求,根據(jù)相應(yīng)的規(guī)則分發(fā)到部署項(xiàng)目的后端服務(wù)器,比如tomcat。 這里的相應(yīng)規(guī)則其實(shí)就是在配置文件中指定:pass_proxy指令以及upstream指令。
靜態(tài)負(fù)載均衡的算法: 主要包括 輪詢算法,基于比率的加權(quán)輪詢算法或者基于優(yōu)先級(jí)的加權(quán)輪詢算法;
動(dòng)態(tài)負(fù)載均衡的算法: 主要包括基于任務(wù)量的最少連接優(yōu)化算法、基于性能的最快響應(yīng)優(yōu)先算法、預(yù)測算法及動(dòng)態(tài)性能分配算法等;
一般動(dòng)態(tài)的負(fù)載均衡算法更加適用于復(fù)雜的網(wǎng)絡(luò)環(huán)境。
負(fù)載均衡都是基于OSI七層模型來劃分的:
OSI七層模型:
- 物理層:比特流傳輸
- 數(shù)據(jù)鏈路層:控制網(wǎng)絡(luò)層與物理層之間的通信;
- 網(wǎng)絡(luò)層:IP尋址和路由選擇;
- 傳輸層:建立、維護(hù)、管理端到端的連接,常見的有TCP/UDP;
- 會(huì)話層:建立、維護(hù)、管理會(huì)話連接;
- 表示層:對(duì)數(shù)據(jù)進(jìn)行格式化、編碼、加密、壓縮等操作;
- 應(yīng)用層:為應(yīng)用程序提供網(wǎng)絡(luò)服務(wù);
- 四層負(fù)載是在傳輸層,基于IP+port的負(fù)載均衡,常見的有:
硬件:F5、BIG-IP、Radware等;
軟件:LVS、Nginx、Hayproxy等
nginx 增加了一個(gè)stream模塊,用來實(shí)現(xiàn)四層協(xié)議的轉(zhuǎn)發(fā),代理,負(fù)載均衡等。
stream模塊的用法跟http的用法類似,允許我們配置一組TCP或者UDP等協(xié)議的監(jiān)聽,然后通過proxy_pass來轉(zhuǎn)發(fā)我們的請(qǐng)求,通過upstream添加多個(gè)后端服務(wù),實(shí)現(xiàn)負(fù)載均衡;
要使用stream的模式,需要在編譯的時(shí)候加上 --with-stream
才能用。
- 七層負(fù)載均衡主要在應(yīng)用層,主要基于虛擬的URL或者主機(jī)的IP的負(fù)載均衡:
實(shí)現(xiàn)七層負(fù)載均衡的方式:
軟件:Nginx、Hayproxy等
2.2 目前nginx常用的算法
Nginx的upstream支持如下六種方式的分配算法,分別是:
算法名稱 | 說明 |
---|---|
輪詢 | 默認(rèn)方式 |
weight | 權(quán)重方式 |
ip_hash | 依據(jù)ip分配方式 |
least_conn | 依據(jù)最少連接方式 |
url_hash | 依據(jù)URL分配方式 |
fair | 依據(jù)響應(yīng)時(shí)間方式 |
1. 輪詢(默認(rèn)方式)
輪詢是upstream模塊負(fù)載均衡默認(rèn)的策略,每個(gè)請(qǐng)求會(huì)按時(shí)間順序逐個(gè)被分配到不同的后端服務(wù)器。輪詢不需要額外的配置.
upstream mufengserver{
server 192.168.1.41:8080;
server 192.168.1.42:8081;
}
server {
listen 80;
server_name localhost;
location / {
# mufengserver 就是服務(wù)器組的名稱
proxy_pass http://mufengserver/;
}
}
2. 權(quán)重策略(weight 加權(quán)輪詢)
weitht=number
后面的weight參數(shù)越高,任務(wù)也就越多,權(quán)重?cái)?shù)字越大,被分配到請(qǐng)求的幾率越大,默認(rèn)為1;
用于在服務(wù)器性能不均衡的情況下使用,主要是針對(duì)實(shí)際工作環(huán)境中不同的后端服務(wù)器硬件配置進(jìn)行調(diào)整的,所有此策略比較適合服務(wù)器的硬件配置差別比較大的情況。
比如你的服務(wù)器 4C8G 和 8C16G 的服務(wù)器都有,那么這時(shí)候就可以對(duì)服務(wù)器設(shè)置一些權(quán)重,讓性能好的承擔(dān)更多的請(qǐng)求。
upstream mufengserver{
server 192.168.1.41:9001 weight=5;
server 192.168.1.42:9002 weight=1;
}
server {
listen 8080;
server_name localhost;
location / {
# mufengserver 就是服務(wù)器組的名稱
proxy_pass http:/mufengserver/;
}
}
3. ip_hash
當(dāng)對(duì)后端的多臺(tái)動(dòng)態(tài)應(yīng)用服務(wù)器做負(fù)載均衡時(shí),ip_hash
指令能夠?qū)⒛硞€(gè)客戶端IP的請(qǐng)求通過哈希算法定位到同一臺(tái)后端服務(wù)器上;
當(dāng)來自某一個(gè)IP的用戶在后端Web服務(wù)器A上登錄后,再訪問該站點(diǎn)的其他URL,能保證其訪問的還是后端web服務(wù)器A;
# 代理服務(wù)器
# 設(shè)置服務(wù)器組
upstream mufengserver{
ip_hash;
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服務(wù)器組的名稱
proxy_pass http://mufengserver/;
}
}
注意:使用ip_hash指令
無法保證后端服務(wù)器的負(fù)載均衡,可能導(dǎo)致有些后端服務(wù)器接收到的請(qǐng)求多,有些后端服務(wù)器接受的請(qǐng)求少,而且設(shè)置后端服務(wù)器權(quán)重等方法將不起作用.
4. fair
fair
主要根據(jù)訪問的時(shí)間來分配任務(wù),根據(jù)頁面的大小,加載時(shí)間長短等智能的進(jìn)行負(fù)載均衡;
要使用第三方模塊fair
必須安裝upstream_fair模塊;
upstream myserver{
server 192.168.137.13:8082;
server 192.168.137.13:8081;
fair;
}
server {
listen 8080;
server_name localhost;
location / {
# mufengserver 就是服務(wù)器組的名稱
proxy_pass http://mufengserver/;
}
}
5. url_hash
第三方插件,需要安裝Nginx的hash軟件包,按訪問url的hash結(jié)果來分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,要配合緩存命中來使用。
有時(shí)候同一個(gè)資源多次請(qǐng)求,可能會(huì)到達(dá)不同的服務(wù)器上,導(dǎo)致不必要的多次下載,緩存命中率不高,以及一些資源時(shí)間的浪費(fèi),但使用url_hash
,可以使得同一個(gè)url(也就是同一個(gè)資源請(qǐng)求)會(huì)到達(dá)同一臺(tái)服務(wù)器,一旦緩存住了資源,再次收到請(qǐng)求,就可以從緩存中讀取。
# 代理服務(wù)器
# 設(shè)置服務(wù)器組
upstream mufengserver {
hash $request_uri;
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# mufengserver 就是服務(wù)器組的名稱
proxy_pass http://mufengserver;
}
}
6. least_conn
least_conn:最少連接,把請(qǐng)求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器。
輪詢算法是把請(qǐng)求平均地轉(zhuǎn)發(fā)給各個(gè)后端,使它們的負(fù)載大致相同;但是,有些請(qǐng)求占用的時(shí)間很長,會(huì)導(dǎo)致其所在的后端負(fù)載較高。這種情況下,least_conn這種方式就可以達(dá)到更好的負(fù)載均衡效果。
這種方式適合請(qǐng)求處理時(shí)間長短不一造成服務(wù)器過載的情況。文章來源:http://www.zghlxwxcb.cn/news/detail-781438.html
upstream mufengserver{
least_conn;
server localhost:9001;
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# mufengserver 就是服務(wù)器組的名稱
proxy_pass http://mufengserver/;
}
}
總結(jié)
?? 好啦,這就是今天要分享給大家的全部內(nèi)容了,我們下期再見!
?? 本文由沐風(fēng)曉月原創(chuàng),首發(fā)于CSDN博客, 博客主頁:mufeng.blog.csdn.net
?? 學(xué)習(xí)如逆水行舟,不進(jìn)則退,一起努力加油哦!
?? 喜歡的話記得點(diǎn)贊收藏哈文章來源地址http://www.zghlxwxcb.cn/news/detail-781438.html
到了這里,關(guān)于提升網(wǎng)站性能:Nginx五種高效負(fù)載均衡策略的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!