1. 程式人生 > >nginx原始碼閱讀(一).綜述

nginx原始碼閱讀(一).綜述

前言

nginx作為一款開源的輕量級高效能web伺服器,是非常值得立志從事服務端開發方向的人學習的。現今nginx的最新版本是nginx-1.13.6,程式碼量也日漸龐大,但是由於其核心思想並沒改變,為了降低閱讀難度,我選擇的是nginx-1.0.15版本,並且由於時間和水平有限,重點關注的是nginx的啟動以及程序模型、事件模組中的epoll模組、負載均衡以及整體的框架等方面。
這裡先推薦兩本有關nginx的書籍:《深入理解Nginx》、《深入剖析Nginx》,後者已經絕版了,可以去網上找pdf閱讀。

不過建議主要還是以程式碼為主,書籍為輔。

下面簡單的介紹一下後面會進行分析的各塊。

nginx的啟動

nginx整個啟動流程圍繞著ngx_cycle_t結構體進行操作。要知道nginx是高度模組化以及非常依賴配置檔案,大部分功能都需要配置檔案的配置才能進行。在啟動工作中,需要做的主要工作就是讀取配置檔案,然後將各模組感興趣的配置項儲存到各結構體中,根據配置檔案對所有的模組進行初始化,接著啟動各程序,準備進行工作。

nginx的多程序模型

另一款比較常用的web伺服器就是apache,它最大的特點就是穩定,所以相比於nginx複雜很多也臃腫很多。nginx最大的特點就是強調效能,在後面展示其原始碼時也可以看到它為了追求效能所做的一些工作。
nginx之所以高效的主要原因是它採用的非同步非阻塞多程序模型,並且一般程序的個數與cpu核心數相同,一個master程序,多個worker程序,可能還會有cache loader以及cache manager程序,多個連線對應一個worker程序,master程序主要負責管理worker程序以及啟動/停止服務、重新讀取配置檔案、平滑升級等功能,而cache程序則當開啟了快取功能才會出現。

apache則通常採用同步多程序模型,每個連線對應一個程序,apache採用的這種模型,當請求較多時,程序也隨之變多,cpu資源耗費在程序間切換非常昂貴(畢竟要切換程序的上下文以及過載快取等),而nginx因為程序數固定且很少,並且由於cpu是多核心的,可以同時執行多個不同的程序/執行緒,每個程序的資源都互相獨立,因此切換時無需進行上下文的切換。那麼為什麼不採用多執行緒結構呢,不是說執行緒間的切換比程序間的切換更迅速嗎,若cpu是單核的的確如此,但是當每個cpu核心執行一個執行緒的時候,由於執行緒間需要共享資源,所以這些資源必須從一個核心拷貝到另外一個核心,反觀多程序就不需要。因此在cpu為多核的情況下,多執行緒在效能上反而可能不如多程序。

關於同步和非同步的區別,可以簡單的理解為,採用同步模型,cpu會阻塞等待請求的完成,而非同步非阻塞時,cpu不會阻塞等待,核心處理完之後再進行通知。

nginx的事件模組

nginx採用的是事件驅動機制來處理事件,不同的模組有各自己負責處理的事件,當一個事件發生時,相應的模組就會對該事件進行處理。對於一個web伺服器來說,使用者的請求其實就對應了一個tcp連線,也對應了讀/寫事件,nginx內部使用了連線池、記憶體池等機制提高效率,而nginx的事件模組中針對不同的I/O多路機制select、epoll、kqueue、eventport也編寫了不同的模組,這是為了能讓nginx在更多的作業系統上執行。在linux下,我們重點關注的就是epoll對應的模組,nginx對epoll提供的介面進行了封裝,並且將定時事件也整合到了其中。

負載均衡

nginx有兩處地方進行了負載均衡。一處是當大量的請求到來時,各個worker程序該如何分配這些請求,而不會造成其中某個worker程序超載,而另外的worker程序則空閒,nginx採用的是負載均衡鎖,當一個worker程序處理的連線數大於某個值時,就不再接受新的連線。

還有一處是當nginx作為反向代理伺服器執行時,會將客戶端的請求轉發給上游伺服器,若上游伺服器有多個,則需要選擇將請求轉發給哪個上游伺服器,一直轉給一個造成其中某個伺服器過載,但是其餘空閒肯定是不對。nginx官方提供了加權輪詢、IP雜湊這兩種負載均衡的方法。加權輪詢簡單的來說就是計算各個上游伺服器的權值,然後選擇權值最高的伺服器處理請求;IP雜湊負載均衡策略則會使用客戶端的ip地址作為雜湊的key來決定選擇伺服器群中某臺伺服器來處理客戶端的請求,這種方式可以確保來自同一臺客戶端的請求會分發到同一臺伺服器上,除非這臺伺服器處於不可用狀態。

除了這兩種方法之外,還有一致雜湊、fair等方法,不過都是第三方模組。

整體架構

nginx即可以處理靜態請求也可以處理動態請求,並且還可以作為反向代理伺服器。但是它處理動態請求的效果並不如apache好,因此一般作為靜態web伺服器和反向代理伺服器。整體的架構引用《深入剖析Nginx》書中的圖:
這裡寫圖片描述

小結

本小節簡單的介紹了一下後面要展開分析的各塊,接下來正式開始分析nginx的啟動流程。

--------------------- 作者:Move_now 來源:CSDN 原文:https://blog.csdn.net/Move_now/article/details/78373017?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!