深入理解 Web Server 原理與實踐:Nginx
Nginx 是什麼以及 nginx 能夠做什麼不是本文討論的重點,本文的重點是 nginx 使用的 web server 模型,即本系列的主題。
Master-worker 模型
Nginx 採用的是 master-worker 模型:
master 進程在啟動 nginx 時第一個創建的進程,一般以超級許可權建立,master 主要負責:
讀取和校驗配置
創建、綁定和關閉 socket
創建、終止、維護 worker 進程
無中斷情況下重新更新配置
重新開啟日誌文件
等等
worker 進程主要負責:
connection 的 accept 和 process
反向代理
請求過濾
等等 nginx 支持的常規功能
也就是說 master 進程在啟動時會創建和綁定到指定的 socket,然後 master 進程根據配置(默認選擇各個平台最高效的網路 IO 模型,linux 是 epoll) fork 出指定數量的 worker 進程,worker 進程負責通過 master 進程綁定的 socket 進行 accept 和 process 來自 client 的 connection,各個 worker 進程間通過共享內存的方式進行通信,雖然各個 worker 都可以進行 connection 的 accept 但是 nginx 通過文件鎖以及各個 worker 進程當前處理 connection 的數量進行評估僅僅選擇一個 worker 進程進程新 connection 的 accept。
Nginx 的 worker 進程是默認單線程的,也就是 worker 進程是單進程模型+IO 多路復用技術,各個 worker 進程又組成了多進程模型+IO 多路復用技術,不過任意時刻,只有一個 worker 進程能夠 accept 新的 connection。
Nginx 的這種 master-worker 的模型能夠充分發揮現代 CPU 多核的能力,下圖來自網路的 nginx 架構圖:
Nginx 的高性能
Nginx 在 web server 領域的地位是久經考驗的,這得益於它的使用簡單、性能強勁,nginx 為什麼達到如此高的性能標準,結合本系列介紹的各個主題我們一起來分析一下。
C 語言
Nginx 是 C 語言編寫的,由於 C 語言是最接近系統的底層的高級語言,C 語言的性能幾乎是所有高級語言中最好的。
單進程模型
不同於傳統的多進程以及多線程 web server,nginx 中一個 connection 從 accept 到 process 都是在一個進程的一個線程中完成,完全不需要進行進程或線程的上下文切換,也不需要鎖的開銷,這就最大程度上保證了單個進程幾乎能夠跑滿單核 CPU(可以在 nginx 配置中指定 worker 進程綁定到具體的 CPU),最大程度上減少對 CPU 時鐘的浪費。
各個平台的高效事件模型
Nginx 會選擇各個平台最高效的網路模型來實現對網路事件的充分利用,比如 linux 下默認是 epoll,macOS 的 kqueue。
持續的優化
Nginx 從發布第一版到現在已經過去 10 多年了,在社區以及 nginx 官方的不斷努力之下,nginx 持續不斷地改進,包括內存分配、鎖的利用、盡量少的系統調用等等優化技術,使得 nginx 越來越高效,特性越來越豐富。


TAG:wecatch |