1. 程式人生 > >《深入理解Nginx》讀書筆記1:架構設計

《深入理解Nginx》讀書筆記1:架構設計

Nginx設計目標及優點

1、跨平臺的Web伺服器;

程式碼儘可能的與平臺無關,封裝呼叫多個主流作業系統的高效API提高效能。

2、高效響應請求;

單次響應更快,高峰期響應更快。支援高併發請求的同時保持高效服務。

3、高擴充套件性;

設計極具擴充套件性,由多個不同功能、層次、型別且耦合度極低的模組組成。開發一個新的HTTP模組時,輕鬆使用核心模組和大量已有的HTTP過濾模組。

4、高可靠性;

核心架構程式碼設計優秀,模組設計簡單;常用模組穩定,每個worker程序相對獨立,master程序在1個worker程序出錯時可以快速拉起新的worker子程序提供服務。

5、低記憶體消耗;

1萬個非活躍HTTP Keep-Alive連線僅消耗2.5MB記憶體。架構一直在考慮如何使得記憶體消耗更少。

6、單機支援10萬以上的併發連線;

非同步非阻塞處理連線,併發連線上限取決於記憶體。

7、熱部署;

master管理程序與worker工作程序分離。7X24小時不間斷服務的前提下升級Nginx可執行檔案,更新配置項,更換日誌檔案等。
8、最自由的BSD許可協議;

Web伺服器設計中的關鍵約束

1、效能

(1)網路效能
不同負載下Web伺服器在網路通訊上的吞吐量。頻寬是上限。
要求高併發場景下,仍可以保持較高網路吞吐量,而不是在一定連線數量級時,伺服器CPU等資源大量消耗在程序間切換、休眠等待等其他活動上,導致吞吐量大幅下降。
(2)單次請求的延遲性
延遲性:指的是伺服器初次接收到一次使用者請求直至返回響應之間持續的時間。
Web伺服器在設計時應考慮在高併發下如何保持平均時延性,使其不要上升太快。
(3)網路效率
使用網路的效率。比如提高網路效率的方法有:長連線代替短連線以減少建立關閉連線帶來的網路互動,使用壓縮演算法增加相同吞吐量下的資訊攜帶量,使用快取減少網路互動次數等。

2、可伸縮性

指的是架構可以通過新增元件來提升服務,或允許元件之間具有互動功能。可通過簡化元件、降低元件間的耦合度、將服務分散到多個元件等方法改善可伸縮性。受到元件間的互動頻率以及元件對單個請求是同步還是非同步方式處理等條件約束。

3、簡單性

元件的簡單程度,越簡單越容易理解實現,容易被驗證測試。通過分離關注點原則設計元件;整體架構來說,通過使用通用性原則,統一元件的介面,減少架構的變數。

4、可修改性

指的是當前架構下對系統功能做出修改的難易程度。還包括動態可修改性(熱部署)。
(1)可進化性
表示我們在修改一個組建時,對其他元件的負面影響程度。又可分為靜態進化和動態進化。靜態進化主要依賴於架構的設計是否足夠抽象;動態進化與整個服務設計相關。
(2)可擴充套件性
表示將一個新的功能新增到系統中的能力(不影響其他功能)。分靜態擴充套件和動態擴充套件。
(3)可定製性
表示可臨時性的重新規定一個元件或其他框架元素的特性,提供一種非常規服務的能力。如果元件是可定製的,使用者能夠擴充套件服務,不會對其他客戶產生影響。這種風格會提高簡單性和可擴充套件性,只會實現常用功能,不常用功能由使用者重新定製使用。複雜性降低,更容易擴充套件。
(4)可配置性
指的是服務部署後對服務提供的配置檔案修改,提供不同的功能。
(5)可重用性
指的是功能元件不被修改的情況下,可以在其他應用中重用的程度。

5、可見性

關鍵元件執行情況可被監控的程度。

6、可移植性

指的是服務可以跨平臺執行。

7、可靠性

服務出現部分故障時,一個架構容易受到系統層面故障影響的程度。以下方法可提高可靠性:避免單點故障、增加冗餘、允許監視、用可恢復的動作縮小故障範圍等。

Nginx的架構設計

1、優秀的模組化設計

除了少量核心程式碼,其他一切皆為模組。
(1)所有模組都遵循同樣的ngx_module_t介面設計規範,高度抽象;
(2)模組介面簡單,靈活性高,只涉及模組的初始化、退出、對配置項的處理;靈活性,動態可修改性:介面中的ctx成員為void*指標,可指向任何資料,一般表示某種型別的模組所具備的通用性介面;
(3)配置模組的設計:最底層模組,指導著所有模組以配置項為核心提供功能。是所有模組的基礎。提供了高可配置性、高可擴充套件性、高可定製性、高可伸縮性;
(4)核心模組介面的簡單化:6個,分別是ngx_core_module、ngx_errlog_module、ngx_events_module、ngx_openssl_module、ngx_http_module、ngx_mail_module,使得非模組化的框架程式碼只關注於如何呼叫6個核心模組;
(5)多層次、多類別的模組設計
官方Nginx共有五大型別的模組:核心模組、配置模組、事件模組、HTTP模組、mail模組。
框架程式碼定義了配置模組和核心模組,配置模組實現了基本的配置項解析功能。框架會呼叫核心模組,其他模組不與框架打交道。
事件模組、HTTP模組、mail模組共性:核心模組中各有一個模組作為其代言人,同類模組中有一個作為核心業務和管理功能的模組;
事件模組:
由核心模組ngx_events_module定義,由ngx_events_core_module載入操作;
HTTP模組:
由核心模組ngx_http_module定義、載入,由ngx_events_core_module分配處理工作由哪個具體http模組負責;
mail模組:與http模組類似。

2、事件驅動架構

多個事件發生源產生事件,一個或多個事件收集器收集分發事件,多個事件處理器註冊消費感興趣的事件。事件分發和消費是有序的。
優點:提高了網路效能和吞吐量,降低使用者感知請求時延;缺點:每個事件消費者不能有阻塞行為,否則會長時間佔用事件分發者程序導致其他事件得不到及時響應。加大了開發難度。

3、請求的多階段非同步處理

一個請求的處理過程按照事件的觸發方式分為多個階段,每個階段可以由事件收集、分發器觸發。
劃分方式:
(1)將阻塞程序的方法按照相關觸發事件分解為兩個階段:呼叫並交給事件分發器階段,返回結果處理階段;
(2)按時間分解為多個階段的方法呼叫:特定事件(如網路事件)或定時器檢查呼叫;
(3)定時器檢查代替迴圈檢查標誌;
(4)使用獨立的程序執行阻塞方法;

4、管理程序、多工作程序設計

1個master管理程序,多個worker工作程序,1個可選的cache manager程序和1個可選的cache loader程序。
優點:
(1)利用多核系統的併發處理能力
(2)負載均衡:通過程序間通訊實現負載均衡,請求分配到負載較勁的worker程序
(3)管理程序負責監控工作程序的狀態,負責管理其行為

5、平臺無關的程式碼實現

儘量減少使用與作業系統平臺相關的程式碼,與作業系統相關的系統呼叫上分別針對各個系統都有獨立實現,造就了可移植性,實現了對主流作業系統的支援。

6、記憶體池的設計

為了避免出現記憶體碎片、減少向系統申請記憶體的次數、降低各模組的開發複雜性,設計了簡單的記憶體池。優點:把多次向系統申請記憶體的操作整合成一次。

7、使用統一管道過濾器模式的HTTP過濾模組

過濾模組有統一介面,都按照configure執行時決定的順序組成流水線式的加工HTTP響應中心,每個模組完全獨立,處理輸入端接收的資料,並由輸出端傳遞給下一個模組。增量的處理資料。

8、其他使用者模組

其他模組輔助改進了Nginx。

相關推薦

深入理解Nginx讀書筆記1架構設計

Nginx設計目標及優點 1、跨平臺的Web伺服器; 程式碼儘可能的與平臺無關,封裝呼叫多個主流作業系統的高效API提高效能。 2、高效響應請求; 單次響應更快,高峰期響應更快。支援高併發請求的同時保持高效服務。 3、高擴充套件性; 設計

深入理解JVM讀書筆記虛擬機器類載入機制

一、概述      虛擬機器把描述類的資料從class檔案載入到記憶體,並對資料進行校驗、轉換解析和初始化。最終形成可以被虛擬機器最直接使用的java型別的過程就是虛擬機器的類載入機制。      與那些在編譯時需要進行連線工作的語

深入理解JVM讀書筆記垃圾收集器與記憶體分配策略

一、判斷物件死亡的兩種常用演算法:                在堆裡面存放著java世界中幾乎所有的例項物件,垃圾收集器在堆進行回收前,第一件事情就是要確定哪些物件還存活著,哪些已經死去。 1、引

深入理解Java虛擬機器讀書筆記(1)記憶體管理重要概念

深入理解Java虛擬機器讀書筆記(1):記憶體管理重要概念 說到Java記憶體管理,不得不先貼一張非常經典的圖,如下所示: 這些模組有些是執行緒私有的,有的則是執行緒共享的。下面一一對這些模組進行介紹: 一、程式計數器 程式計數器一塊比較小的記憶體空間,可以看做當前

深入理解Nginx第八章nginx基礎架構

Nginx效能指標 吞吐量(頻寬指的是單個連線的吞吐量) 單次請求的延遲性 網路效率:長連線減少建立、關閉連線的成本,壓縮演算法增加資訊攜帶量 Nginx  模組設計 NGX_CONF_MODULE:唯一隻有一個模組(ngx_conf_modul

《黑客攻防技術寶典Web實戰篇@第2版》讀書筆記1了解Web應用程序

金融 主機 border ket 邊界 輕量 在線 讀書 目的 讀書筆記第一部分對應原書的第一章,主要介紹了Web應用程序的發展,功能,安全狀況。 Web應用程序的發展歷程 早期的萬維網僅由Web站點構成,只是包含靜態文檔的信息庫,隨後人們發明了Web瀏覽器用來檢索和

14-《ARKit by Tutorials》讀書筆記1開始入門

說明 ARKit系列文章目錄 ARKit系列的新文章以後會採取限時收費策略,即先發佈於小專欄,收費訂閱可立即檢視全文;3~6個月後(時間由本人確定)免費釋出於掘金. 本文是Ray Wenderlich上《ARKit by Tutorials》的讀書筆記,主要講內容概要和讀後感 

深入理解JVM虛擬機器1JVM記憶體的結構與永久代的消失

所有的Java開發人員可能會遇到這樣的困惑?我該為堆記憶體設定多大空間呢?OutOfMemoryError的異常到底涉及到執行時資料的哪塊區域?該怎麼解決呢?其實如果你經常解決伺服器效能問題,那麼這些問題就會變的非常常見,瞭解JVM記憶體也是為了伺服器出現效能問題的時候可

大型網站技術架構 讀書筆記1 網站架構的演化和模式

網站架構的演化和模式   本讀書筆記涉及書中的第一章——大型網站架構演變和第二章——大型網站架構模式。在架構演變這塊,通過使用快取、叢集、分散式等手段實現網站架構的不斷升級以應對業務需要。架構模式則分別介紹了網站架構中的一些常用的模式。 一 大型網站架

深入理解Nginx筆記之 HTTP請求的11個處理階段

HTTP請求的11個處理階段 typedef enum { // 接收到完整的HTTP頭部後處理階段 NGX_HTTP_POST_READ_PHASE = 0, // 將請求URI與location表示式匹配前,修改URI,即重定

讀書筆記1《C++沉思錄》

    因為最近做圖形學方面的研究,要用C++。大一時的C++課學得一知半解,所以寫程式時經常碰壁,於是就想仔細學一下這門語言。去圖書館逛的時候發現了這本書,非常開心,便想拜讀一番。     今天讀完了第一篇——動機。這篇中,作者根據自身的經歷,講述了為什麼選擇C++。他並

讀書筆記_軟體架構設計 程式設計師向架構師轉型必備(第二版)溫昱

另讀:《一線架構師實踐指南》 感慨:大概看這本書對於現在的我來說還太早,經驗不足,先成為一個好的程式設計師吧……以後再回來看這本書 第1章 從程式設計師到架構師 第2章 解析軟體架構概念 Architecture架構,每個人的理解都不同。

深入理解mybatis原理》 MyBatis的架構設計以及例項分析

public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQ

深入理解mybatis原理》 MyBatis的架構設計以及例項分析

        MyBatis是目前非常流行的ORM框架,它的功能很強大,然而其實現卻比較簡單、優雅。本文主要講述MyBatis的架構設計思路,並且討論MyBatis的幾個核心部件,然後結合一個select查詢例項,深入程式碼,來探究MyBatis的實現。 一、MyBati

深入理解Nginx模組開發與架構解析 讀書筆記

Nginx的作用 當我們在設計高效能web伺服器的時候,我們第一選擇是使用Nginx,因為nginx對伺服器效能上的挖掘已經到了非常高的水平,Nginx採用了無阻塞分階段的事件驅動框架。當nginx不能那個完全實現我們的業務需求的時候,我們可以在Nginx後端搭建一個非ng

深入理解Nginx 模組開發與架構解析-陶輝 讀書筆記

前言 1. nginx是一個優秀的事件驅動框架,nginx非常適合開發在傳輸層以TCP對外提供服務的伺服器程式。基於nginx框架開發程式有5個優勢: * nginx將網路、磁碟及定時器等非同步事件的驅動都做了非常好的封裝,基於它開發將可以忽略這些事情處理的細節 * ng

讀書筆記-深入理解JVM虛擬機-1.OOM初探

-a 最大 xms stat new 理解 虛擬機 class 當前 Java堆OOM(Out-Of-Memory)異常 執行例如以下程序,爆出異常 java.lang.OutOfMemoryError: Java heap space /** * VM Ar

深入理解Nginx模組開發與架構解析

讀書筆記 第一部分         Nginx能幫我們做什麼 第1章 研究Nginx前的準備工作         1.1Nginx是什麼         1.2

深入理解Java虛擬機器讀書筆記1----Java記憶體區域與HotSpot虛擬機器物件

一 Java記憶體區域與HotSpot虛擬機器物件 1 Java技術體系、JDK、JRE?     Java技術體系包括:         · Java程式設計語言;   

深入理解Nginx 模組開發與架構解析》筆記之epoll事件模組

epoll Linux epoll Linux epoll工作模式 水平觸發LT 邊緣觸發ET       前者是預設的,可以處理阻塞和非阻塞套接字,後者只能處理非阻塞套接字。 Linux epoll原理       如上