nginx 深入詳解多進程模型

 Nginx深入詳解之多進程網絡模型 2013-11-03 15:17:57

分類: Web開發



一、進程模型
        Nginx之所以爲廣大碼農喜愛,除了其高性能外,還有其優雅的系統架構。與Memcached的經典多線程模型相比,Nginx是經典的多進程模型。Nginx啓動後以daemon的方式在後臺運行,後臺進程包含一個master進程和多個worker進程,具體如下圖:


圖1 Nginx多進程模型

        master進程主要用來管理worker進程,具體包括如下4個主要功能:
        (1)接收來自外界的信號。
        (2)向各worker進程發送信號。
        (3)監控woker進程的運行狀態。
        (4)當woker進程退出後(異常情況下),會自動重新啓動新的woker進程。
        woker進程主要用來處理網絡事件,各個woker進程之間是對等且相互獨立的,它們同等競爭來自客戶端的請求,一個請求只可能在一個woker進程中處理,woker進程個數一般設置爲機器CPU核數。

二、進程控制
        對Nginx進程的控制主要是通過master進程來做到的,主要有兩種方式:
        (1)手動發送信號
        從圖1可以看出,master接收信號以管理衆woker進程,那麼,可以通過kill向master進程發送信號,比如kill -HUP pid用以通知Nginx從容重啓。所謂從容重啓就是不中斷服務:master進程在接收到信號後,會先重新加載配置,然後再啓動新進程開始接收新請求,並向所有老進程發送信號告知不再接收新請求並在處理完所有未處理完的請求後自動退出。
        (2)自動發送信號
        可以通過帶命令行參數啓動新進程來發送信號給master進程,比如./nginx -s reload用以啓動一個新的Nginx進程,而新進程在解析到reload參數後會向master進程發送信號(新進程會幫我們把手動發送信號中的動作自動完成)。當然也可以這樣./nginx -s stop來停止Nginx。

三、網絡事件
         Nginx採用異步非阻塞的方式來處理網絡事件,類似於Libevent具體過程如下圖:


圖2 Nginx網絡事件

        master進程先建好需要listen的socket後,然後再fork出多個woker進程,這樣每個work進程都可以去accept這個socket。當一個client連接到來時,所有accept的work進程都會受到通知,但只有一個進程可以accept成功,其它的則會accept失敗。Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work進程在accept連接,從而解決驚羣問題。當一個worker進程accept這個連接後,就開始讀取請求,解析請求,處理請求,產生數據後,再返回給客戶端,最後才斷開連接,這樣一個完成的請求就結束了。

原文地址:http://blog.chinaunix.net/uid-22312037-id-3974068.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章