Nginx深入詳解之多進程網絡模型


一、進程模型
        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這個連接后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完成的請求就結束了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM