- 分布式系統架構:技術棧詳解與快速進階
- 張程
- 145字
- 2020-08-13 13:45:34
第4章
分布式架構Nginx
Nginx是一個高性能的HTTP和反向代理Web服務器。Nginx可以作為一個HTTP服務器進行網站的發布處理,也可以作為反向代理進行負載均衡的實現,由于其占用內存少,并發能力強,所以可以廣泛應用在互聯網中。
本章重點內容如下:
- Nginx工作原理
- Nginx源碼編譯安裝
- Nginx配置
- Nginx代理&負載均衡
- Nginx緩存
- Nginx限流
- Nginx屏蔽
- Nginx優化
- Nginx高可用
4.1 Nginx工作原理
Nginx進程模型,如圖4-1所示。

圖4-1 Nginx進程模型
注意
Nginx默認采用多進程工作方式,其中Master負責對進程進行監護,管理Worker進程以實現重啟服務、平滑升級、更換日志文件、配置文件實時生效等功能,而Worker用來處理基本的網絡事件。
Nginx啟動后,會生成一個Master進程和多個Worker進程。
Master進程工作原理:Master主進程充當整個進程組與用戶的交互接口,同時管理Worker子線程,包括接收信號并將信號發送給Worker進程;監聽Worker進程工作狀態;當Worker進程非正常退出時,啟動新的Worker進程。多個Worker進程之間是平等的,共同競爭來自客戶端的請求,各進程之間相互獨立,一個請求被一個Worker進程處理。
當Master進程收到重新加載的信號,如(./nginx -s reload),Master會重新加載配置文件,然后啟動新的Worker進程來接收請求,并通知老的Worker進程。老的Worker進程處理完手中正在處理的請求就會退出。
Worker進程工作原理:Master會根據配置文件生成一個監聽相應端口的Socket,然后復制多個Worker子進程,每個Worker子進程都可以監聽Socket的消息。當一個連接過來時,每一個Worker都能收到通知,但是只有一個Worker能與這個連接建立關系,其他的Worker都會連接失敗,而Nginx會提供一個互斥鎖(accept_mutex),當連接過來時,只有一個Worker去接收這個連接。當一個Worker進程接收到accept連接之后,就開始讀取、解析并處理請求,產生數據后,再返回給客戶端,最后才斷開連接。
那么互斥鎖(accept_mutex)如何控制Worker進程接收并處理請求呢?
只有獲得了accept_mutex的進程才會去添加accept事件。Nginx使用變量ngx_accept_disabled來控制是否去競爭accept_mutex鎖(ngx_accept_disabled = Nginx單進程的所有連接總數/8 -空閑連接數量),當ngx_accept_disabled大于0時,不會去嘗試獲取accept_mutex鎖,ngx_accept_disable越大,讓出的機會就越多,這樣其他進程獲取鎖的機會也就越大。不添加accept,每個Worker進程的連接數就控制下來了,其他進程的連接池就會得到充分利用,這樣,Nginx就控制了多進程間連接的平衡。
為什么多個Worker進程能夠同時接受上萬個請求呢?
傳統Web服務器,每個消費者獨占一個線程,當并發量規模到十萬及以上時,由于線程數目過多,會頻繁消耗CPU資源,而當線程堵塞時,會掛載或睡眠,嚴重消耗服務器的資源,久而久之會到達服務器瓶頸。
Nginx服務器采用無阻塞事件驅動模型,它不會為每個消費事件創建一個進程或線程,不會由于進程間頻繁切換占用CPU而產生瓶頸。Nginx將一個請求分為多個階段來異步處理,每個階段只處理請求的一部分,當請求的這部分發生阻塞,Nginx將不會等待,繼續處理其他請求的某部分內容,當該階段任務完成后再進入下一階段。