傳統上基於進程或線程模型架構的web服務經過每進程或每線程處理併發鏈接請求,這勢必會在網絡和I/O操做時產生阻塞,其另外一個必然結果則是對內存或CPU的利用率低下。生成一個新的進程/線程須要事先備好其運行時環境,這包括爲其分配堆內存和棧內存,以及爲其建立新的執行上下文等。這些操做都須要佔用CPU,並且過多的進程/線程還會帶來線程抖動或頻繁的上下文切換,系統性能也會由此進一步降低。nginx
在設計的最初階段,nginx的主要着眼點就是其高性能以及對物理計算資源的高密度利用,所以其採用了不一樣的架構模型。受啓發於多種操做系統設計中基於「事件」的高級處理機制,nginx採用了模塊化、事件驅動、異步、單線程及非阻塞的架構,並大量採用了多路複用及事件通知機制。在nginx中,鏈接請求由爲數很少的幾個僅包含一個線程的進程worker以高效的迴環(run-loop)機制進行處理,而每一個worker能夠並行處理數千個的併發鏈接及請求。
若是負載以CPU密集型應用爲主,如SSL或壓縮應用,則worker數應與CPU數相同;若是負載以IO密集型爲主,如響應大量內容給客戶端,則worker數應該爲CPU個數的1.5或2倍。web
Nginx會按需同時運行多個進程:一個主進程(master)和幾個工做進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。全部進程均是僅含有一個線程,並主要經過「共享內存」的機制實現進程間通訊。主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。數據庫
1.主進程(Master Process)緩存
主要完成以下工做:網絡
2.工做進程(Worker Process)架構
3.緩存索引重建及進程管理(Cache Loader & Cache Manager)併發
Cache模塊,主要由緩存索引重建(Cache Loader)和緩存索引管理(Cache Manager)兩類進程完成工做。緩存索引重建進程是在Nginx服務啓動一段時間以後(默認是1分鐘)由主進程生成,在緩存元數據重建完成後就自動退出;緩存索引管理進程通常存在於主進程的整個生命週期,負責對緩存索引進行管理。異步
cache loader進程主要完成的任務包括:模塊化
cache manager進程的主要任務:oop