-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Nginx完全開發指南:使用C、C++和OpenResty

( 簡體 字)
作者:羅劍鋒類別:1. -> 程式設計 -> 網路編程 -> Nginx
譯者:
出版社:電子工業出版社Nginx完全開發指南:使用C、C++和OpenResty 3dWoo書號: 46878
詢問書籍請說出此書號!

缺書
NT售價: 495

出版日:5/1/2017
頁數:632
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121314575
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

緣起
最早接觸Nginx 大概是在2011 年,面對著一個全新的Web 服務器,和大多數人一樣最初我也是一片茫然,能找到的參考資料十分有限,安裝、配置、運行幾乎都是“摸著石頭過河”,犯過許多低級錯誤。
隨著對Nginx 逐漸熟悉,它的高并發處理能力給我留下了深刻的印象,作為一個開源軟件的愛好者,很自然地想要探究一下它的內部工作原理。我由此開始了對Nginx 源碼的鉆研之路,中間經過了很多的艱辛曲折,走過不少的彎路。
我最常用的工作語言是C++,所以在閱讀Nginx 源碼時也總以C++的面向對象方式來思考和理解,以對象作為切入點記筆記、畫UML:從最簡單的ngx_str_t、ngx_array_t 入手,然后到ngx_request_t、ngx_upstream_t 等復雜的結構,再圍繞著這些對象研究相關的功能函數和處理流程,梳理代碼邏輯的同時也摸索著使用C++編寫Nginx 模塊的方法,逐漸積累了一些用起來頗為順手的小工具——當然還是比較初級的形式。
三年多前,我被調到了新的工作崗位,需要重度使用Nginx 開發,這讓我以前的零散積累終于有了用武之地。那段時間里使用C/C++陸續做了很多東西,也借著機會重新優化了原有的工具代碼。
繁忙的工作之余,我有了種進一步整理經驗的迫切感,因為只有系統完整地分享這些知識,才能讓更多的人基于Nginx 二次開發,讓Nginx 更好地為網絡世界服務。
同一時間,市面上也出現了一些Nginx 開發相關的資料、書籍,但在我看來卻有“粗制濫造”之嫌:行文混亂,“車?轆話”、“口頭禪”滿天飛,甚至大段照抄指令說明,還有對源碼的曲解,未免有點兒“誤人子弟”,讀起來實在是難受。終于,在“忍無可忍”的心態之下,我動起了寫作本書的念頭。
經過近一年的努力,現在這本書終于呈現在了讀者面前,結構上基本反映了我學習研究Nginx 時的心路歷程,從最初的“一無所知”起步,逐漸深入到定制開發的層次,希望能與讀者“心有戚戚焉”。
Nginx 隨感
毫無疑問,Nginx 是目前這個星球上所能獲得的最強勁的Web 服務器(沒有之一),同時也是目前最成熟、最優秀的TCP/HTTP 服務器開發框架。
Nginx 資源消耗低,并發處理性能高,配置靈活,能夠連接CGI、PHP、MySQL、Memcached等多種后端,還有著出色的負載均衡能力,可以整合封裝各種service,構建穩定高效的服務。如今Nginx 已經成為了網站架構里不可或缺的關鍵組件,廣泛應用于國內外許多大型IT企業。每一個繁忙的網站背后,可能都有Nginx 默默工作的身影。
在Nginx 出現之前,使用C/C++開發Web 服務器是項比較“痛苦”的工作,雖然有很多網絡程序庫可以使用(例如asio、libevent、thrift 等),但它們通常只關注較底層的基礎功能實現,離成熟的“框架”相距甚遠,不僅開發過程煩瑣低效,而且程序員還必須要處理配置管理、進程間通信、協議解析等許多Web 服務之外的其他事情,才能開發出一個較為完善的服務器程序。但即使開發出了這樣的服務器,通常性能上也很難得到保證,會受到程序庫和開發者水平等因素的限制——很長一段時間里,C/C++在Web 服務器領域都沒有大展拳腳的機會。
Nginx 的橫空出世為Web 服務器開辟了一個嶄新的天地,它搭建了一個高性能的服務器開發框架,而且是一個完整的、全功能的服務器。模塊化的架構設計很好地分離了底層支撐模塊和上層邏輯模塊,底層模塊處理了配置、并發等服務器的外圍功能,核心支撐模塊定義了主體的TCP/HTTP 處理框架。開發者可以把大部分精力集中在上層的業務功能實現上,再也不必去為其他雜事而分心,提高了軟件的開發效率。
在Nginx 框架里,C/C++程序員可以盡情發揮自己的專長,充分利用Nginx 無阻塞處理的優勢,打造出高質量的Web 應用服務器,與其他系統一較高下。
Nginx 和C/C++
Igor Sysoev 選擇用C 語言(準確地說是ANSI C)來實現Nginx 肯定是經過了認真的考慮。
作為與UNIX 一同誕生的編程語言,C 語言一直是系統級編程的首選。和其他高級語言相比,它簡單可靠,更接近計算機底層硬件,運行效率更高。指針更是C 語言的一大特色,善用指針能夠完成許多其他語言無法完成的工作。
以C 語言實現的Nginx 沒有“虛擬機”的成本,省略了不必要的中間環節,直接操縱計算機硬件,從根本上提高了Web 服務器的處理能力。雖然C 語言不直接支持面向對象,但Nginx靈活運用了指針,采用結構體+函數指針的形式,達到了同樣的效果,從而使軟件擁有了良好的結構。
C++是僅次于C 的系統級編程語言,在兼容C 的同時又增加了類、異常、模板等新特性,還支持面向對象、泛型、函數式、模板元等多種編程范式,可以說是計算機語言里的一個“龐然大物”。C++的特性很多,有的也很好用,但總體上的確比較復雜,易學難精,容易被誤用和濫用,導致低效、難維護的代碼,我想這可能是Igor Sysoev 放棄使用C++的一個重要原因。
另一個可能的原因是C 語言本身已經非常穩定,幾十年來沒有太大的變動,在各個系統里都支持得非常好。而C++在1998 年才有了第一個標準,并且現在還在發展之中,語言特性還不夠穩定(例如export、register 等曾經的關鍵字在C++11 里就已經被廢棄),許多編譯器對C++的支持程度也有差異,這與Nginx 的高可移植性目標明顯不符。
但C++畢竟還是有很多的優點,類可以更好地封裝信息、異常簡化了錯誤處理、模板能夠在編譯期執行類型計算。在C++11 標準頒布之后,C++更是幾乎變成了一門“全新”的語言,auto/decltype/nullptr/noexcept 等新關鍵字增強了語言的描述能力,標準庫也擴充了相當多的組件,易用性和穩定性都大大提升。
在Nginx 里使用C++時要對C++的長處和不足有清醒的認識,避免多層次繼承、虛函數等影響效率的編程范式,只使用經過充分驗證的、能夠切實提高開發效率和性能的語言特性和庫,避免華而不實的技術炫耀,盡量做到像Nginx 源碼那樣質樸踏實。只有這樣,才能夠發揮出1+1>2 的作用,讓Nginx 從C++中得到更進一步的發展動力。
Nginx 和OpenResty
多年以前Nginx 開發使用的語言只能是C 和C++,而現在,越來越多的開發者逐漸轉向了OpenResty,使Lua 搭建高并發、高性能、高擴展性的Web Server。
我接觸OpenResty 的時間并不算很長,大約在四年左右。由于C/C++程序員“天生的傲慢”,一開始對OpenResty 確實有點兒“抵觸情緒”,總覺得腳本程序比不上C/C++實現。然而隨著使用的增多,特別是在研究了它的源碼之后,我不得不感慨OpenResty 的精致、完美和強大,簡直是所有Nginx 開發者“夢寐以求的至寶”。
由于agentzh 對Nginx 的運行機制了如指掌,OpenResty 的核心部分——ngx_lua一個模塊就涵蓋了access/rewrite/content/log 等多個處理階段,再搭配上小巧靈活的Lua 和高效的LuaJIT,我們就能夠在更高級的業務層次上使用“膠水”代碼來調用組合Nginx底層功能,輕松開發出豐富Web 服務,極大地節約了寶貴的時間和精力。
當然,OpenResty 并不只有ngx_lua,圍繞著ngx_lua 還有眾多的庫和輔助工具,構成了一個相當完善的生態環境,這些組件相互支撐,利用得當可以更好地提高生產效率。
OpenResty 現在正處于蓬勃發展的階段,今后的OpenResty 也許不僅限于Nginx 和Web Server,而將成為一個更通用的開發平臺,工作語言也不僅限于Lua,可能還會有其他新的語言(例如agentzh 正在做的edgelang 和fanlang),讓我們拭目以待。
致謝
首先當然要感謝Nginx 的作者Igor Sysoev,沒有他就不會有如此優秀的Web 服務器,也就不會有本書的誕生。
OpenResty 創始人章亦春(agentzh)是一位非常親切隨和的人,在Nginx、DSL、Dynamic Tracing 等領域造詣極高,本書部分章節有幸經他審閱,在此表示最誠摯的謝意。
親情永遠是人生命中最值得珍惜的部分,我要感謝父母多年來的養育之恩和“后勤”工作,感謝妻子在生活中的陪伴,感謝兩個可愛的女兒,愿你們能夠永遠幸福快樂。
最后,我也要感謝讀者選擇本書,希望讀者能夠在閱讀過程中有所收獲,在Nginx 開發過程中獲得樂趣。
您的朋友 羅劍鋒
2017 年4 月28 日 于 北京 亞運村
內容簡介:

Nginx 是著名的Web 服務器,性能優異,運行效率遠超傳統的Apache、Tomcat,廣泛應用于國內外諸多頂級互聯網公司。Nginx 的一個突出特點是其靈活優秀的模塊化架構,可以在不修改核心的前提下增加任意功能,自2004 年發布至今,已經擁有百余個官方及非官方的功能模塊(如proxy、mysql、redis、rtmp、lua等),使得Nginx 成長為了一個近乎“全能”的服務器軟件。Nginx 功能強大,架構復雜,學習、維護和開發的門檻較高。為了幫助讀者跨越這一障礙,本書深入最新的Nginx 源碼(Stable 1.12.0),詳細剖析了模塊體系、動態插件、功能框架、進程模型、事件驅動、線程池、TCP/UDP/HTTP 處理等Nginx 核心運行機制,在此基礎上講解如何使用C、C++、Lua、nginScript 等語言來增強擴展Nginx,讓任何人都能夠便捷、輕松地開發和定制Nginx,進而應用到自己的實際工作中,創造出更多的價值。本書結構嚴謹、脈絡清晰、論述精確、詳略得當、圖文并茂,值得廣大軟件開發工程師、系統運維工程師和編程愛好者擁有。

目錄:

第0 章 導讀 ...... 1
0.1 關于本書 ....... 1
0.2 讀者對象 ....... 2
0.3 讀者要求 ....... 3
0.4 運行環境 ....... 4
0.5 本書的結構 ..... 4
0.6 如何閱讀本書 ..... 7
0.7 本書的源碼 ..... 8
第1 章 Nginx 入門 .... 9
1.1 關于Nginx ...... 9
1.1.1 歷史 ...... 10
1.1.2 特點 ...... 10
1.1.3 進程模型 ...... 11
1.1.4 版本 ...... 12
1.2 安裝Nginx ...... 13
1.2.1 準備工作 ...... 13
1.2.2 快速安裝 ...... 14
1.2.3 運行命令 ...... 14
1.2.4 驗證安裝 ...... 16
1.2.5 定制安裝 ...... 16
1.3 配置Nginx ...... 19
1.3.1 配置文件格式 .... 19
1.3.2 進程配置...... 20
1.3.3 動態模塊配置 .... 22
1.3.4 運行日志配置 .... 22
1.3.5 events 配置 ...... 23
1.3.6 http 配置 ...... 23
1.3.7 server 配置 ..... 25
1.3.8 location 配置 .... 26
1.3.9 file 配置 ..... 27
1.3.10 upstream 配置 .... 27
1.3.11 變量 ...... 28
1.4 總結 ....... 30
第2 章 Nginx 開發準備 .... 31
2.1 開發環境 ..... 31
2.1.1 C++標準 ...... 31
2.1.2 Boost 程序庫 ..... 32
2.2 目錄結構 ..... 32
2.3 源碼特點 ..... 34
2.3.1 代碼風格...... 34
2.3.2 代碼優化...... 34
2.3.3 面向對象思想 .... 34
2.4 使用C++ ..... 35
2.4.1 實現原則...... 35
2.4.2 代碼風格 ...... 36
2.4.3 編譯腳本 ...... 36
2.5 C++包裝類 ...... 38
2.5.1 類定義 ...... 38
2.5.2 構造和析構 ...... 39
2.5.3 成員函數 ...... 40
2.6 總結 ....... 40
第3 章 Nginx 基礎設施 ... 41
3.1 頭文件 ....... 41
3.1.1 Nginx 頭文件 ..... 41
3.1.2 C++頭文件 ..... 42
3.2 整數類型 ..... 42
3.2.1 標準整數類型 .... 43
3.2.2 自定義整數類型 .... 43
3.2.3 無效值 ...... 44
3.2.4 C++封裝 ..... 44
3.3 錯誤處理 ..... 47
3.3.1 錯誤碼定義 ...... 48
3.3.2 C++異常 ..... 48
3.4 內存池 ....... 50
3.4.1 結構定義 ...... 51
3.4.2 操作函數 ...... 51
3.4.3 C++封裝 ..... 52
3.4.4 清理機制 ...... 54
3.4.5 C++內存分配器 ..... 57
3.5 字符串 ....... 58
3.5.1 結構定義 ...... 59
3.5.2 操作函數 ...... 59
3.5.3 C++封裝 ..... 61
3.6 時間與日期 ..... 64
3.6.1 時間結構定義 .... 64
3.6.2 時間操作函數 .... 64
3.6.3 日期結構定義 .... 65
3.6.4 日期操作函數 .... 66
3.6.5 C++封裝時間 .... 67
3.6.6 C++封裝日期 .... 68
3.7 運行日志 ..... 70
3.7.1 結構定義...... 71
3.7.2 操作函數...... 71
3.7.3 C++封裝 ...... 72
3.8 總結 ....... 74
第4 章 Nginx 高級數據結構 ... 77
4.1 動態數組 ..... 77
4.1.1 結構定義...... 77
4.1.2 操作函數...... 79
4.1.3 C++動態數組 .... 79
4.2 單向鏈表 ..... 83
4.2.1 結構定義...... 83
4.2.2 操作函數...... 84
4.2.3 C++迭代器 ...... 85
4.2.4 C++單向鏈表 .... 87
4.3 雙端隊列 ..... 90
4.3.1 結構定義...... 90
4.3.2 操作函數...... 91
4.3.3 C++節點 ...... 93
4.3.4 C++迭代器 ...... 95
4.3.5 C++雙端隊列 .... 97
4.4 紅黑樹 ....... 101
4.4.1 節點結構定義 .... 101
4.4.2 樹結構定義 .... 102
4.4.3 操作函數...... 103
4.4.4 C++紅黑樹 .... 104
4.5 緩沖區 ....... 108
4.5.1 結構定義...... 108
4.5.2 操作函數...... 110
4.5.3 C++緩沖區 .... 111
4.6 數據塊鏈 ..... 113
4.6.1 結構定義 ...... 114
4.6.2 操作函數 ...... 114
4.6.3 C++節點 ..... 115
4.6.4 C++迭代器 ..... 117
4.6.5 C++數據塊鏈 ..... 118
4.7 鍵值對 ....... 120
4.7.1 簡單鍵值對 .... 120
4.7.2 散列表鍵值對 .... 121
4.8 總結 ....... 121
第5 章 Nginx 開發綜述 ... 123
5.1 最簡單的模塊 ..... 123
5.1.1 模塊設計 ...... 124
5.1.2 配置解析 ...... 124
5.1.3 處理函數 ...... 126
5.1.4 模塊集成 ...... 128
5.1.5 編譯腳本和命令 .... 129
5.1.6 測試驗證 ...... 130
5.2 開發基本流程 ..... 131
5.2.1 設計 ...... 131
5.2.2 開發 ...... 132
5.2.3 編譯 ...... 133
5.2.4 測試驗證 ...... 133
5.2.5 調優 ...... 133
5.2.6 流程圖 ...... 133
5.3 編譯腳本 ..... 134
5.3.1 運行機制 ...... 134
5.3.2 使用的變量 .... 135
5.3.3 模塊腳本 ...... 135
5.3.4 兩種腳本格式 .... 136
5.3.5 舊式編譯腳本 .... 136
5.4 總結 ....... 137
第6 章 Nginx 模塊體系 .... 139
6.1 模塊架構 ..... 139
6.1.1 結構定義...... 139
6.1.2 模塊的簽名 .... 141
6.1.3 模塊的種類 .... 142
6.1.4 模塊的函數指針表 .... 143
6.1.5 模塊的類圖 .... 144
6.1.6 模塊的組織形式 .... 145
6.1.7 模塊的初始化 .... 147
6.1.8 模塊的動態加載 .... 150
6.2 配置解析 ..... 152
6.2.1 結構定義...... 152
6.2.2 配置解析的基本流程 .... 156
6.2.3 配置數據的存儲模型 .... 157
6.2.4 訪問配置數據 .... 163
6.2.5 確定配置數據的位置 .... 163
6.2.6 配置解析函數 .... 165
6.2.7 配置數據的合并 .... 166
6.2.8 配置指令的類型 .... 167
6.3 源碼分析 ..... 168
6.3.1 ngx_core_module ... 168
6.3.2 ngx_errlog_module .... 171
6.4 C++封裝 ...... 172
6.4.1 NgxModuleConfig ... 172
6.4.2 NgxModule .... 176
6.4.3 NgxTake ..... 178
6.4.4 NGX_MODULE_NULL ... 180
6.5 C++開發模塊 .... 180
6.5.1 模塊的基本組成 .... 180
6.5.2 配置信息類 .... 181
6.5.3 業務邏輯類 .... 183
6.5.4 模塊集成類 .... 184
6.5.5 實現源文件 .... 186
6.5.6 增加更多功能 .... 187
6.6 總結 ....... 187
第7 章 Nginx HTTP 框架綜述 .. 191
7.1 框架簡介 ..... 191
7.1.1 模塊分類 ...... 191
7.1.2 處理流程 ...... 192
7.1.3 請求結構體 .... 194
7.1.4 請求的處理階段 .... 195
7.1.5 請求的環境數據 .... 197
7.2 處理引擎 ..... 198
7.2.1 函數原型 ...... 198
7.2.2 處理函數的存儲方式 .... 198
7.2.3 內容處理函數 .... 199
7.2.4 引擎的數據結構 .... 200
7.2.5 引擎的初始化 .... 201
7.2.6 引擎的運行機制 .... 202
7.2.7 日志階段的處理 .... 205
7.3 過濾引擎 ..... 205
7.3.1 函數原型 ...... 206
7.3.2 過濾函數鏈表 .... 206
7.3.3 過濾函數的順序 .... 207
7.3.4 過濾鏈表的運行機制 .... 209
7.3.5 請求體過濾 .... 210
7.4 源碼分析 ..... 211
7.4.1 ngx_http_static_module ... 211
7.4.2 ngx_http_not_modified_filter_module .. 212
7.5 C++封裝 ...... 213
7.5.1 NgxModuleCtx ..... 213
7.5.2 NgxHttpCoreModule .... 215
7.5.3 NgxFilter ...... 217
7.6 總結 ....... 219
第8 章 Nginx HTTP 請求處理 .. 221
8.1 狀態碼 ....... 221
8.2 請求結構體 ..... 222
8.3 請求行 ....... 223
8.3.1 請求方法...... 223
8.3.2 協議版本號 .... 224
8.3.3 資源標識符 .... 224
8.4 請求頭 ....... 225
8.5 請求體 ....... 226
8.5.1 結構定義...... 226
8.5.2 操作函數...... 227
8.6 響應頭 ....... 227
8.6.1 結構定義...... 228
8.6.2 操作函數...... 228
8.7 響應體 ....... 229
8.8 源碼分析 ..... 229
8.8.1 ngx_http_static_module ... 230
8.8.2 ngx_http_not_modified_filter_module .. 231
8.9 C++封裝 ...... 232
8.9.1 NgxHeaders .... 232
8.9.2 NgxRequestBody ... 235
8.9.3 NgxRequest .... 236
8.9.4 NgxResponse ..... 238
8.10 開發handler 模塊 ... 241
8.10.1 模塊設計 ...... 241
8.10.2 配置信息類 .... 241
8.10.3 業務邏輯類 .... 242
8.10.4 模塊集成類 .... 243
8.10.5 實現源文件 .... 245
8.10.6 編譯腳本 ...... 245
8.10.7 測試驗證 ...... 246
8.11 開發filter 模塊 .... 246
8.11.1 模塊設計 ...... 246
8.11.2 配置信息類 .... 246
8.11.3 環境數據類 .... 247
8.11.4 業務邏輯類 .... 248
8.11.5 模塊集成類 .... 251
8.11.6 實現源文件 .... 252
8.11.7 編譯腳本 ...... 253
8.11.8 測試驗證 ...... 253
8.12 總結 ....... 253
第9 章 Nginx HTTP 請求轉發 .. 255
9.1 框架簡介 ..... 255
9.1.1 工作原理 ...... 256
9.1.2 請求結構體 .... 257
9.1.3 上游結構體 .... 258
9.1.4 上游配置參數 .... 260
9.2 請求轉發機制 ..... 261
9.2.1 回調函數 ...... 261
9.2.2 初始化 ...... 263
9.2.3 設置連接參數 .... 264
9.2.4 啟動連接 ...... 265
9.2.5 處理數據 ...... 265
9.3 負載均衡機制 ..... 266
9.3.1 結構定義 ...... 267
9.3.2 初始化模塊入口 .... 271
9.3.3 初始化地址列表 .... 272
9.3.4 初始化算法 .... 274
9.3.5 執行算法 ...... 274
9.4 源碼分析 ..... 275
9.4.1 ngx_http_memcached_module . 275
9.4.2 ngx_http_upstream_ip_hash_module . 278
9.5 C++封裝 ...... 281
9.5.1 NgxUpstream ..... 281
9.5.2 NgxUpstreamHelper .... 283
9.5.3 NgxHttpUpstreamModule .. 285
9.5.4 NgxLoadBalance .... 287
9.6 開發upstream 模塊 ... 288
9.6.1 模塊設計...... 288
9.6.2 配置信息類 .... 288
9.6.3 業務邏輯類 .... 289
9.6.4 模塊集成類 .... 292
9.6.5 實現源文件 .... 293
9.6.6 編譯腳本...... 293
9.6.7 測試驗證...... 294
9.7 開發load-balance 模塊 ... 294
9.7.1 模塊設計...... 294
9.7.2 配置信息類 .... 294
9.7.3 業務邏輯類 .... 295
9.7.4 模塊集成類 .... 297
9.7.5 實現源文件 .... 298
9.7.6 編譯腳本...... 299
9.7.7 測試驗證...... 299
9.8 總結 ....... 299
第10 章 Nginx HTTP 子請求 .. 301
10.1 子請求簡介 ..... 301
10.1.1 工作原理 ...... 302
10.1.2 請求結構體 .... 303
10.1.3 回調函數 ...... 304
10.1.4 待處理請求鏈表 .... 306
10.1.5 子請求存儲結構 .... 306
10.2 子請求運行機制 ..... 307
10.2.1 創建子請求 .... 307
10.2.2 處理引擎 ...... 311
10.2.3 數據整理 ...... 312
10.3 C++封裝 ...... 314
10.3.1 NgxSubRequestHandler ... 314
10.3.2 NgxSubRequest .... 316
10.4 數據回傳模塊 ..... 317
10.4.1 模塊設計 ...... 317
10.4.2 環境數據類 .... 317
10.4.3 業務邏輯類 .... 319
10.4.4 模塊集成類 .... 321
10.4.5 編譯腳本 ...... 322
10.5 在模塊里使用子請求.... 323
10.5.1 模塊設計 ...... 323
10.5.2 配置信息類 .... 323
10.5.3 業務邏輯類 .... 324
10.5.4 測試驗證 ...... 327
10.6 總結 ....... 328
第11 章 Nginx 變量 .... 329
11.1 結構定義 ..... 329
11.1.1 變量值 ...... 329
11.1.2 變量訪問對象 .... 330
11.1.3 變量的存儲 .... 331
11.1.4 請求結構體 .... 331
11.2 運行機制 ..... 332
11.2.1 注冊變量 ...... 333
11.2.2 獲取變量 ...... 333
11.2.3 修改變量 ...... 334
11.3 復雜變量 ..... 334
11.3.1 結構定義 ...... 334
11.3.2 運行機制 ...... 335
11.4 C++封裝 ...... 335
11.4.1 NgxVariableValue ... 336
11.4.2 NgxVariable .... 337
11.4.3 NgxVarManager ... 339
11.4.4 NgxVariables .... 340
11.4.5 NgxComplexValue.... 340
11.5 在模塊里使用變量 .... 341
11.5.1 添加變量 ...... 341
11.5.2 讀寫變量 ...... 343
11.6 在模塊里使用復雜變量 .. 343
11.6.1 配置信息類 .... 344
11.6.2 業務邏輯類 .... 344
11.6.3 模塊集成類 .... 344
11.6.4 測試驗證 ...... 344
11.7 總結 ....... 345
第12 章 Nginx 輔助設施 .... 347
12.1 摘要算法 ..... 347
12.1.1 MD5 ..... 347
12.1.2 SHA-1 ...... 348
12.1.3 MurmurHash .... 349
12.1.4 C++封裝 ...... 349
12.2 編碼和解碼 ..... 352
12.2.1 CRC 校驗 ..... 352
12.2.2 Base64 編碼解碼 ... 353
12.2.3 URI 編碼解碼 .... 354
12.2.4 HTML 和JSON 編碼 .. 355
12.3 正則表達式 ..... 356
12.4 共享內存 ..... 356
12.4.1 結構定義 ...... 357
12.4.2 操作函數 ...... 357
12.4.3 C++共享內存 .... 358
12.5 總結 ....... 359
第13 章 Nginx 進程機制 .... 361
13.1 基本系統調用 ..... 361
13.1.1 errno ..... 361
13.1.2 getrlimit ...... 362
13.2 進程系統調用 ..... 362
13.2.1 getpid ..... 362
13.2.2 fork ....... 363
13.2.3 waitpid ...... 363
13.3 信號系統調用 ..... 364
13.3.1 kill ...... 364
13.3.2 sigaction ..... 365
13.3.3 sigsuspend .... 365
13.4 結構定義 ..... 365
13.4.1 ngx_cycle_t .... 365
13.4.2 ngx_core_conf_t ... 366
13.4.3 ngx_process_t ..... 367
13.5 全局變量 ..... 368
13.5.1 命令行相關 .... 368
13.5.2 操作系統相關 .... 369
13.5.3 進程功能相關 .... 369
13.5.4 信號功能相關 .... 370
13.6 啟動過程 ..... 370
13.6.1 基本流程 ...... 370
13.6.2 解析命令行 .... 371
13.6.3 版本和幫助信息 .... 372
13.6.4 初始化cycle .... 372
13.6.5 測試配置 ...... 374
13.6.6 發送信號 ...... 374
13.6.7 守護進程化 .... 374
13.6.8 啟動工作進程 .... 375
13.6.9 流程圖 ...... 376
13.7 信號處理 ..... 377
13.7.1 信號處理函數 .... 377
13.7.2 發送信號 ...... 378
13.7.3 處理信號 ...... 378
13.8 單進程模式 ..... 379
13.8.1 single 進程 ..... 379
13.8.2 single 進程流程圖 ... 381
13.9 多進程模式 ..... 382
13.9.1 產生子進程 .... 382
13.9.2 master 進程 .... 383
13.9.3 master 進程流程圖 .... 387
13.9.4 worker 進程 ..... 388
13.9.5 worker 進程流程圖 ... 389
13.10 總結 ....... 390
第14 章 Nginx 事件機制 .... 393
14.1 基本系統調用 ..... 393
14.1.1 errno ..... 394
14.1.2 ioctl ...... 394
14.1.3 setitimer...... 394
14.1.4 gettimeofday .... 395
14.2 socket 系統調用 .... 395
14.2.1 socket ..... 396
14.2.2 bind ...... 396
14.2.3 listen ..... 396
14.2.4 accept ..... 396
14.2.5 connect ..... 397
14.2.6 recv ....... 397
14.2.7 send ...... 397
14.2.8 setsockopt ..... 398
14.2.9 close ..... 398
14.2.10 函數關系圖 .... 398
14.3 epoll 系統調用 .... 399
14.3.1 epoll_create .... 400
14.3.2 epoll_ctl...... 400
14.3.3 epoll_wait ..... 401
14.3.4 LT 和ET ...... 401
14.3.5 函數關系圖 .... 402
14.4 結構定義 ..... 403
14.4.1 ngx_event_t .... 403
14.4.2 ngx_connection_t ... 404
14.4.3 ngx_listening_t ..... 405
14.4.4 ngx_cycle_t .... 407
14.4.5 ngx_os_io_t .... 408
14.4.6 ngx_event_actions_t ... 411
14.4.7 ngx_posted_events ... 413
14.4.8 結構關系圖 .... 415
14.5 定時器 ..... 415
14.5.1 紅黑樹 ...... 415
14.5.2 操作函數 ...... 416
14.5.3 超時處理 ...... 416
14.6 模塊體系 ..... 419
14.6.1 函數指針表 .... 419
14.6.2 模塊的組織形式 .... 420
14.6.3 核心配置 ...... 422
14.6.4 epoll 模塊 ..... 423
14.7 全局變量 ..... 425
14.7.1 更新時間相關 .... 425
14.7.2 事件機制相關 .... 426
14.7.3 負載均衡相關 .... 426
14.7.4 統計相關 ...... 427
14.8 運行機制 ..... 427
14.8.1 模塊初始化 .... 427
14.8.2 進程初始化 .... 429
14.8.3 基本參數初始化 .... 429
14.8.4 epoll 初始化 ..... 430
14.8.5 連接池初始化 .... 431
14.8.6 監聽端口初始化 .... 433
14.8.7 初始化流程圖 .... 434
14.8.8 添加事件 ...... 435
14.8.9 刪除事件 ...... 439
14.8.10 處理事件 ...... 440
14.8.11 接受連接 .... 444
14.8.12 負載均衡 .... 447
14.8.13 避免阻塞 .... 452
14.9 總結 ....... 452
第15 章 Nginx 多線程機制 ... 455
15.1 eventfd 系統調用 .... 455
15.2 pthread 系統調用 .... 456
15.2.1 pthread_create .... 456
15.2.2 pthread_exit .... 457
15.3 結構定義 ..... 457
15.3.1 ngx_thread_task_t .... 457
15.3.2 ngx_thread_pool_queue_t .. 458
15.3.3 ngx_thread_pool_t.... 458
15.3.4 結構關系圖 .... 459
15.4 事件通知 ..... 460
15.4.1 函數接口 ...... 460
15.4.2 初始化 ..... 460
15.4.3 發送通知 ...... 461
15.4.4 處理通知 ...... 462
15.5 運行機制 ..... 463
15.5.1 完成任務隊列 .... 463
15.5.2 創建線程池 .... 463
15.5.3 創建任務 ...... 464
15.5.4 投遞任務 ...... 465
15.5.5 執行任務 ...... 466
15.5.6 任務完成回調 .... 468
15.5.7 銷毀線程池 .... 468
15.6 在模塊里使用多線程 ... 469
15.6.1 模塊設計 ...... 470
15.6.2 配置信息類 .... 470
15.6.3 業務邏輯類 .... 470
15.6.4 測試驗證 ...... 474
15.7 總結 ....... 474
第16 章 Nginx Stream 機制 ... 477
16.1 模塊體系 ..... 477
16.1.1 函數指針表 .... 477
16.1.2 基礎模塊 ...... 478
16.1.3 核心模塊 ...... 480
16.1.4 結構關系圖 .... 481
16.1.5 存儲模型 ...... 482
16.2 監聽端口 ..... 483
16.2.1 結構定義 ...... 483
16.2.2 解析配置 ...... 485
16.2.3 啟動監聽 ...... 489
16.3 處理引擎 ..... 491
16.3.1 階段定義 ...... 491
16.3.2 函數原型 ...... 491
16.3.3 處理函數的存儲方式 .. 492
16.3.4 引擎數據結構 .... 492
16.3.5 結構關系圖 .... 493
16.3.6 引擎的初始化 .... 493
16.4 過濾引擎 ..... 495
16.4.1 函數原型 ...... 495
16.4.2 過濾函數鏈表 .... 495
16.5 運行機制 ..... 496
16.5.1 會話結構體 .... 496
16.5.2 創建會話 ...... 497
16.5.3 執行引擎 ...... 500
16.5.4 通用階段處理 .... 501
16.5.5 預讀數據 ...... 502
16.5.6 產生響應數據 .... 506
16.5.7 過濾數據 ...... 506
16.5.8 結束會話 ...... 506
16.6 開發stream 模塊 ..... 507
16.6.1 C++封裝 ..... 507
16.6.2 discard 協議 ..... 508
16.6.3 time 協議 ...... 510
16.6.4 chargen 協議 .... 512
16.7 總結 ....... 514
第17 章 Nginx HTTP 機制 ... 517
17.1 結構定義 ..... 517
17.1.1 ngx_http_state_e .... 517
17.1.2 ngx_http_connection_t ... 518
17.1.3 ngx_http_request_t ... 518
17.2 初始化連接 ..... 519
17.2.1 建立連接 ...... 520
17.2.2 等待數據 ...... 521
17.2.3 讀取請求頭 .... 524
17.3 執行引擎 ..... 528
17.3.1 初始化引擎 .... 528
17.3.2 通用階段 ...... 530
17.3.3 改寫階段 ...... 531
17.3.4 訪問控制階段 .... 532
17.3.5 內容產生階段 .... 533
17.4 處理請求體 ..... 534
17.4.1 丟棄緩沖區數據 .... 535
17.4.2 讀取并丟棄數據 .... 536
17.4.3 讀事件處理函數 .... 537
17.4.4 啟動丟棄處理 .... 538
17.5 發送數據 ..... 540
17.5.1 發送初始化 .... 540
17.5.2 事件處理函數 .... 541
17.6 結束請求 ..... 543
17.6.1 釋放請求資源 .... 543
17.6.2 檢查引用計數結束請求 .. 544
17.6.3 檢查狀態結束請求 .... 545
17.6.4 綜合處理結束請求 .... 546
17.7 總結 ....... 548
第18 章 Nginx 與設計模式 ... 551
18.1 設計模式簡介 ..... 551
18.2 框架級別的模式 ..... 551
18.3 業務級別的模式 ..... 553
18.4 代碼級別的模式 ..... 554
18.5 總結 ....... 556
第19 章 OpenResty 開發 ... 557
19.1 簡介 ....... 557
19.1.1 歷史 ...... 558
19.1.2 版本 ...... 559
19.1.3 組成 ...... 559
19.1.4 性能 ...... 561
19.1.5 安裝 ...... 562
19.1.6 目錄結構 ...... 563
19.1.7 命令行工具 .... 564
19.1.8 參考手冊 ...... 565
19.2 Lua 語言 ...... 566
19.2.1 注釋 ...... 566
19.2.2 數據類型 ...... 567
19.2.3 變量 ...... 568
19.2.4 運算 ...... 569
19.2.5 語句 ...... 570
19.2.6 函數 ...... 572
19.2.7 表 ...... 574
19.2.8 標準庫 ...... 575
19.2.9 模塊 ...... 576
19.3 LuaJIT ...... 577
19.3.1 continue ...... 578
19.3.2 bit ....... 578
19.3.3 ffi ...... 579
19.4 Lua 模塊 ...... 581
19.4.1 指令簡介 ...... 581
19.4.2 配置指令 ...... 581
19.4.3 功能指令 ...... 582
19.4.4 指令關系圖 .... 584
19.4.5 應用開發流程 .... 584
19.5 功能接口 ..... 585
19.5.1 運行日志 ...... 585
19.5.2 時間與日期 .... 586
19.5.3 變量 ..... 587
19.5.4 正則表達式 .... 587
19.5.5 請求處理 ...... 588
19.5.6 請求轉發 ...... 590
19.5.7 子請求 ..... 592
19.5.8 定時器 ..... 592
19.5.9 共享內存 ...... 593
19.6 應用實例 ..... 594
19.6.1 處理請求 ...... 594
19.6.2 過濾請求 ...... 595
19.6.3 轉發請求 ...... 596
19.6.4 子請求 ..... 597
19.7 Stream Lua 模塊 .... 598
19.7.1 功能接口 ...... 598
19.7.2 discard ...... 599
19.7.3 time ...... 599
19.7.4 chargen ..... 600
19.7.5 echo ...... 600
19.8 lua-resty 庫 ...... 601
19.8.1 core ....... 601
19.8.2 cjson ..... 602
19.8.3 redis ...... 603
19.9 總結 ....... 603
第20 章 結束語 .... 605
20.1 本書的遺憾 ..... 605
20.2 下一步 ..... 605
20.3 臨別贈言 ..... 606
附錄A 推薦書目 .... 607
附錄B GDB 調試簡介 .... 609
附錄C Nginx C++模塊簡介 .. 611
附錄D Nginx 的字符串格式化 .. 613
附錄E nginScript 簡介 ... 615
序: