Nginx架構

 nginx在啓動後,在unix系統中會以daemon的方式在後臺運行,後臺進程包含一個master進程和多個worker進程。html

  固然nginx也是支持多線程的方式的,只是咱們主流的方式仍是多進程的方式,也是nginx的默認方式。nginx

  master進程主要用來管理worker進程,包含:接收來自外界的信號,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程退出後(異常狀況下),會自動從新啓動新的worker進程。c++

  worker進程則是處理基本的網絡事件。多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。web

  worker進程的個數是能夠設置的,通常咱們會設置與機器cpu核數一致。更多的worker數,只會致使進程來競爭cpu資源了,從而帶來沒必要要的上下文切換。並且,nginx爲了更好的利用多核特性,具備cpu綁定選項,咱們能夠將某一個進程綁定在某一個核上,這樣就不會由於進程的切換帶來cache的失效。apache

  驚羣現象

  每一個worker進程都是從master進程fork過來。在master進程裏面,先創建好須要listen的socket以後,而後再fork出多個worker進程,這樣每一個worker進程均可以去accept這個socket(固然不是同一個socket,只是每一個進程的這個socket會監控在同一個ip地址與端口,這個在網絡協議裏面是容許的)。通常來講,當一個鏈接進來後,全部在accept在這個socket上面的進程,都會收到通知,而只有一個進程能夠accept這個鏈接,其它的則accept失敗。編程

相對於線程,採用進程的優勢

  進程之間不共享資源,不須要加鎖,因此省掉了鎖帶來的開銷。服務器

  採用獨立的進程,可讓互相之間不會影響,一個進程退出後,其它進程還在工做,服務不會中斷,master進程則很快從新啓動新的worker進程。網絡

  編程上更加容易。數據結構

  多線程的問題

  而多線程在多併發狀況下,線程的內存佔用大,線程上下文切換形成CPU大量的開銷。想一想apache的經常使用工做方式(apache也有異步非阻塞版本,但因其與自帶某些模塊衝突,因此不經常使用),每一個請求會獨佔一個工做線程,當併發數上到幾千時,就同時有幾千的線程在處理請求了。這對操做系統來講,是個不小的挑戰,線程帶來的內存佔用很是大,線程的上下文切換帶來的cpu開銷很大,天然性能就上不去了,而這些開銷徹底是沒有意義的。多線程

異步非阻塞

  異步的概念和同步相對的,也就是否是事件之間不是同時發生的。

  非阻塞的概念是和阻塞對應的,阻塞是事件按順序執行,每一事件都要等待上一事件的完成,而非阻塞是若是事件沒有準備好,這個事件能夠直接返回,過一段時間再進行處理詢問,這期間能夠作其餘事情。可是,屢次詢問也會帶來額外的開銷。

  總的來講,Nginx採用異步非阻塞的好處在於:

  • 不須要建立線程,每一個請求只佔用少許的內存

  • 沒有上下文切換,事件處理很是輕量

nginx的源碼目錄結構(100%)

nginx的優秀除了體如今程序結構以及代碼風格上,nginx的源碼組織也一樣簡潔明瞭,目錄結構層次結構清晰,值得咱們去學習。nginx的源碼目錄與nginx的模塊化以及功能的劃分是緊密結合,這也使得咱們能夠很方便地找到相關功能的代碼。這節先介紹nginx源碼的目錄結構,先對nginx的源碼有一個大體的認識,下節會講解nginx如何編譯。

下面是nginx源碼的目錄結構:

.
├── auto            自動檢測系統環境以及編譯相關的腳本
│   ├── cc          關於編譯器相關的編譯選項的檢測腳本
│   ├── lib         nginx編譯所須要的一些庫的檢測腳本
│   ├── os          與平臺相關的一些系統參數與系統調用相關的檢測
│   └── types       與數據類型相關的一些輔助腳本
├── conf            存放默認配置文件,在make install後,會拷貝到安裝目錄中去
├── contrib         存放一些實用工具,如geo配置生成工具(geo2nginx.pl)
├── html            存放默認的網頁文件,在make install後,會拷貝到安裝目錄中去
├── man             nginx的man手冊
└── src             存放nginx的源代碼
    ├── core        nginx的核心源代碼,包括經常使用數據結構的定義,以及nginx初始化運行的核心代碼如main函數
    ├── event       對系統事件處理機制的封裝,以及定時器的實現相關代碼
    │   └── modules 不一樣事件處理方式的模塊化,如select、poll、epoll、kqueue等
    ├── http        nginx做爲http服務器相關的代碼
    │   └── modules 包含http的各類功能模塊
    ├── mail        nginx做爲郵件代理服務器相關的代碼
    ├── misc        一些輔助代碼,測試c++頭的兼容性,以及對google_perftools的支持
    └── os          主要是對各類不一樣體系統結構所提供的系統函數的封裝,對外提供統一的系統調用接口
相關文章
相關標籤/搜索