官术网_书友最值得收藏!

第4章
分布式架構Nginx

Nginx是一個高性能的HTTP和反向代理Web服務器。Nginx可以作為一個HTTP服務器進行網站的發布處理,也可以作為反向代理進行負載均衡的實現,由于其占用內存少,并發能力強,所以可以廣泛應用在互聯網中。

本章重點內容如下:

  • Nginx工作原理
  • Nginx源碼編譯安裝
  • Nginx配置
  • Nginx代理&負載均衡
  • Nginx緩存
  • Nginx限流
  • Nginx屏蔽
  • Nginx優化
  • Nginx高可用

4.1 Nginx工作原理

Nginx進程模型,如圖4-1所示。

066-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將不會等待,繼續處理其他請求的某部分內容,當該階段任務完成后再進入下一階段。

主站蜘蛛池模板: 濮阳市| 碌曲县| 平武县| 石渠县| 原平市| 海口市| 出国| 广饶县| 榆中县| 清流县| 乌什县| 曲阳县| 新河县| 龙山县| 陕西省| 兴和县| 保靖县| 红原县| 普安县| 犍为县| 德安县| 柳河县| 永吉县| 山阴县| 健康| 安多县| 常宁市| 遵义县| 临沭县| 商城县| 绥棱县| 施秉县| 临潭县| 合山市| 化州市| 图们市| 尼玛县| 黑山县| 禄丰县| 辽中县| 进贤县|