作者:圖靈天宜 ? 2020月02月04日
一:什么是Nginx
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,并在一個BSD-like協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,供俄國大型的入口網站及搜索引擎Rambler(俄文:Рамблер)使用。事實上nginx的并發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、新浪、網易、騰訊等。
Nginx有什么優點
(1)更快
這表現在兩個方面:一方面,在正常情況下,單次請求會得到更快的響應;另一方面,在高峰期(如有數以萬計的并發請求),Nginx可以比其他Web服務器更快地響應請求。
(2)高擴展性
Nginx的設計極具擴展性,它完全是由多個不同功能、不同層次、不同類型且耦合度極低的模塊組成。因此,當對某一個模塊修復Bug或進行升級時,可以專注于模塊自身,無須在意其他。而且在HTTP模塊中,還設計了HTTP過濾器模塊:一個正常的HTTP模塊在處理完請求后,會有一串HTTP過濾器模塊對請求的結果進行再處理。這樣,當我們開發一個新的HTTP模塊時,不但可以使用諸如HTTP核心模塊、events模塊、log模塊等不同層次或者不同類型的模塊,還可以原封不動地復用大量已有的HTTP過濾器模塊。這種低耦合度的優秀設計,造就了Nginx龐大的第三方模塊,當然,公開的第三方模塊也如官方發布的模塊一樣容易使用。
Nginx的模塊都是嵌入到二進制文件中執行的,無論官方發布的模塊還是第三方模塊都是如此。這使得第三方模塊一樣具備極其優秀的性能,充分利用Nginx的高并發特性,因此,許多高流量的網站都傾向于開發符合自己業務特性的定制模塊。
(3)高可靠性
高可靠性是我們選擇Nginx的最基本條件,因為Nginx的可靠性是大家有目共睹的,很多家高流量網站都在核心服務器上大規模使用Nginx。Nginx的高可靠性來自于其核心框架代碼的優秀設計、模塊設計的簡單性;另外,官方提供的常用模塊都非常穩定,每個worker進程相對獨立,master進程在1個worker進程出錯時可以快速“拉起”新的worker子進程提供服務。
(4)低內存消耗
一般情況下,10 000個非活躍的HTTP Keep-Alive連接在Nginx中僅消耗2.5MB的內存,這是Nginx支持高并發連接的基礎。
(5)單機支持10萬以上的并發連接
這是一個非常重要的特性!隨著互聯網的迅猛發展和互聯網用戶數量的成倍增長,各大公司、網站都需要應付海量并發請求,一個能夠在峰值期頂住10萬以上并發請求的Server,無疑會得到大家的青睞。理論上,Nginx支持的并發連接上限取決于內存,10萬遠未封頂。當然,能夠及時地處理更多的并發請求,是與業務特點緊密相關的。
(6)熱部署
master管理進程與worker工作進程的分離設計,使得Nginx能夠提供熱部署功能,即可以在7×24小時不間斷服務的前提下,升級Nginx的可執行文件。當然,它也支持不停止服務就更新配置項、更換日志文件等功能。
快速增長的互聯網用戶群以及業內所有互聯網服務提供商越來越好的用戶體驗,都促使我們在大流量服務中用Nginx取代其他Web服務器。Nginx先天的事件驅動型設計、全異步的網絡I/O處理機制、極少的進程間切換以及許多優化設計,都使得Nginx天生善于處理高并發壓力下的互聯網請求,同時Nginx降低了資源消耗,可以把服務器硬件資源“壓榨”到極致。
Nginx的用處
1.Nginx 是一個很強大的高性能Web和反向代理服務器,它具有很多非常優越的特性: 在高連接并發的情況下,Nginx是Apache服務器不錯的替代品:能夠支持高達 50,000 個并發連接數的響應。下圖表示了nginx的工作架構圖。
2.Nginx作為負載均衡服務器:Nginx 既可以在內部直接支持Rails 和 PHP程序對外進行服務,也可以支持作為 HTTP代理服務器對外進行服務。Nginx采用C進行編寫,不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。 作為郵件代理服務器:Nginx同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作為郵件代理服務器)。
二:互聯網常見高并發架構
1:什么是高并發
高并發(High Concurrency)是互聯網分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時并行處理很多請求。
高并發相關常用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),并發用戶數等。
響應時間:系統對請求做出響應的時間
吞吐量:單位時間內處理的請求數量。
QPS:每秒響應請求數。
2:如何提升系統的并發能力
互聯網分布式架構設計,提高系統并發能力的方式,方法論上主要有兩種:垂直擴展(Scale Up)與水平擴展(Scale Out)。
垂直擴展:提升單機處理能力。垂直擴展的方式又有兩種:
增強單機硬件性能
提升單機架構性能
在互聯網業務發展非常迅猛的早期,如果預算不是問題,強烈建議使用“增強單機硬件性能”的方式提升系統并發能力,因為這個階段,公司的戰略往往是發展業務搶時間,而“增強單機硬件性能”往往是最快的方法。
不管是提升單機硬件性能,還是提升單機架構性能,都有一個致命的不足:單機性能總是有極限的。所以互聯網分布式架構設計高并發終極解決方案還是水平擴展。
水平擴展:只要增加服務器數量,就能線性擴充系統性能。
總結了幾個常見的互聯網分層架構圖:
常見互聯網分布式架構如上,分為:
客戶端層:典型調用方是瀏覽器browser或者手機應用APP
反向代理層:系統入口,反向代理
站點應用層:實現核心應用邏輯,返回html或者json
服務層:如果實現了服務化,就有這一層
數據-緩存層:緩存加速訪問存儲
數據-數據庫層:數據庫固化數據存儲
反向代理層的水平擴展,是通過“DNS輪詢”實現的:dns-server對于一個域名配置了多個解析ip,每次DNS解析請求來訪問dns-server,會輪詢返回這些ip。當nginx成為瓶頸的時候,只要增加服務器數量,新增nginx服務的部署,增加一個外網ip,就能擴展反向代理層的性能,做到理論上的無限高并發
站點層:
站點層的水平擴展,是通過“nginx”實現的。通過修改nginx.conf,可以設置多個web后端。當web后端成為瓶頸的時候,只要增加服務器數量,新增web服務的部署,在nginx配置中配置上新的web后端,就能擴展站點層的性能,做到理論上的無限高并發。
服務層:
站點層通過RPC-client調用下游的服務層RPC-server時,RPC-client中的連接池會建立與下游服務多個連接,當服務成為瓶頸的時候,只要增加服務器數量,新增服務部署,在RPC-client處建立新的下游服務連接,就能擴展服務層性能,做到理論上的無限高并發。如果需要優雅的進行服務層自動擴容,這里可能需要配置中心里服務自動發現功能的支持。
數據層:
在數據量很大的情況下,數據層(緩存,數據庫)涉及數據的水平擴展,將原本存儲在一臺服務器上的數據(緩存,數據庫)水平拆分到不同服務器上去,以達到擴充系統性能的目的。
互聯網分層架構中,各層次水平擴展的實踐又有所不同:
反向代理層可以通過“DNS輪詢”的方式來進行水平擴展;
站點層可以通過nginx來進行水平擴展;
服務層可以通過服務連接池來進行水平擴展;
數據庫可以按照數據范圍,或者數據哈希的方式來進行水平擴展。
各層實施水平擴展后,能夠通過增加服務器數量的方式來提升系統的性能,做到理論上的性能無限。