windows nginx c++读取请求数据_震撼!全网第一张源码分析全景图揭秘Nginx
不管是C/C++技術(shù)棧,還是PHP,Java技術(shù)棧,從事后端開發(fā)的朋友對nginx一定不會陌生。
想要深入學(xué)習(xí)nginx,閱讀源碼一定是非常重要的一環(huán),但nginx源碼量畢竟還是不算少,一不小心就容易陷入某個細(xì)節(jié),迷失在茫茫碼海之中。
如果有一張地圖,讓我們開啟上帝視角,總覽全局,幫助我們快速學(xué)習(xí)整體框架結(jié)構(gòu),又能不至于迷失其中那就再好不過了!
看到這篇文章的你有福了,筆者花了不少時間,把這件事給做了,先來看個全貌(限于平臺圖片尺寸設(shè)定,這里只能看個大概,想獲取高清大圖請看文末):
下面選取一些關(guān)鍵部分來一窺神秘的nginx。
主進(jìn)程啟動
nginx主進(jìn)程啟動后,進(jìn)行一系列的初始化,包括但不限于:
- 命令行參數(shù)解析
- 時間初始化
- 日志初始化
- ssl初始化
- 操作系統(tǒng)相關(guān)初始化
- 一致性hash表初始化
- 模塊編號處理
核心初始化
另外一個最重要的初始化由ngx_init_cycle()函數(shù)完成,該函數(shù)圍繞nginx中非常核心的一個全局?jǐn)?shù)據(jù)結(jié)構(gòu)ngx_cycle_t展開。
該函數(shù)完成了幾個核心初始化:
- 配置文件解析
- 創(chuàng)建并監(jiān)聽socket
- 初始化nginx各模塊
nginx核心模塊群
nginx是一個模塊化設(shè)計的軟件,優(yōu)秀的架構(gòu)設(shè)計使得nginx可以擴展非常多的模塊。
要一一描繪出這些模塊顯得有些雜亂和工作量巨大,僅選取一些關(guān)鍵核心模塊進(jìn)行了展示:
每個模塊有一個支持的命令解析列表,在初始化過程中,主進(jìn)程將會遍歷所有模塊的命令列表,進(jìn)行配置文件中的命令解析,如經(jīng)常用的ngx_http_proxy_module:
ngx_http_core_module模塊:
main函數(shù)的最后,根據(jù)是否啟用多進(jìn)程模型,分別進(jìn)入多進(jìn)程版本的ngx_master_process_cycle和單進(jìn)程版本的ngx_single_process_cycle()。
以常見的多進(jìn)程版本為例,進(jìn)入該函數(shù)后,首先設(shè)置進(jìn)程名稱為:"master process",隨后啟動各工作子進(jìn)程。
啟動子進(jìn)程
經(jīng)過幾層封裝,最終通過fork啟動多個子進(jìn)程:
除了工作子進(jìn)程,還啟動了緩存管理進(jìn)程。
之后主進(jìn)程進(jìn)入工作循環(huán),周期性更新時間并檢查各全局標(biāo)記,根據(jù)不同情況給子進(jìn)程發(fā)送不同信號。
子進(jìn)程工作循環(huán)
子進(jìn)程啟動后,進(jìn)入ngx_worker_process_cycle,進(jìn)行一些工作進(jìn)程的初始化,隨后修改進(jìn)程名稱為:"worker process"。
接著進(jìn)入工作循環(huán)函數(shù)ngx_process_events_and_timers,在該函數(shù)中主要負(fù)責(zé):
- 競爭互斥鎖,拿到鎖的進(jìn)程才能執(zhí)行accept接受新的連接,以此在多進(jìn)程之間解決驚群效應(yīng)
- 通過epoll異步IO模型處理網(wǎng)絡(luò)IO事件,包括新的連接事件和已建立連接發(fā)生的讀寫事件
- 處理定時器隊列中到期的定時器事件,定時器通過紅黑樹的方式存儲
HTTP請求預(yù)處理
當(dāng)連接有數(shù)據(jù)產(chǎn)生時,工作線程讀取socket中到來的數(shù)據(jù),并根據(jù)HTTP協(xié)議格式進(jìn)行解析,最終封裝成ngx_request_t請求對象,提交處理。
HTTP請求處理的11個階段
在nginx中各HTTP模塊是以掛載的形式串接而成,以流水線工作模式進(jìn)行HTTP請求的處理,nginx將一個HTTP請求的處理劃分為11個階段。
typedef?每階段(部分階段保留,不允許掛載)允許多個模塊掛載,一個模塊也可以掛載到多個階段。因此,初次完成掛載的存儲結(jié)構(gòu)是一個二維數(shù)組的形式。
不過在初始化過程中,ngx_http_init_phase_handlers函數(shù)將該二維數(shù)組轉(zhuǎn)換成了一維數(shù)組。下圖是nginx中各模塊掛載情況:
全景圖
最后,再來看一看全貌:
總結(jié)
nginx不僅是一款優(yōu)秀的高性能web服務(wù)器,對于C/C++技術(shù)棧的同學(xué)來說,還是一個很好的學(xué)習(xí)對象,其良好的架構(gòu)設(shè)計,優(yōu)美的代碼風(fēng)格和經(jīng)典的編程技法無一不值得細(xì)細(xì)品來。
不過限于筆者水平和時間有限,雖然號稱全景圖,但依然無法覆蓋到nginx的方方面面,歡迎讀者朋友留言交流,讓此圖日漸完善,謝謝大家。
推薦閱讀:
為何要將 listenfd 設(shè)置成非阻塞的?
C語言為什么不會過時?
如何調(diào)試多線程程序
為什么像王者榮耀這樣的游戲 Server 不愿意使用微服務(wù)?
Tomcat 架構(gòu)原理解析到架構(gòu)設(shè)計借鑒
Windows應(yīng)用程序調(diào)試原理全景圖
redis 分布式鎖
彈窗!到底誰是幕后黑手?
如果你想加入后端開發(fā)微信交流群,可以先加我微信 easy_coder,備注?“加微信群”,我拉你入群,備注不對不加哦。
點【在看】是最大的支持?
總結(jié)
以上是生活随笔為你收集整理的windows nginx c++读取请求数据_震撼!全网第一张源码分析全景图揭秘Nginx的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 稀疏矩阵三元组 严蔚敏_Sparse稀疏
- 下一篇: 分类变量 哑变量矩阵 指标矩阵_不懂数据