負載均衡——nginx理論

来源:http://www.cnblogs.com/ivehd/archive/2016/11/13/nginxSummary.html
-Advertisement-
Play Games

nginx是什麼? nginx是一個強大的web伺服器軟體,用於處理高併發的http請求和作為反向代理伺服器做負載均衡。具有高性能、輕量級、記憶體消耗少,強大的負載均衡能力等優勢。 nginx架構? 如上官方示意圖所示,nginx啟動以後,會在系統中以daemon的方式在後臺運行,其中包括一個mast ...


 nginx是什麼?

  nginx是一個強大的web伺服器軟體,用於處理高併發的http請求和作為反向代理伺服器做負載均衡。具有高性能、輕量級、記憶體消耗少,強大的負載均衡能力等優勢。

 

 nginx架構?

  如上官方示意圖所示,nginx啟動以後,會在系統中以daemon的方式在後臺運行,其中包括一個master進程,n(n>=1)個worker進程。

  其中,master進程用於接收來自外界的信號,並給worker進程發送信號,同時監控worker進程的工作狀態。

       worker進程則是外部請求真正的處理者,每個worker請求相互獨立且平等的競爭來自客戶端的請求。請求只能在一個worker進程中被處理,且一個worker進程只有一個主線程,所以同時只能處理一個請求。那麼問題來了,一個worker進程只有一個主線程,只能同時處理一個請求,nginx對高併發請求強大的處理能力是如何保證的呢?答案是nginx採用非同步非阻塞的方式來處理請求,即單線程、非阻塞、非同步IO的工作模型。對比apache的非同步非阻塞版本的工作模式,apache會為每一個請求新建一個線程去處理請求,線程進行上下文切換,會造成記憶體和CPU的浪費。反看nginx的非同步非阻塞io模式,實用操作系統提供的io多路復用技術(epoll),在一個線程中處理所有請求,當一個io操作開始的時候,nginx不會等待其完成就回去處理下一個請求,等到io操作完成後,nginx再回來處理這一次請求io操作的後續工作。相比apache,nginx省去了線程上下文切換帶來的資源開銷。 

       那麼nginx如何確定哪個worker來處理請求呢?首先,每個worker進程都是從master進程fork過來,在master進程裡面,先建立好需要listen的socket(listenfd)之後,然後再fork出多個worker進程。所有worker進程的listenfd會在新連接到來時變得可讀,為保證只有一個進程處理該連接,所有worker進程在註冊listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個進程註冊listenfd讀事件,在讀事件里調用accept接受該連接。當一個worker進程在accept這個連接之後,就開始讀取請求,解析請求,處理請求,產生數據後,再返回給客戶端,最後才斷開連接,這樣一個完整的請求就是這樣的了。這樣,一個請求,完全由worker進程來處理,而且只在一個worker進程中處理。

 

 nginx性能?

       這裡援引網上搜索到的nginx的測試數據:10000個非活躍的HTTP keep-alive 連接僅占用約2.5MB記憶體。三萬併發連接下,10個Nginx進程,消耗記憶體150M。淘寶tengine團隊說測試結果是“24G記憶體機器上,處理併發請求可達200萬”。

 

 nginx負載均衡?

       通信協議支持:nginx負載均衡主要是對七層網路通信模型中的第七層應用層上的http、https進行支持。同時nginx更新版本也在逐步對Websocket、SPDY等協議作出支持。

nginx是以反向代理的方式進行負載均衡的。反向代理(Reverse Proxy)方式是指以代理伺服器來接受Internet上的連接請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給Internet上請求連接的客戶端,此時代理伺服器對外就表現為一個伺服器。(為了理解反向代理,這裡插播一條什麼是正向代理:正向代理指的是,一個位於客戶端和原始伺服器之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。)

       這裡再插播一條實現負載均衡的技術的方式有哪些:硬體層面有F5負載均衡器,網路層層面有LVS(Linux Virtual Server),應用層層面就是nginx、Haproxy等。

       nginx實現負載均衡的分配策略有很多,被編進nginx內核的策略有輪詢和ip_hash,第三方的有fair、url_hash等。這裡主要對內核策略進行介紹。

1.輪詢

  a)none(預設輪詢):upstream按照輪詢(預設)方式進行負載,每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。雖然這種方式簡便、成本低廉。但缺點是:可靠性低和負載分配不均衡。

  b)weight(按權重輪詢):指定輪詢幾率,weight和訪問比率成正比,用於後端伺服器性能不均的情況。 

server 192.168.61.22 weight = 6; # 60% 請求
server 192.168.61.23 weight = 4; # 40% 請求

 

2.ip_hash

  每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。配置只需要在upstream中加入"ip_hash;"即可。

upstream tomcats {
      ip_hash;
      server 127.0.0.1:9001;
      server 127.0.0.1:9002;
}

 

3.fair(第三方)

  按後端伺服器的響應時間來分配請求,響應時間短的優先分配。與weight分配策略類似。

upstream tomcats {
      server 127.0.0.1:9001;
      server 127.0.0.1:9002;
      fair;
}

 

4.url_hash(第三方)

  和IP哈希類似,只不過針對請求的url進行hash(基於緩存的server,頁面靜態化)。

 

附:Nginx配置文件nginx.conf中文詳解


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【轉載自】:http://blog.csdn.net/qq7342272/article/details/7940741 java運行時異常是可能在java虛擬機正常工作時拋出的異常。 java提供了兩種異常機制。一種是運行時異常(RuntimeExepction),一種是檢查式異常(checked ...
  • 多態成員變數的特點: 運行結果: 圖解: java中,子類的實例對象在堆記憶體中的存放應如圖所示,既有子類的成員變數,又有父類的成員變數; 同一對象可以有多態,當父類變數指向時,從A入口進入,可以訪問父類的所有成員變數;當子類變數指向時,從B入口進入,可以訪問子類的所有成員變數和父類非同名變數; ja ...
  • QThread Qt Gui frozen 未響應 阻塞 processEvents ...
  • 程式開發中,經常遇到一條記錄有多個狀態位,比如一條商品,他屬於熱門,新品,特賣。我們的資料庫如何設計呢? 一般有幾種方法 (1)建立關聯表 關聯表欄位:關係Id,商品Id,屬性Id 查詢:使用關聯表的方式,查詢某屬性的商品。 程式:寫入時,寫商品表和關聯表; (2)將多個屬性存在一個欄位中,用|分割 ...
  • 最近看到有部分招聘信息,要求應聘者說一下分散式系統架構的思路。今天早晨正好有些時間,我也把我們實際在.net方面網站架構的演化路線整理一下,只是我自己的一些想法,歡迎大家批評指正。 首先說明的是.net下開源內容較少,並且也不是做並行資料庫等基礎服務,因此在這裡什麼Hadoop、Spark、ZooK ...
  • StatementHandler 語句處理器,主要負責語句的創建、參數的設置、語句的執行。不負責結果集的處理。 BaseStatementHandler 實現公共部分,具體差異通過抽象方法,留給子類實現。 首先語句級別的配置,其次配置文件中的配置。 首先語句級別的配置,其次配置文件中的配置。 Sta ...
  • Web前端技術的發展使得MVVM模式相比WPF時代更加流行,然而老舊的WinForms仍然占據桌面開發技術很大一部分,現在SOD框架提供了WinForms MVVM支持,老壇泡新菜,讓WinForms煥發新春。 ...
  • 數據存儲重要性: 數據是企業最重要的財產; 數據可靠性是企業的命根,一定要保證。 單機存儲原理: 存儲引擎:存儲系統的發動機,它決定存儲系統的功能和性能; 引擎類型:哈希存儲引擎、B樹存儲引擎、LSM存儲引擎 哈希存儲引擎:基於哈希表結構 :數組+鏈表;支持Create\Update\Delete\... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...