面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

一、前言


本篇是我學習Nginx的一些筆記,主要內容講述了一些瞭解Nginx需要的基本概念。
然後探討一下Nginx的模塊化的組織架構,以及各個模塊的分類、工作方式、職責和提供的相關指令。
主要達到以下目的:

  1. 瞭解Nginx的大概運行原理

  2. 瞭解Nginx的基本概念

  3. 知道怎麼看官方文檔。

關於Nginx

Nginx是一款面向性能設計的HTTP服務器,能反向代理HTTP,HTTPS和郵件相關(SMTP,POP3,IMAP)的協議鏈接。並且提供了負載均衡以及HTTP緩存。
它的設計充分使用異步事件模型,削減上下文調度的開銷,提高服務器併發能力。
採用了模塊化設計,提供了豐富模塊的第三方模塊。
所以關於Nginx,有這些標籤:「異步」「事件」「模塊化」「高性能」「高併發」「反向代理」「負載均衡」

二、基本概念


進程模型

Nginx的進程是使用經典的「Master-Worker」模型。
Nginx在啓動後,會有一個master進程和多個worker進程。
master進程主要用來管理worker進程,包含:接收來自外界的信號,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程退出後(異常情況下),會自動重新啓動新的worker進程。
worker進程主要處理基本的網絡事件,多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。需要注意的是,每個Worker只有主線程,即所謂的「單線程」。
一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。
worker進程的個數是可以設置的,一般會設置與機器cpu核數一致,這裏面的原因與nginx的進程模型以及事件處理模型是分不開的。nginx爲了更好的利用多核特性,提供了cpu親緣性的綁定選項,我們可以將某一個進程綁定在某一個核上,這樣就不會因爲進程的切換帶來cache的失效。更多的worker數,只會導致進程來競爭cpu資源。

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

事件模型

Nginx對於事件,以「異步非阻塞」方式來實現。
異步和非異步,阻塞和非阻塞是兩組不同的概念,前者更多對於應用程序而言,而後者更多對於CPU來說:

  1. 異步:執行一個動作之後,可以去操作別的操作,然後等待通知再回來執行剛纔沒執行完的操作。

  2. 非異步(同步):執行一個操作之後,等待結果,然後才繼續執行下面的操作。

  3. 阻塞:給CPU傳達任務之後,一直等待CPU處理完畢(即使會產生I/O),然後才執行下面操作。

  4. 非阻塞:給CPU傳達任務之後,繼續處理後面的操作,隔段時間再來詢問之前的操作是否完成。這樣的及過程也叫「輪詢」

Nginx的「異步非阻塞」方式,具體到系統調用的話,就是像select/poll/epoll/kqueue這樣的系統調用。它們提供了一種機制,讓你可以同時監控多個事件,調用他們是阻塞的,但可以設置超時時間,在超時時間之內,如果有事件準備好了,就返回。

epoll是在Linux上關於事件的實現,而kqueue是OpenBSD或FreeBSD操作系統上採用類似epoll的事件模型。
所以重點講解一下epoll的模型:

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

該方案給是Linux下效率最高的I/O事件通知機制,在進入輪詢的時候如果沒有檢查到I/O事件,將會進入休眠,直到事件將它喚醒。它是真實利用了事件通知、執行回調的方式,而不是遍歷查詢,所以不會浪費CPU,執行效率較高。

反向代理

要了解「反向代理」,首先需要知道什麼是「代理服務器」和「正向代理」

代理服務器

在網絡中,客戶端發起一個請求,獲取服務器端的資源。它們之間並不是建立一條直接的通道,而是被代理服務器所轉發。
代理服務器作爲網絡中的媒介將互聯網上獲取的資源返回給相關的客戶端。
我們通常所說的代理,一般都指的是「正向代理」,是相對於客戶端來說的。
比方說我鏈接了一個***,我訪問Google的時候,客戶端發起的請求到了***,***幫忙轉發請求Google的服務器,然後把Google響應返回給客戶端。這個過程,***就充當了「正向代理服務器」的角色。

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

反向代理

和「正向代理」不同,「反向代理」的說法面向於服務器端。一個客戶端請求來到代理服務器,代理服務器根據客戶端的請求的不同而把請求轉發到不同的服務器,這個過程在「負載均衡」中,也會發生兩個一樣的請求,會轉發到完全不一樣的服務器中的情況。
「正向代理」是「負載均衡」實現的前提,正因爲代理服務器有了解析請求,分發請求的能力,才能實現負載均衡,降低每一臺服務器的負荷。
利用「反向代理」,除了實現負載均衡,還可以實現諸如:SSL加密,靜態內容緩存,gzip壓縮,減速上傳,安全等功能

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

負載均衡

負載均衡(Load balancing)是一種計算機網絡技術,用來在多個服務器中分配負載,以達到最佳化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。
使用帶有負載均衡的多個服務器組件,取代單一的組件,可以通過冗餘提高可靠性。負載平衡服務的實現可以通過軟件和硬件來實現。
負載均衡的分發,一般都會有多套算法來處理分發問題。

連接 Connection

在nginx中connection就是對tcp連接的封裝,其中包括連接的socket,讀事件,寫事件。利用nginx封裝的connection,我們可以很方便的使用nginx來處理與連接相關的事情,比如,建立連接,發送與接受數據等。
而nginx中的http請求的處理就是建立在connection之上的,所以nginx不僅可以作爲一個web服務器,也可以作爲郵件服務器。
當然,利用nginx提供的connection,我們可以與任何後端服務打交道。

最大連接數

在nginx中,每個進程會有一個連接數的最大上限,這個上限與系統對fd的限制不一樣。
在操作系統中,通過ulimit -n,我們可以得到一個進程所能夠打開的fd的最大數,即nofile,因爲每個socket連接會佔用掉一個fd,所以這也會限制我們進程的最大連接數,當然也會直接影響到我們程序所能支持的最大併發數,當fd用完後,再創建socket時,就會失敗。
nginx通過設置worker_connectons來設置每個進程支持的最大連接數。如果該值大於nofile,那麼實際的最大連接數是nofile,nginx會有警告。
nginx在實現時,是通過一個連接池來管理的,每個worker進程都有一個獨立的連接池,連接池的大小是worker_connections。這裏的連接池裏面保存的其實不是真實的連接,它只是一個worker_connections大小的一個ngx_connection_t結構的數組。並且,nginx會通過一個鏈表free_connections來保存所有的空閒ngx_connection_t,每次獲取一個連接時,就從空閒連接鏈表中獲取一個,用完後,再放回空閒連接鏈表裏面。所以,一個nginx能建立的最大連接數:worker_connections * worker_processes
如果當nginx作爲反向代理的話,因爲一個請求nginx要建立客戶端和服務器的請求,所以最大連接數是:worker_connections * worker_processes / 2

請求 Request

在nginx中我們指http請求,具體到nginx中的數據結構是ngx_http_request_t
它是對一個http請求的封裝,nginx通過ngx_http_request_t來保存解析請求與輸出響應相關的數據。
一個http請求,包含請求行、請求頭、請求體、響應行、響應頭、響應體。一般性的網絡請求處理過程是:

  1. 客戶端會發送請求過來。
  2. 然後我們讀取一行數據,分析出請求行中包含的method、uri、http_version信息。
  3. 然後再一行一行處理請求頭,並根據請求method與請求頭的信息來決定是否有請求體以及請求體的長度,然後再去讀取請求體。
  4. 得到請求後,我們處理請求產生需要輸出的數據,然後再生成響應行,響應頭以及響應體。
  5. 在將響應發送給客戶端之後,一個完整的請求就處理完了。

而nginx處理請求的時候會有一些小小的區別,比如,當請求頭讀取完成後,就開始進行請求的處理了。

Nginx處理請求過程

nginx處理一個請求的抽象概念過程:

  1. request 請求進來
  2. 初始化HTTP Request, 生成 HTTP Request對象
  3. 處理請求頭
  4. 處理請求體
  5. 調用與此請求關聯的handler(根據你URL或者Location配置)
  6. 依次調用各phase handler進行處理
    a. 獲取location配置
    b. 產生適當的響應
    c. 發送response header
    d. 發送response body

三、基本數據


結構nginx的作者爲追求極致的高效,自己實現了很多頗具特色的nginx風格的數據結構以及公共函數。比如,nginx提供了帶長度的字符串,根據編譯器選項優化過的字符串拷貝函數ngx_copy等。

ps: 下橫線分割是C語言的變量名風格

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

四、配置


nginx的配置系統由一個主配置文件和其他一些輔助的配置文件構成。這些配置文件均是純文本文件,全部位於nginx安裝目錄下的conf目錄下。
指令由nginx的各個模塊提供,不同的模塊會提供不同的指令來實現配置。
指令除了Key-Value的形式,還有作用域指令。
nginx.conf中的配置信息,根據其邏輯上的意義,對它們進行了分類,也就是分成了多個作用域,或者稱之爲配置指令上下文。不同的作用域含有一個或者多個配置項。

下面的這些上下文指令是用的比較多:

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

五、模塊


nginx將各功能模塊組織成一條鏈,當有請求到達的時候,請求依次經過這條鏈上的部分或者全部模塊,進行處理。每個模塊實現特定的功能。例如,實現對請求解壓縮的模塊,實現SSI的模塊,實現與上游服務器進行通訊的模塊,實現與FastCGI服務進行通訊的模塊。
模塊分三類:

  1. 核心模塊
  2. 輔助模塊
  3. 第三方模塊

根據官方文檔排版,輔助模塊還分了以下幾類:

  1. http
  2. mail
  3. stream

而根據其功能可以分成這幾大類:

1.handler模塊
此類型的模塊也被直接稱爲handler模塊。主要負責處理客戶端請求併產生待響應內容,比如ngx_http_static_module模塊,負責客戶端的靜態頁面請求處理並將對應的磁盤文件準備爲響應內容輸出。

2.filter模塊
過濾響應頭和內容的模塊,可以對回覆的頭和內容進行處理。它的處理時間在獲取回覆內容之後,向用戶發送響應之前。

3.upstream模塊
upstream模塊實現反向代理的功能,將真正的請求轉發到後端服務器上,並從後端服務器上讀取響應,發回客戶端。upstream模塊是一種特殊的handler,只不過響應內容不是真正由自己產生的,而是從後端服務器上讀取的。

4.load balance模塊
負載均衡模塊,實現特定的算法,在衆多的後端服務器中,選擇一個服務器出來作爲某個請求的轉發服務器

六、總結


講述了Nginx的一些基本概念。
Nginx是線程模型是Master-Worker模式的,每個worker是單線程的,也就是處理請求是單線程處理的。而單線程併發的事件模型是「異步非阻塞I/O」模型。
並且講述了「反向代理」「負載均衡」的概念,這是nginx能高性能處理高併發的原因之一。
Nginx對於網絡請求是有Connection和Request的概念和封裝的。
Nginx的源碼組織架構是模塊化的,不同的模塊實現不一樣的職責,然後它們被連接起來一起幹一件大事,知道模塊有哪些分類,可以讓我們知道怎麼查找官方文檔。
在沒有看過有哪些指令,哪些指令有什麼功能之前,是不能完全知道nginx提供什麼樣的功能的,那就抱着,那就抱着「能想到的別人都想到並實現了」的想法來使用nginx吧。Nginx作爲一個代理服務,在中間想做什麼都可以啦。

福利小彩蛋

精心整理300頁Nginx文檔助你成就完成高薪夢!

由於平臺文章篇幅限制,細節內容過多,所以只把部分知識點截圖出來粗略的介紹,每個小節點裏面都有更細化的內容!,需要獲取Nginx實戰核心知識點的pdf文檔可以關注我的公衆號:【風平浪靜如碼】回覆關鍵字:“Nginx”免費獲取

一、Nginx基本介紹以及服務安裝與配置

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

二、Nginx基本配置、安裝、優化

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

三、Nginx模型開發

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

四、Nginx核心模塊

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

五、Nginx的標準HTTP模塊

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

由於平臺文章篇幅限制,細節內容過多,所以只把部分知識點截圖出來粗略的介紹,每個小節點裏面都有更細化的內容!,需要獲取Nginx實戰核心知識點的pdf文檔可以關注我的公衆號:【風平浪靜如碼】回覆關鍵字:“Nginx”免費獲取

總目錄

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

細分段落

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

這裏就不一一列舉了

需要獲取Nginx實戰核心知識點的pdf文檔可以關注我的公衆號:【風平浪靜如碼】回覆關鍵字:“Nginx”免費獲取

共同進步,學習分享

歡迎大家關注我的公衆號【風平浪靜如碼】,海量Java相關文章,學習資料都會在裏面更新,整理的資料也會放在裏面。

覺得寫的還不錯的就點個贊,加個關注唄!點關注,不迷路,持續更新!!!

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

面試害怕被問Nginx?一文帶你解析Nginx基本概念!(附資料分享)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章