【转】 Nginx深入详解之多进程网络模型
【轉自】http://blog.chinaunix.net/uid-22312037-id-3974068.html
一、進程模型
????? ? 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這個連接后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完成的請求就結束了。
轉載于:https://www.cnblogs.com/Fredric-2013/p/4549546.html
總結
以上是生活随笔為你收集整理的【转】 Nginx深入详解之多进程网络模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: thinkphp3.2定义多模块并设置默
- 下一篇: 企业证书管理