Nginx作為負(fù)載均衡器,通過將請(qǐng)求分發(fā)到多個(gè)后端服務(wù)器,以提高性能、可靠性和擴(kuò)展性。支持多種負(fù)載均衡算法,如輪詢、最小連接數(shù)、IP哈希等,可以根據(jù)需求選擇適合的算法。
一、工作原理
nginx的高性能主要是因?yàn)?/p>
1、事件驅(qū)動(dòng)架構(gòu)
Nginx采用事件驅(qū)動(dòng)的非阻塞方式處理請(qǐng)求,主要利用了操作系統(tǒng)提供的多路復(fù)用機(jī)制,通過異步非阻塞的方式處理大量并發(fā)請(qǐng)求,減少了線程切換和資源消耗,提高了并發(fā)處理能力和系統(tǒng)的穩(wěn)定性。
2、事件循環(huán)
事件循環(huán)機(jī)制是核心的工作模式之一。它通過單線程的方式處理事件,包括等待事件、處理事件和繼續(xù)循環(huán)。在等待事件時(shí),Nginx并不會(huì)像傳統(tǒng)多線程模型那樣阻塞等待,而是通過事件通知機(jī)制在有事件發(fā)生時(shí)再進(jìn)行處理,這樣可以充分利用CPU資源,提升系統(tǒng)的效率和性能。
3、多進(jìn)程
Nginx可以通過配置文件中的worker_processes選項(xiàng)來啟動(dòng)多個(gè)進(jìn)程來處理請(qǐng)求。每個(gè)進(jìn)程都有自己獨(dú)立的事件循環(huán)和資源管理,進(jìn)程之間沒有共享狀態(tài),這種設(shè)計(jì)可以避免單點(diǎn)故障,提高系統(tǒng)的可靠性和穩(wěn)定性。并且Nginx的多進(jìn)程模型使得它能夠更好地利用多核CPU,通過并行處理請(qǐng)求來提高整體的處理能力。
二、反向代理
server { listen 80; server_name example.com; root /root/build/;#靜態(tài)資源地址 index index.html; location /api/server/ { proxy_pass http://localhost:8080; proxy_set_header Host$host; proxy_set_header X-Real-IP$remote_addr; proxy_set_header X-Forwarded-For } }
例如在這個(gè)例子中,設(shè)置了index目錄和靜態(tài)資源目錄。并且設(shè)置了域名訪問。很大了保證了服務(wù)器的安全性。在下面的反向代理配置中,通過正則表達(dá)式將/api/server/開頭的映射到http://localhost:8080這個(gè)地址。
whiteboard_exported_image.png
三、負(fù)載均衡
負(fù)載均衡也就是通過反向代理到不同的服務(wù),保證服務(wù)的可用性。多用于在分布式系統(tǒng)中。例如某個(gè)系統(tǒng)分布在100個(gè)服務(wù)器上,當(dāng)某幾臺(tái)服務(wù)器崩潰時(shí),會(huì)代理到其他服務(wù)器,不會(huì)影響系統(tǒng)的運(yùn)行。更好的實(shí)現(xiàn)橫向擴(kuò)展。
例如一個(gè)簡(jiǎn)單的get請(qǐng)求代碼
importtornado.ioloop importtornado.web classMainHandler(tornado.web.RequestHandler): defget(self): self.write("Hello, Tornado!") defmake_app(): returntornado.web.Application([ (r"/", MainHandler), ]) if__name__ =="__main__": app = make_app() app.listen(8888) print("Server running on http://localhost:8888") tornado.ioloop.IOLoop.current().start()
具體的負(fù)載均衡算法
1、輪詢
nginx的均衡默認(rèn)算法:直接基于事件循環(huán)。類似于排隊(duì),一個(gè)一個(gè)來,例如第一個(gè)請(qǐng)求分發(fā)給第一個(gè)服務(wù),第二個(gè)就分發(fā)給第二個(gè)服務(wù),以此類推。缺點(diǎn):沒有具體情況具體分析,某些情況下的請(qǐng)求會(huì)導(dǎo)致負(fù)載很高。
upstream tornado_servers { server 192.168.31.158:8888; server localhost:8888; } server { listen 80; server_name 192.168.62.132; location / { proxy_pass http://tornado_servers; proxy_set_header Host$host; proxy_set_header X-Real-IP$remote_addr; } location /nginx_status { stub_status on; access_log off; allow 192.168.62.0/24; # 允許訪問的IP地址,根據(jù)需要調(diào)整 deny all; # 禁止其他IP地址訪問 } }
將上述訪問運(yùn)行在兩個(gè)不同的服務(wù)器上,默認(rèn)的輪詢會(huì)每個(gè)服務(wù)器都請(qǐng)求一次,除非有一臺(tái)掉線,否則nginx會(huì)均分請(qǐng)求。
下面行的localhost塊b表示新的匹配規(guī)則,用于查看nginx當(dāng)前的連接數(shù)和請(qǐng)求統(tǒng)計(jì)信息。
server accepts handled requests
Active connections: 1
表示當(dāng)前活躍的連接數(shù),即正在與Nginx服務(wù)器建立通信的客戶端連接數(shù)量。
server accepts handled requests
accepts: 表示Nginx已經(jīng)接受的連接總數(shù)。
handled: 表示Nginx已經(jīng)處理的連接總數(shù)。
requests: 表示Nginx已經(jīng)處理的請(qǐng)求總數(shù)。
Reading: 0 Writing: 1 Waiting: 0
Reading: 正在讀取客戶端請(qǐng)求的數(shù)量。
Writing: 正在向客戶端發(fā)送響應(yīng)的數(shù)量。
Waiting: 當(dāng)前空閑的客戶端連接數(shù),等待處理請(qǐng)求
2、最少連接
會(huì)將請(qǐng)求分配給連接最少的服務(wù),保證系統(tǒng)的整體性能。缺點(diǎn)是沒有具體情況具體分析,沒有考慮負(fù)載情況,不是請(qǐng)求越多負(fù)載越大。
upstream tornado_servers { least_conn; # 使用最少連接數(shù)算法 server192.168.31.158:8888; server localhost:8888; } server { listen80; server_name192.168.62.132; location / { proxy_pass http://tornado_servers; proxy_set_header Host$host; proxy_set_header X-Real-IP$remote_addr; } }
least_conn字段表示使用最少連接算法。
3、IP哈希
通過客戶端的IP地址的哈希值分配給特定的服務(wù)器,如果下一次請(qǐng)求的IP哈希值與之前一樣,那么依然會(huì)請(qǐng)求到之前的服務(wù)器。如果不一樣那么為新的服務(wù)器創(chuàng)建新的哈希值。這樣避免了服務(wù)器的切換開銷,保持了會(huì)話的一致性。但是這樣的缺點(diǎn)是同一個(gè)客戶端的請(qǐng)求無法做到負(fù)載均衡。
upstream tornado_servers { ip_hash; # 使用IP哈希算法 server 192.168.31.158:8888; server localhost:8888; } server { listen 80; server_name 192.168.62.132; location / { proxy_pass http://tornado_servers; proxy_set_header Host$host; proxy_set_header X-Real-IP$remote_addr; } location /nginx_status { stub_status on; access_log off; allow 192.168.62.0/24; # 允許訪問的IP地址,根據(jù)需要調(diào)整 deny all; # 禁止其他IP地址訪問 } }
4、加權(quán)輪詢
在輪詢的基礎(chǔ)上為每個(gè)服務(wù)器加上一個(gè)權(quán)重值,每個(gè)服務(wù)器的承受連接數(shù)量。在輪詢的情況下再次考慮權(quán)重值。例如兩臺(tái)服務(wù)器,服務(wù)器A、B的權(quán)重分別為5,3輪詢流程為:
第一次請(qǐng)求:服務(wù)器A處理請(qǐng)求
第二次請(qǐng)求:服務(wù)器B處理請(qǐng)求
第三次請(qǐng)求:服務(wù)器A處理請(qǐng)求
第四次請(qǐng)求:服務(wù)器A處理請(qǐng)求
第五次請(qǐng)求:服務(wù)器A處理請(qǐng)求
第六次請(qǐng)求:服務(wù)器B處理請(qǐng)求
upstream tornado_servers { server 192.168.31.158:8888 weight=5; server localhost:8888 weight=3; } server { listen 80; server_name 192.168.62.132; location / { proxy_pass http://tornado_servers; proxy_set_header Host$host; proxy_set_header X-Real-IP$remote_addr; } location /nginx_status { stub_status on; access_log off; allow 192.168.62.0/24; # 允許訪問的IP地址,根據(jù)需要調(diào)整 deny all; # 禁止其他IP地址訪問 } }
5、加權(quán)最小連接
在最小連接的算法基礎(chǔ)上,加上權(quán)重值。這時(shí)候需要根據(jù)連接數(shù)量和權(quán)重值來評(píng)估目標(biāo)服務(wù)器。
例如服務(wù)器A、B、C。權(quán)重值分別為5、3、2。連接數(shù)分別為10、5、3.
計(jì)算加權(quán)連接數(shù):
服務(wù)器A:10/5=2
服務(wù)器B:5/3=1.67
服務(wù)器C:3/2=1.5
那么根據(jù)加權(quán)連接數(shù),最小加權(quán)連接數(shù)為1.5。那么會(huì)代理到服務(wù)器C
upstream tornado_servers { least_conn; # 使用最少連接數(shù)算法 server 192.168.31.158:8888 weight=5; server localhost:8888 weight=3; } server { listen 80; server_name 192.168.62.132; location / { proxy_pass http://tornado_servers; proxy_set_header Host$host; proxy_set_header X-Real-IP$remote_addr; } location /nginx_status { stub_status on; access_log off; allow 192.168.62.0/24; # 允許訪問的IP地址,根據(jù)需要調(diào)整 deny all; # 禁止其他IP地址訪問 } }
四、總結(jié)
反向代理就像是位于用戶和真實(shí)服務(wù)器之間的一座橋梁,它接收用戶的請(qǐng)求并將其轉(zhuǎn)發(fā)到后端的多臺(tái)服務(wù)器上。這種配置不僅隱藏了真實(shí)服務(wù)器的信息,還能提供安全性和負(fù)載均衡功能。負(fù)載均衡通過智能地分發(fā)請(qǐng)求到不同的服務(wù)器,確保每臺(tái)服務(wù)器的負(fù)載相對(duì)平衡,從而提高整體性能和可靠性。這種結(jié)合能夠有效地處理高并發(fā)請(qǐng)求,保證系統(tǒng)在壓力下仍能保持穩(wěn)定運(yùn)行。
鏈接:https://www.cnblogs.com/changwan/p/18246095
-
服務(wù)器
+關(guān)注
關(guān)注
13文章
9749瀏覽量
87547 -
nginx
+關(guān)注
關(guān)注
0文章
168瀏覽量
12537 -
負(fù)載均衡器
+關(guān)注
關(guān)注
0文章
20瀏覽量
2666
原文標(biāo)題:手把手教程:10分鐘快速搭建Nginx負(fù)載均衡環(huán)境
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
高性能負(fù)載均衡Tomcat集群的實(shí)現(xiàn)
使用nginx實(shí)現(xiàn)tomcat負(fù)載均衡
16nginx+keepalived +zuul如何實(shí)現(xiàn)高可用及負(fù)載均衡
Nginx和Tomcat負(fù)載均衡實(shí)現(xiàn)session共享

構(gòu)建實(shí)戰(zhàn):Nginx+IIS構(gòu)筑Web服務(wù)器集群負(fù)載均衡

路由器負(fù)載均衡如何設(shè)置_路由器負(fù)載均衡的模式詳解

超詳細(xì)!使用 LVS 實(shí)現(xiàn)負(fù)載均衡原理及安裝配置詳解
一文讀懂Nginx、Apache工作原理
詳解Nginx負(fù)載均衡配置誤區(qū)

聊聊Nginx作為負(fù)載均衡器它支持的算法都有哪些?
如何使用Nginx作為應(yīng)用程序的負(fù)載均衡器?
搭建Keepalived+Lvs+Nginx高可用集群負(fù)載均衡

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

評(píng)論