第1章 Nginx學前必知 1
1.1 HTTP請求報文 1
1.2 HTTP響應報文 2
1.3 安裝Nginx 2
1.4 支持HTTPS 4
1.5 添加模塊 4
1.6 小結 4
第2章 基礎配置 5
2.1 Nginx指令和指令塊 5
2.2 Nginx基本配置說明 6
2.2.1 Main配置 6
2.2.2 與客戶端有關的配置 7
2.2.3 server塊 7
2.2.4 location塊 8
2.3 include的使用 9
2.4 常見配置 9
2.4.1 常見配置注解 10
2.4.2 常見配置實戰技巧 11
2.5 內置變量 13
2.5.1 常見內置變量 13
2.5.2 常見內置變量實戰技巧 15
2.6 小結 16
第3章 強化基礎配置 17
3.1 牢記Context標識 17
3.2 獲取請求的IP地址 18
3.2.1 獲取用戶的真實IP地址 18
3.2.2 防止IP地址僞造 19
3.2.3 後端服務器對IP地址的需求 19
3.3 管理請求的行為 20
3.3.1 限製IP地址的訪問 20
3.3.2 auth身份驗證 21
3.3.3 利用LDAP服務加強安全 22
3.3.4 satisfy二選一的訪問限製功能 23
3.4 proxy代理 23
3.4.1 proxy_pass請求代理規則 24
3.4.2 減少後端服務器的網絡開銷 24
3.4.3 控製請求頭和請求體 25
3.4.4 控製請求和後端服務器的交互時間 26
3.5 upstream使用手冊 26
3.5.1 代理多颱服務器 27
3.5.2 故障轉移 28
3.5.3 負載均衡 29
3.5.4 通過hash分片提升緩存命中率 29
3.5.5 利用長連接提升性能 30
3.5.6 利用resolver加速內部域名訪問 31
3.6 rewrite使用手冊 32
3.6.1 內部重定嚮 32
3.6.2 域名跳轉 33
3.6.3 跳轉POST請求 34
3.6.4 設置變量的值 34
3.7 限速白名單 35
3.8 日誌 36
3.8.1 記錄自定義變量 36
3.8.2 日誌格式規範 36
3.8.3 日誌存儲 37
3.9 HTTP執行階段 38
3.10 小結 39
第4章 常用模塊精解 40
4.1 定製HTTP頭信息 40
4.1.1 使用ngx_http_headers_module設置響應頭 40
4.1.2 使用headers-more-nginx控製請求頭和響應頭 43
4.2 第三方模塊set-misc-nginx 45
4.2.1 設置變量 46
4.2.2 防止SQL注入 46
4.2.3 字符串非轉義和轉義 47
4.2.4 基於鍵值的集群分片 48
4.2.5 base編碼 48
4.2.6 md5編碼 50
4.2.7 生成隨機數 50
4.2.8 本地時間的輸齣 52
4.2.9 實戰經驗 52
4.3 圖片的處理 53
4.3.1 image_filter圖片處理 53
4.3.2 采用漸進式方式打開JPEG圖片 55
4.3.3 WebP格式 56
4.3.4 優化圖片 56
4.3.5 實戰經驗:動態切圖 58
4.4 TCP和UDP代理 58
4.4.1 代理配置說明 58
4.4.2 DNS服務的反嚮代理 62
4.4.3 MySQL集群代理配置 62
4.4.4 實戰經驗 63
4.5 常用模塊介紹 63
4.5.1 基於訪問IP地址跳轉到對應城市 63
4.5.2 修改響應內容 65
4.5.3 零像素文件的生成及其作用 66
4.5.4 圖片的防盜鏈 67
4.6 小結 68
第5章 緩存係統 69
5.1 緩存配置說明 69
5.2 控製緩存有效期 71
5.3 性能優化 72
5.3.1 緩存未命中的最佳實踐 72
5.3.2 橫嚮擴展最佳實踐 75
5.3.3 避免硬盤I/O阻塞 76
5.3.4 集群模式 77
5.4 高可用方案 77
5.5 proxy_cache配置模闆 78
5.6 小結 81
第6章 引入Lua 82
6.1 為什麼要引入Lua 82
6.2 Lua和LuaJIT 83
6.3 環境搭建 83
6.4 Lua的數據類型 84
6.4.1 類型說明 84
6.4.2 類型示例 85
6.5 錶達式 89
6.5.1 算術運算符 89
6.5.2 關係運算符 90
6.5.3 邏輯運算符 91
6.5.4 字符串連接和字符串長度計算 92
6.5.5 運算符優先級 93
6.6 變量 93
6.6.1 全局變量 94
6.6.2 局部變量 94
6.6.3 變量賦值 94
6.7 流程控製 95
6.7.1 if-else 95
6.7.2 for循環 96
6.7.3 while循環 97
6.7.4 break和return 97
6.8 函數 98
6.8.1 函數格式 98
6.8.2 傳參方式 99
6.8.3 函數的創建位置 100
6.9 模塊 100
6.9.1 模塊格式 101
6.9.2 加載模塊 101
6.10 Lua常見操作 102
6.10.1 操作table 102
6.10.2 定義字符串 103
6.10.3 字符串連接 104
6.11 引入Lua的插麯 104
6.12 小結 105
第7章 Lua-Nginx-Module常用指令 106
7.1 Nginx和OpenResty 106
7.2 安裝Ngx_Lua 107
7.3 牢記Context標識 108
7.4 Hello world 108
7.5 避免I/O阻塞 109
7.6 定義模塊搜索路徑 109
7.6.1 定義Lua模塊的搜索路徑 109
7.6.2 定義C模塊的搜索路徑 110
7.7 讀/寫Nginx的內置變量 110
7.8 控製請求頭 111
7.8.1 添加請求頭 111
7.8.2 清除請求頭 112
7.8.3 獲取請求頭 112
7.9 控製響應頭 113
7.9.1 獲取響應頭 113
7.9.2 修改響應頭 114
7.9.3 清除響應頭 116
7.10 讀取請求體 116
7.10.1 強製獲取請求體 116
7.10.2 用同步非阻塞方式獲取請求體 117
7.10.3 使用場景示例 118
7.10.4 使用建議 121
7.11 輸齣響應體 121
7.11.1 異步發送響應體 121
7.11.2 同步發送響應體 122
7.12 正則錶達式 124
7.12.1 單一捕獲 124
7.12.2 全部捕獲 125
7.12.3 更高效的匹配和捕獲 126
7.12.4 替換數據 128
7.12.5 轉義符號 129
7.13 子請求 130
7.13.1 請求方法 130
7.13.2 單一子請求 130
7.13.3 並發子請求 134
7.14 獲取Nginx的環境變量 135
7.14.1 獲取環境所在的模塊 135
7.14.2 確認調試模式 136
7.14.3 獲取prefix路徑 136
7.14.4 獲取Nginx的版本號 136
7.14.5 獲取configure信息 136
7.14.6 獲取Ngx_Lua的版本號 137
7.14.7 判斷worker進程是否退齣 137
7.14.8 獲取worker進程的ID 137
7.14.9 獲取worker進程的數量 137
7.15 定時任務 138
7.15.1 創建定時任務 138
7.15.2 性能優化 140
7.15.3 禁用的Lua API 141
7.16 常用指令 142
7.16.1 請求重定嚮 142
7.16.2 日誌記錄 144
7.16.3 請求中斷處理 146
7.17 提升開發和測試效率 149
7.17.1 斷開客戶端連接 149
7.17.2 請求休眠 150
7.17.3 獲取係統時間 150
7.17.4 編碼與解碼 152
7.17.5 防止SQL注入 154
7.17.6 判斷是否為子請求 155
7.17.7 設置MIME類型 156
7.18 小結 156
第8章 Ngx_Lua的執行階段 157
8.1 init_by_lua_block 157
8.1.1 階段說明 157
8.1.2 初始化配置 158
8.1.3 控製初始值 159
8.1.4 init_by_lua_file 160
8.1.5 可使用的Lua API指令 160
8.2 init_worker_by_lua_block 160
8.2.1 階段說明 160
8.2.2 啓動Nginx的定時任務 161
8.2.3 動態進行後端健康檢查 162
8.3 set_by_lua_block 165
8.3.1 階段說明 165
8.3.2 變量賦值 165
8.3.3 rewrite階段的混用模式 166
8.3.4 阻塞事件 167
8.3.5 被禁用的Lua API指令 167
8.4 rewrite_by_lua_block 168
8.4.1 階段說明 168
8.4.2 利用rewrite_by_lua_no_postpone改變執行順序 168
8.4.3 階段控製 169
8.5 access_by_lua_block 169
8.5.1 階段說明 169
8.5.2 利用access_by_lua_no_postpone改變執行順序 170
8.5.3 階段控製 170
8.5.4 動態配置黑白名單 170
8.6 content_by_lua_block 170
8.6.1 階段說明 170
8.6.2 動態調整執行文件的路徑 171
8.7 balancer_by_lua_block 171
8.7.1 階段說明 171
8.7.2 被禁用的Lua API指令 172
8.8 header_filter_by_lua_block 172
8.8.1 階段說明 172
8.8.2 被禁用的Lua API指令 173
8.9 body_filter_by_lua_block 173
8.9.1 階段說明 173
8.9.2 控製響應體數據 173
8.9.3 被禁用的Lua API指令 175
8.10 log_by_lua_block 176
8.10.1 階段說明 176
8.10.2 被禁用的Lua API指令 176
8.11 Lua和ngx.ssl 177
8.12 Ngx_Lua執行階段 177
8.13 小結 180
第9章 Nginx與數據庫的交互 181
9.1 安裝cjson 181
9.2 與MySQL交互 183
9.2.1 安裝lua-resty-mysql模塊 183
9.2.2 讀取MySQL數據 183
9.2.3 執行多條SQL語句 187
9.2.4 防止SQL注入 189
9.3 與Redis交互 189
9.3.1 安裝lua-resty-redis 189
9.3.2 讀/寫Redis 189
9.3.3 管道命令 191
9.3.4 密碼登錄 193
9.3.5 其他執行命令 194
9.4 與數據庫交互的常見問題 194
9.4.1 連接池 194
9.4.2 讀/寫分離 197
9.4.3 分離配置文件和代碼 197
9.5 小結 198
第10章 緩存利器 199
10.1 worker進程的共享內存 200
10.1.1 創建共享內存區域 200
10.1.2 操作共享內存 201
10.1.3 製造消息隊列 205
10.1.4 lua-resty-core 207
10.1.5 配置環境 208
10.2 Lua模塊下的共享內存 209
10.2.1 安裝lua-resty-lrucache 209
10.2.2 使用lua-resty-lrucache進行緩存的方法 209
10.3 當前請求在各執行階段間的數據共享 213
10.3.1 ngx.ctx的使用 213
10.3.2 子請求和內部重定嚮的緩存區彆 214
10.4 利用共享內存配置動態IP地址認證 215
10.5 緩存和數據庫的交互 218
10.5.1 從數據庫獲取數據 218
10.5.2 避免因緩存失效引起的“風暴” 223
10.6 小結 228
第11章 動態管理upstream 229
11.1 實戰需求分析 230
11.2 ngx_http_dyups_module 230
11.2.1 安裝模塊 230
11.2.2 動態管理upstream 230
11.2.3 確保upstream數據的完整性 232
11.3 nginx-upsync-module 233
11.3.1 安裝nginx-upsync-module和Consul 233
11.3.2 Consul的鍵值操作 234
11.3.3 動態管理upstream 235
11.3.4 驗證動態配置功能 237
11.3.5 高可用、高並發設計 237
11.4 基於balancer_by_lua_block的靈活控製 238
11.5 小結 239
第12章 Nginx日誌分析係統 240
12.1 實戰需求分析 240
12.2 ngxtop實時分析 241
12.3 Flume方案的日誌分析 243
12.4 智能化nginx_log_analysis 244
12.4.1 架構重構 244
12.4.2 日誌遠程傳輸 245
12.4.3 時序數據庫 245
12.4.4 日誌規則設計 245
12.5 lua-resty-logger-socket傳輸方案 246
12.5.1 安裝lua-resty-logger-socket 246
12.5.2 遠程傳輸配置 247
12.5.3 參數解讀 248
12.6 時序數據庫InfluxDB 249
12.6.1 安裝InfluxDB 249
12.6.2 基本概念和操作 249
12.6.3 數據分析之查詢函數 250
12.6.4 數據存放之保留策略 251
12.6.5 定時任務之連續查詢 251
12.6.6 客戶端操作之API 252
12.6.7 使用UDP模式傳輸數據 253
12.7 利用lua-resty-http實現API交互 254
12.7.1 安裝lua-resty-http 254
12.7.2 使用方式 254
12.8 提升InfluxDB性能 255
12.9 小結 255
第13章 靜態容災係統 256
13.1 荊棘之路 257
13.2 設計之路 259
13.3 架構流程圖 261
13.3.1 反嚮代理係統 261
13.3.2 日誌分析係統 261
13.3.3 後颱係統 261
13.3.4 爬蟲係統 262
13.3.5 容災的緩存係統 262
13.3.6 時間版本的用途 263
13.3.7 異地容災 263
13.4 核心代碼解說 264
13.4.1 Ngx_Lua應用 264
13.4.2 爬蟲和日誌係統的關係 266
13.4.3 全部容災和部分容災功能 266
13.5 靜態容災的智能關閉方案 267
13.5.1 從日誌分析係統中復製請求 267
13.5.2 利用goreplay復製流量 267
13.5.3 Nginx的鏡像功能 268
13.5.4 灰度驗證容災係統緩存 269
13.6 小結 269
第14章 深入挖掘反嚮代理 270
14.1 驗證碼防禦中心 270
14.2 鑒權管理中心 272
14.2.1 利用auth_request管理鑒權 272
14.2.2 利用Ngx_Lua子請求實現鑒權功能 273
14.3 並行訪問 274
14.3.1 輕綫程的啓動和終止 275
14.3.2 等待和終止輕綫程 276
14.3.3 URL的外部閤並和內部並發 278
14.3.4 使用cosocket實現外部訪問 281
14.4 小結 281
第15章 爬蟲 282
15.1 區分搜索引擎爬蟲和惡意爬蟲 282
15.2 應對搜索引擎爬蟲 284
15.2.1 搜索引擎的User-Agent 284
15.2.2 Robots協議 285
15.2.3 控製搜索引擎爬蟲實戰 286
15.3 應對惡意爬蟲 288
15.3.1 發現惡意爬蟲 288
15.3.2 抵禦惡意爬蟲之禁止訪問 289
15.3.3 抵禦惡意爬蟲之驗證碼攔截 290
15.4 小插麯——使用假數據迷惑惡意爬蟲 290
15.5 小結 291
第16章 性能分析和優化 292
16.1 性能分析場景搭建 292
16.1.1 安裝SystemTap 292
16.1.2 LuaJIT的Debug模式 293
16.1.3 開啓PCRE的Debug模式 294
16.1.4 分析工具下載 294
16.1.5 找齣Debug不支持的包 295
16.2 流量復製 295
16.3 各項指標分析和優化建議 295
16.3.1 連接池使用狀態分析 295
16.3.2 找齣讀/寫頻繁的文件 297
16.3.3 執行階段耗時分析 297
16.3.4 連接數和文件打開數分析 298
16.3.5 找齣CPU“偷竊者” 298
16.3.6 正則錶達式耗時分析 299
16.3.7 找齣消耗CPU資源較多的指令 301
16.3.8 利用火焰圖展示和分析數據 303
16.4 檢查全局變量 305
16.5 小結 305
第17章 值得擁有的OpenResty 306
17.1 OPM 307
17.2 使用DNS提升訪問效率 309
17.3 TCP和UDP服務 310
17.4 多層級緩存 312
17.5 lua-resty-core擴展 313
17.6 字符串分割 313
17.7 Nginx進程管理 313
17.8 全局唯一標識符UUID 315
17.9 “全傢福”awesome-resty 316
17.10 OpenResty,未來! 316
第18章 開發環境下的常見問題 317
18.1 被截斷的響應體 317
18.2 “邪惡”的if 317
18.3 “貪婪”的正則匹配 318
18.4 規範HTTP狀態碼 319
18.5 規範URL 319
18.6 proxy_set_header的誤操作 320
18.7 開發環境下的證書問題 320
18.8 深層次的錯誤重定嚮 323
18.9 壓測環境下的限速和短連接 323
18.10 小結 323
· · · · · · (
收起)