Nginx作為負載均衡器,通過將請求分發到多個后端服務器,以提高性能、可靠性和擴展性。支持多種負載均衡算法,如輪詢、最小連接數、IP哈希等,可以根據需求選擇適合的算法。
一、工作原理
nginx的高性能主要是因為
1、事件驅動架構
Nginx采用事件驅動的非阻塞方式處理請求,主要利用了操作系統提供的多路復用機制,通過異步非阻塞的方式處理大量并發請求,減少了線程切換和資源消耗,提高了并發處理能力和系統的穩定性。
2、事件循環
事件循環機制是核心的工作模式之一。它通過單線程的方式處理事件,包括等待事件、處理事件和繼續循環。在等待事件時,Nginx并不會像傳統多線程模型那樣阻塞等待,而是通過事件通知機制在有事件發生時再進行處理,這樣可以充分利用CPU資源,提升系統的效率和性能。
3、多進程
Nginx可以通過配置文件中的worker_processes選項來啟動多個進程來處理請求。每個進程都有自己獨立的事件循環和資源管理,進程之間沒有共享狀態,這種設計可以避免單點故障,提高系統的可靠性和穩定性。并且Nginx的多進程模型使得它能夠更好地利用多核CPU,通過并行處理請求來提高整體的處理能力。
二、反向代理
server { listen 80; server_name example.com; root /root/build/;#靜態資源地址 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 } }
例如在這個例子中,設置了index目錄和靜態資源目錄。并且設置了域名訪問。很大了保證了服務器的安全性。在下面的反向代理配置中,通過正則表達式將/api/server/開頭的映射到http://localhost:8080這個地址。
whiteboard_exported_image.png
三、負載均衡
負載均衡也就是通過反向代理到不同的服務,保證服務的可用性。多用于在分布式系統中。例如某個系統分布在100個服務器上,當某幾臺服務器崩潰時,會代理到其他服務器,不會影響系統的運行。更好的實現橫向擴展。
例如一個簡單的get請求代碼
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()
具體的負載均衡算法
1、輪詢
nginx的均衡默認算法:直接基于事件循環。類似于排隊,一個一個來,例如第一個請求分發給第一個服務,第二個就分發給第二個服務,以此類推。缺點:沒有具體情況具體分析,某些情況下的請求會導致負載很高。
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地址,根據需要調整 deny all; # 禁止其他IP地址訪問 } }
將上述訪問運行在兩個不同的服務器上,默認的輪詢會每個服務器都請求一次,除非有一臺掉線,否則nginx會均分請求。
下面行的localhost塊b表示新的匹配規則,用于查看nginx當前的連接數和請求統計信息。
server accepts handled requests
Active connections: 1
表示當前活躍的連接數,即正在與Nginx服務器建立通信的客戶端連接數量。
server accepts handled requests
accepts: 表示Nginx已經接受的連接總數。
handled: 表示Nginx已經處理的連接總數。
requests: 表示Nginx已經處理的請求總數。
Reading: 0 Writing: 1 Waiting: 0
Reading: 正在讀取客戶端請求的數量。
Writing: 正在向客戶端發送響應的數量。
Waiting: 當前空閑的客戶端連接數,等待處理請求
2、最少連接
會將請求分配給連接最少的服務,保證系統的整體性能。缺點是沒有具體情況具體分析,沒有考慮負載情況,不是請求越多負載越大。
upstream tornado_servers { least_conn; # 使用最少連接數算法 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地址的哈希值分配給特定的服務器,如果下一次請求的IP哈希值與之前一樣,那么依然會請求到之前的服務器。如果不一樣那么為新的服務器創建新的哈希值。這樣避免了服務器的切換開銷,保持了會話的一致性。但是這樣的缺點是同一個客戶端的請求無法做到負載均衡。
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地址,根據需要調整 deny all; # 禁止其他IP地址訪問 } }
4、加權輪詢
在輪詢的基礎上為每個服務器加上一個權重值,每個服務器的承受連接數量。在輪詢的情況下再次考慮權重值。例如兩臺服務器,服務器A、B的權重分別為5,3輪詢流程為:
第一次請求:服務器A處理請求
第二次請求:服務器B處理請求
第三次請求:服務器A處理請求
第四次請求:服務器A處理請求
第五次請求:服務器A處理請求
第六次請求:服務器B處理請求
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地址,根據需要調整 deny all; # 禁止其他IP地址訪問 } }
5、加權最小連接
在最小連接的算法基礎上,加上權重值。這時候需要根據連接數量和權重值來評估目標服務器。
例如服務器A、B、C。權重值分別為5、3、2。連接數分別為10、5、3.
計算加權連接數:
服務器A:10/5=2
服務器B:5/3=1.67
服務器C:3/2=1.5
那么根據加權連接數,最小加權連接數為1.5。那么會代理到服務器C
upstream tornado_servers { least_conn; # 使用最少連接數算法 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地址,根據需要調整 deny all; # 禁止其他IP地址訪問 } }
四、總結
反向代理就像是位于用戶和真實服務器之間的一座橋梁,它接收用戶的請求并將其轉發到后端的多臺服務器上。這種配置不僅隱藏了真實服務器的信息,還能提供安全性和負載均衡功能。負載均衡通過智能地分發請求到不同的服務器,確保每臺服務器的負載相對平衡,從而提高整體性能和可靠性。這種結合能夠有效地處理高并發請求,保證系統在壓力下仍能保持穩定運行。
鏈接:https://www.cnblogs.com/changwan/p/18246095
-
服務器
+關注
關注
13文章
9748瀏覽量
87536 -
nginx
+關注
關注
0文章
168瀏覽量
12537 -
負載均衡器
+關注
關注
0文章
20瀏覽量
2666
原文標題:手把手教程:10分鐘快速搭建Nginx負載均衡環境
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
f5負載均衡和Nginx負載均衡有什么區別

路由器負載均衡如何設置_路由器負載均衡的模式詳解

超詳細!使用 LVS 實現負載均衡原理及安裝配置詳解
一文讀懂Nginx、Apache工作原理
詳解Nginx負載均衡配置誤區

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

nginx負載均衡配置介紹

評論