1. 程式人生 > >Nginx模型以及介紹

Nginx模型以及介紹

Nginx I/O模型

Nginx模型以及介紹


一: I/O(輸入輸出)介紹

系統調用:應用程序通過一些接口訪問內核

PIO:程序輸入輸出模型,CPU會參與

DMA:直接內存訪問,磁盤讀寫過程不需要CPU參與,CPU發送指令給DMA控制器,DMA控制器用來讀寫磁盤到內存中再返還給應用程序


同步/異步:關註的是消息的通知機制

同步:synchronous,當要去調用一個程序執行某個操作,調用者一直主動詢問被調用者是否完成,完成後才會繼續執行;

異步:asynchronous,被調用者通過通知機制主動告訴調用者是否完成,在被調用者運行的同時,可以進行其它工作;


阻塞/非阻塞:關註調用者在等待結果返回前所處的狀態

阻塞:當IO操作徹底完成後才能做別的事,沒有完成就要一直等待

非阻塞:在IO操作過程中,不影響調用者其它操作


同步阻塞:停下所有工作並且不斷去詢問IO操作是否完成

異步阻塞:在IO操作的同時,一直等待IO操作結果的返回訊息,無需主動不斷詢問

同步非阻塞:在IO操作的同時做別的操作,但會不斷詢問IO操作是否完成

異步非阻塞:一邊做其他操作,一邊等待IO操作的返回訊息,當返回訊息回來的時候,再去處理


二 I/O模型(內核工作模式):

阻塞型、非阻塞型、復用型、信號驅動型、異步

同步阻塞IO模型:

在應用程序未接收到內核已經準備完畢的返回通知時會一直等待內核準備完畢


同步非阻塞IO模型:

應用程序繼續工作的同時還不斷的去詢問內核是否準備完畢,當內核從磁盤中調用出數據的時候則代表內核準備完畢,然後進行處理


IO多路復用模型(多進程的時候會用到):

找select代理去工作進程後續的操作,進程去詢問select結果就可以,select可以同時服務多個進程,如果select工作未完成,那麽

進程還是阻塞狀態,相當於換了一個不斷詢問的對象,當數據在內核中但沒有復制到用戶空間的時候,select系統調用就會通知準

備完畢,進程在去發送一個系統調用從內核中調用數據;

信號驅動IO模型:(性能較好,nginx具有此模型的某些特性)

在內核將磁盤文件讀取到內核的過程中,進程可繼續運行別的工作,比如繼續響應其他用戶請求,當內核準備完畢後,進程停止工作

等待內核將數據復制到進程空間,時間較短


異步IO模型:

進程將指令發送完畢後繼續運行別的工作,等待IO操作的完成結果即可,不會阻塞,可以不斷響應用戶請求,內核壓力會大


Epoll(Nginx使用的模式):

1 對應IO復用模型,並且具有信號驅動IO模型的某些特性

2 沒有最大並發連接的限制

3 內存拷貝mmap:對於進程來說,當想訪問的內存空間不夠的時候,可以映射到磁盤裏,磁盤裏的映射內存與內存空間是一一對應的

三: Nginx介紹


1 Nginx官方網站:https://www.nginx.org

2 Nginx功能:

1 $$高性能的HTTP,只能處理靜態頁面,結合fastcgi實現處理動態頁面;

2 $$反向代理服務器

1 正向代理服務器:當客戶端訪問某網站,網頁下載到代理服務器,由代理服務器響應給客戶端,省了流量和帶寬,服務器客戶端

2 反向代理服務器:服務於服務器,調度功能,並且工作在應用層,代替客戶端去後端服務器抓取數據,那麽後端服務器會認為是Nginx來的請求,具備健康性檢查;

而LVS工作在網絡層傳輸層,並且只有調度功能,不會去抓取數據,後端服務器記錄的也是客戶端IP;

3 郵件代理服務器

4 TCP/UDP的代理服務器

5 支持熱部署:不停機更新配置文件,啟動新版本應用,新的請求就會發送到新的版本的應用上;

6 低內存消耗:10000個keep-alive連接模式下的非活動連接(連著但是不相互傳輸數據),僅耗費2.5M內存;

7 使用master/worker工作模式,一個master主進程管理多個worker進程,worker進程處理客戶端請求,不存在線程;


3 Nginx模塊

核心模塊:core module(必須存在的)

標準模塊:

HTTP模塊:ngx_http_*

HTTP Core modules 默認功能

HTTP Optional modules 需編譯時指定

Mail 模塊 ngx_mail_*

Stream(代理模塊) 模塊 ngx_stream_*

註意:www.nginx.org --> 選擇nginx版本 --> documentation(頁面右側) --> 一系列模塊詳解以及使用方法


Nginx模型以及介紹