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 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的nginx源码阅读(一).综述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷刺激项目身高限制
- 下一篇: nginx源码阅读(二).初始化:mai