內容簡介
《深入理解Nginx:模組開發與架構解析》是阿里巴巴資深Nginx技術專家嘔心瀝血之作,是作者多年的經驗結晶,也是目前市場上一本通過還原Nginx設計思想,剖析Nginx架構來幫助讀者快速高效開發HTTP模組的圖書。
《深入理解Nginx:模組開發與架構解析》首先通過介紹官方Nginx的基本用法和配置規則,幫助讀者了解一般Nginx模組的用法,然後重點介紹如何開發HTTP模組(含HTTP過濾模組)來得到定製的Nginx,其中包括開發一個功能複雜的模組所需要了解的各種知識,如Nginx的基礎數據結構、配置項的解析、記錄日誌的工具以及upstream、subrequest的使用方法等。在此基礎上,綜合Nginx框架代碼分析Nginx的架構,介紹其設計理念和技巧,進一步幫助讀者自由、有效地姜辨祝白開發出功能豐富、性能一流的Nginx模組。
圖書目錄
前 言
第一部分 Nginx能幫我們做什麼
第1章 研究Nginx前的準備工作
1.1 Nginx是什麼
1.2 為什麼選擇Nginx
1.3 準備工作
1.3.1 Linux作業系統
1.3.2 使用肯想元Nginx的必備軟體
1.3.3 磁碟目錄
1.3.4 Linux核心參數的最佳化
1.3.5 獲取Nginx源碼
1.4 編譯安裝Nginx
1.5 configure詳解
1.5.1 configure的命令參數
1.5.2 configure執行流程
1.5.3 configure生成的檔案
1.6 Nginx的命令行控制
1.7 小結
第2章 Nginx的配趨戶埋置
2.1 運行中的Nginx進程間的關係
2.2 Nginx配置的通用語法
2.2.1 塊配置項
2.2.2 配置項的語法格式
2.2.3 配喇良棵置項的注釋
2.2.4 配置項的單位
2.2.5 在配置中使用變數
2.3 Nginx服務的基本配置
2.3.1 用於調試進程和定位問題灶棵的配置項
2.3.2 正常運行的配置項
2.3.3 最佳化性能的配置項
2.3.4 事件類配置項
2.4.1 虛擬主機與請求的分發
2.4.2 檔案路徑的定義
2.4.3 記憶體及磁碟資源的分配
2.4.4 網路連線的設定
2.4.5 MIME類型獄立悼拘的設定
2.4.6 對客戶端請求的限制
2.4.7 檔案操作的最佳化
2.4.8 對客戶端請求的特殊處理
2.4.9 ngx_http_core_module模組提供的變數
2.5 用HTTP proxy module配置一個反向代理伺服器
2.5.1 負載均衡的基本配置
2.5.2 反向代理的基本配置
2.6 小結
第二部分 如何編寫HTTP模組
第3章 開發一個簡單的HTTP模組
3.1 如何調用HTTP模組
3.2 準備工作
3.2.1 整型的封裝
3.2.2 ngx_str_t數據結構
3.2.3 ngx_list_t數據結構
3.2.4 ngx_table_elt_t數據結構
3.2.5 ngx_buf_t數據結構
3.2.6 ngx_chain_t數據結構
3.3 如何將自己的HTTP模組編譯進Nginx
3.3.1 config檔案的寫法
3.3.2 利用configure腳本將定製的模組加入到Nginx中
3.3.3 直接修改Makefile檔案
3.4 HTTP模組的數據結構
3.5 定義自己的HTTP模組
3.6 處理用戶請求
3.6.1 處理方法的返回值
3.6.2 獲取URI和參數
3.6.3 獲取HTTP頭部
3.6.4 獲取HTTP包體
3.7 傳送回響
3.7.1 發享廈轎送HTTP頭部
3.7.2 將記憶體中的字元串作為包體傳送
3.7.3 經典的"Hello World"示例
3.8 將磁碟檔案作為包體傳送
3.8.1 如何傳送磁碟中的檔案
3.8.2 清理檔案句柄
3.9 用C++語言編寫HTTP模組
3.9.1 編譯方式的修改
3.9.2 程式中的符號轉換
3.10 小結
第4章 配置、error日誌和請求上下文
4.1 http配置項的使用場景
4.2 怎樣使用http配置
4.2.1 分配用於保存配置參數的數據結構
4.2.2 設定配置項的解析方式
4.2.3 使用14種預設方法解析配置項
4.2.4 自定義配置項處理方法
4.2.5 合併配置項
4.3 HTTP配置模型
4.3.1 解析HTTP配置的流程
4.3.2 HTTP配置模型的記憶體布局
4.3.3 如何合併配置項
4.3.4 預設配置項處理方法的工作原理
4.4 error日誌的用法
4.5 請求的上下文
4.5.1 上下文與全異步Web伺服器的關係
4.5.2 如何使用HTTP上下文
4.5.3 HTTP框架如何維護上下文結構
4.6 小結
第5章 訪問第三方服務
5.1 upstream的使用方式
5.1.1 ngx_http_upstream_t結構體
5.1.2 設定upstream的限制性參數
5.1.3 設定需要訪問的第三方伺服器地址
5.1.4 設定回調方法
5.1.5 如何啟動upstream機制
5.2 回調方法的執行場景
5.2.1 create_request回調方法
5.2.2 reinit_request回調方法
5.2.3 finalize_request回調方法
5.2.4 process_header回調方法
5.2.5 rewrite_redirect回調方法
5.2.6 input_filter_init與input_filter回調方法
5.3 使用upstream的示例
5.3.1 upstream的各種配置參數
5.3.2 請求上下文
5.3.3 在create_request方法中構造請求
5.3.4 在process_header方法中解析包頭
5.3.5 在finalize_request方法中釋放資源
5.3.6 在ngx_http_mytest_handler方法中啟動upstream
5.4 subrequest的使用方式
5.4.1 配置子請求的處理方式
5.4.2 實現子請求處理完畢時的回調方法
5.4.3 處理父請求被重新激活後的回調方法
5.4.4 啟動subrequest子請求
5.5 subrequest執行過程中的主要場景
5.5.1 如何啟動subrequest
5.5.2 如何轉發多個子請求的回響包體
5.5.3 子請求如何激活父請求
5.6 subrequest使用的例子
5.6.1 配置檔案中子請求的設定
5.6.2 請求上下文
5.6.3 子請求結束時的處理方法
5.6.4 父請求的回調方法
5.6.5 啟動subrequest
5.7 小結
第6章 開發一個簡單的HTTP過濾模組
6.1 過濾模組的意義
6.2 過濾模組的調用順序
6.2.1 過濾鍊表是如何構成的
6.2.2 過濾鍊表的順序
6.2.3 官方默認HTTP過濾模組的功能簡介
6.3 HTTP過濾模組的開發步驟
6.4 HTTP過濾模組的簡單例子
6.4.1 如何編寫config檔案
6.4.2 配置項和上下文
6.4.3 定義HTTP過濾模組
6.4.4 初始化HTTP過濾模組
6.4.5 處理請求中的HTTP頭部
6.4.6 處理請求中的HTTP包體
6.5 小結
第7章 Nginx提供的高級數據結構
7.1 Nginx提供的高級數據結構概述
7.2 ngx_queue_t雙向鍊表
7.2.1 為什麼設計ngx_queue_t雙向鍊表
7.2.2 雙向鍊表的使用方法
7.2.3 使用雙向鍊表排序的例子
7.2.4 雙向鍊表是如何實現的
7.3 ngx_array_t動態數組
7.3.1 為什麼設計ngx_array_t動態數組
7.3.2 動態數組的使用方法
7.3.3 使用動態數組的例子
7.3.4 動態數組的擴容方式
7.4 ngx_list_t單向鍊表
7.5 ngx_rbtree_t紅黑樹
7.5.1 為什麼設計ngx_rbtree_t紅黑樹
7.5.2 紅黑樹的特性
7.5.3 紅黑樹的使用方法
7.5.4 使用紅黑樹的簡單例子
7.5.5 如何自定義添加成員方法
7.6 ngx_radix_tree_t基數樹
7.6.1 ngx_radix_tree_t基數樹的原理
7.6.2 基數樹的使用方法
7.6.3 使用基數樹的例子
7.7 支持通配符的散列表
7.7.1 ngx_hash_t基本散列表
7.7.2 支持通配符的散列表
7.7.3 帶通配符散列表的使用例子
7.8 小結
第三部分 深入Nginx
第8章 Nginx基礎架構
8.1 Web伺服器設計中的關鍵約束
8.2 Nginx的架構設計
8.2.1 優秀的模組化設計
8.2.2 事件驅動架構
8.2.3 請求的多階段異步處理
8.2.4 管理進程、多工作進程設計
8.2.5 平台無關的代碼實現
8.2.6 記憶體池的設計
8.2.7 使用統一
管道過濾器模式的HTTP過濾模組
8.2.8 其他一些用戶模組
8.3 Nginx框架中的核心結構體ngx_cycle_t
8.3.1 ngx_listening_t結構體
8.3.2 ngx_cycle_t結構體
8.3.3 ngx_cycle_t支持的方法
8.4 Nginx啟動時框架的處理流程
8.5 worker進程是如何工作的
8.6 master進程是如何工作的
8.7 小結
第9章 事件模組
9.1 事件處理框架概述
9.2 Nginx事件的定義
9.3 Nginx連線的定義
9.3.1 被動連線
9.3.2 主動連線
9.3.3 ngx_connection_t連線池
9.4 ngx_events_module核心模組
9.4.1 如何管理所有事件模組的配置項
9.4.2 管理事件模組
9.5 ngx_event_core_module事件模組
9.6 epoll事件驅動模組
9.6.1 epoll的原理和用法
9.6.2 如何使用epoll
9.6.3 ngx_epoll_module模組的實現
9.7 定時器事件
9.7.1 快取時間的管理
9.7.2 快取時間的精度
9.7.3 定時器的實現
9.8 事件驅動框架的處理流程
9.8.1 如何建立新連線
9.8.2 如何解決"驚群"問題
9.8.3 如何實現負載均衡
9.8.4 post事件佇列
9.8.5 ngx_process_events_and_timers流程
9.9 檔案的異步I/O
9.9.1 Linux核心提供的檔案異步I/O
9.9.2 ngx_epoll_module模組中實現的針對檔案的異步I/O
9.10 小結
第10章 HTTP框架的初始化
10.1 HTTP框架概述
10.2 管理HTTP模組的配置項
10.2.1 管理main級別下的配置項
10.2.2 管理server級別下的配置項
10.2.3 管理location級別下的配置項
10.2.4 不同級別配置項的合併
10.3 監聽連線埠的管理
10.4 server的快速檢索
10.5 location的快速檢索
10.6.1 HTTP處理階段的普適規則
10.6.2 NGX_HTTP_POST_READ_PHASE階段
10.6.3 NGX_HTTP_SERVER_REWRITE_PHASE階段
10.6.4 NGX_HTTP_FIND_CONFIG_PHASE階段
10.6.5 NGX_HTTP_REWRITE_PHASE階段
10.6.6 NGX_HTTP_POST_REWRITE_PHASE階段
10.6.7 NGX_HTTP_PREACCESS_PHASE階段
10.6.8 NGX_HTTP_ACCESS_PHASE階段
10.6.9 NGX_HTTP_POST_ACCESS_PHASE階段
10.6.10 NGX_HTTP_TRY_FILES_PHASE階段
10.6.11 NGX_HTTP_CONTENT_PHASE階段
10.6.12 NGX_HTTP_LOG_PHASE階段
10.7 HTTP框架的初始化流程
10.8 小結
第11章 HTTP框架的執行流程
11.1 HTTP框架執行流程概述
11.2 新連線建立時的行為
11.3 第一次可讀事件的處理
11.4 接收HTTP請求行
11.5 接收HTTP頭部
11.6 處理HTTP請求
11.6.1 ngx_http_core_generic_phase
11.6.2 ngx_http_core_rewrite_phase
11.6.3 ngx_http_core_access_phase
11.6.4 ngx_http_core_content_phase
11.7 subrequest與post請求
11.8 處理HTTP包體
11.8.1 接收包體
11.8.2 放棄接收包體
11.9 傳送HTTP回響
11.9.1 ngx_http_send_header
11.9.2 ngx_http_output_filter
11.9.3 ngx_http_writer
11.10 結束HTTP請求
11.10.1 ngx_http_close_connection
11.10.2 ngx_http_free_request
11.10.3 ngx_http_close_request
11.10.4 ngx_http_finalize_connection
11.10.5 ngx_http_terminate_request
11.10.6 ngx_http_finalize_request
11.11 小結
第12章 upstream機制的設計與實現
12.1 upstream機制概述
12.1.1 設計目的
12.1.2 ngx_http_upstream_t數據結構的意義
12.1.3 ngx_http_upstream_conf_t配置結構體
12.2 啟動upstream
12.3 與上游伺服器建立連線
12.4 傳送請求到上游伺服器
12.5 接收上游伺服器的回響頭部
12.5.2 處理包體的3種方式
12.5.3 接收回響頭部的流程
12.6 不轉發回響時的處理流程
12.6.1 input_filter方法的設計
12.6.2 默認的input_filter方法
12.6.3 接收包體的流程
12.7 以下游網速優先來轉發回響
12.7.1 轉發回響的包頭
12.7.2 轉發回響的包體
12.8 以上游網速優先來轉發回響
12.8.1 ngx_event_pipe_t結構體的意義
12.8.2 轉發回響的包頭
12.8.3 轉發回響的包體
12.8.4 ngx_event_pipe_read_upstream方法
12.8.5 ngx_event_pipe_write_to_downstream方法
12.9 結束upstream請求
12.10 小結
第13章 郵件代理模組
13.1 郵件代理伺服器的功能
13.2 郵件模組的處理框架
13.2.1 一個請求的8個獨立處理階段
13.2.2 郵件類模組的定義
13.2.3 郵件框架的初始化
13.3 初始化請求
13.3.1 描述郵件請求的ngx_mail_session_t結構體
13.3.2 初始化郵件請求的流程
13.4 接收並解析客戶端請求
13.5 郵件認證
13.5.1 ngx_mail_auth_http_ctx_t結構體
13.5.3 傳送請求到認證伺服器
13.5.4 接收並解析回響
13.6.1 ngx_mail_proxy_ctx_t結構體
13.6.2 向上游郵件伺服器發起連線
13.6.3 與郵件伺服器認證互動的過程
13.7 透傳上游郵件伺服器與客戶端間的流
13.8 小結
第14章 進程間的通信機制
14.1 概述
14.2 共享記憶體
14.3 原子操作
14.3.1 不支持原子庫下的原子操作
14.3.3 自旋鎖
14.4 Nginx頻道
14.5 信號
14.6 信號量
14.7 檔案鎖
14.8 互斥鎖
14.8.1 檔案鎖實現的ngx_shmtx_t鎖
14.8.2 原子變數實現的ngx_shmtx_t鎖
14.9 小結
2.5.1 負載均衡的基本配置
2.5.2 反向代理的基本配置
2.6 小結
第二部分 如何編寫HTTP模組
第3章 開發一個簡單的HTTP模組
3.1 如何調用HTTP模組
3.2 準備工作
3.2.1 整型的封裝
3.2.2 ngx_str_t數據結構
3.2.3 ngx_list_t數據結構
3.2.4 ngx_table_elt_t數據結構
3.2.5 ngx_buf_t數據結構
3.2.6 ngx_chain_t數據結構
3.3 如何將自己的HTTP模組編譯進Nginx
3.3.1 config檔案的寫法
3.3.2 利用configure腳本將定製的模組加入到Nginx中
3.3.3 直接修改Makefile檔案
3.4 HTTP模組的數據結構
3.5 定義自己的HTTP模組
3.6 處理用戶請求
3.6.1 處理方法的返回值
3.6.2 獲取URI和參數
3.6.3 獲取HTTP頭部
3.6.4 獲取HTTP包體
3.7 傳送回響
3.7.1 傳送HTTP頭部
3.7.2 將記憶體中的字元串作為包體傳送
3.7.3 經典的"Hello World"示例
3.8 將磁碟檔案作為包體傳送
3.8.1 如何傳送磁碟中的檔案
3.8.2 清理檔案句柄
3.9 用C++語言編寫HTTP模組
3.9.1 編譯方式的修改
3.9.2 程式中的符號轉換
3.10 小結
第4章 配置、error日誌和請求上下文
4.1 http配置項的使用場景
4.2 怎樣使用http配置
4.2.1 分配用於保存配置參數的數據結構
4.2.2 設定配置項的解析方式
4.2.3 使用14種預設方法解析配置項
4.2.4 自定義配置項處理方法
4.2.5 合併配置項
4.3 HTTP配置模型
4.3.1 解析HTTP配置的流程
4.3.2 HTTP配置模型的記憶體布局
4.3.3 如何合併配置項
4.3.4 預設配置項處理方法的工作原理
4.4 error日誌的用法
4.5 請求的上下文
4.5.1 上下文與全異步Web伺服器的關係
4.5.2 如何使用HTTP上下文
4.5.3 HTTP框架如何維護上下文結構
4.6 小結
第5章 訪問第三方服務
5.1 upstream的使用方式
5.1.1 ngx_http_upstream_t結構體
5.1.2 設定upstream的限制性參數
5.1.3 設定需要訪問的第三方伺服器地址
5.1.4 設定回調方法
5.1.5 如何啟動upstream機制
5.2 回調方法的執行場景
5.2.1 create_request回調方法
5.2.2 reinit_request回調方法
5.2.3 finalize_request回調方法
5.2.4 process_header回調方法
5.2.5 rewrite_redirect回調方法
5.2.6 input_filter_init與input_filter回調方法
5.3 使用upstream的示例
5.3.1 upstream的各種配置參數
5.3.2 請求上下文
5.3.3 在create_request方法中構造請求
5.3.4 在process_header方法中解析包頭
5.3.5 在finalize_request方法中釋放資源
5.3.6 在ngx_http_mytest_handler方法中啟動upstream
5.4 subrequest的使用方式
5.4.1 配置子請求的處理方式
5.4.2 實現子請求處理完畢時的回調方法
5.4.3 處理父請求被重新激活後的回調方法
5.4.4 啟動subrequest子請求
5.5 subrequest執行過程中的主要場景
5.5.1 如何啟動subrequest
5.5.2 如何轉發多個子請求的回響包體
5.5.3 子請求如何激活父請求
5.6 subrequest使用的例子
5.6.1 配置檔案中子請求的設定
5.6.2 請求上下文
5.6.3 子請求結束時的處理方法
5.6.4 父請求的回調方法
5.6.5 啟動subrequest
5.7 小結
第6章 開發一個簡單的HTTP過濾模組
6.1 過濾模組的意義
6.2 過濾模組的調用順序
6.2.1 過濾鍊表是如何構成的
6.2.2 過濾鍊表的順序
6.2.3 官方默認HTTP過濾模組的功能簡介
6.3 HTTP過濾模組的開發步驟
6.4 HTTP過濾模組的簡單例子
6.4.1 如何編寫config檔案
6.4.2 配置項和上下文
6.4.3 定義HTTP過濾模組
6.4.4 初始化HTTP過濾模組
6.4.5 處理請求中的HTTP頭部
6.4.6 處理請求中的HTTP包體
6.5 小結
第7章 Nginx提供的高級數據結構
7.1 Nginx提供的高級數據結構概述
7.2 ngx_queue_t雙向鍊表
7.2.1 為什麼設計ngx_queue_t雙向鍊表
7.2.2 雙向鍊表的使用方法
7.2.3 使用雙向鍊表排序的例子
7.2.4 雙向鍊表是如何實現的
7.3 ngx_array_t動態數組
7.3.1 為什麼設計ngx_array_t動態數組
7.3.2 動態數組的使用方法
7.3.3 使用動態數組的例子
7.3.4 動態數組的擴容方式
7.4 ngx_list_t單向鍊表
7.5 ngx_rbtree_t紅黑樹
7.5.1 為什麼設計ngx_rbtree_t紅黑樹
7.5.2 紅黑樹的特性
7.5.3 紅黑樹的使用方法
7.5.4 使用紅黑樹的簡單例子
7.5.5 如何自定義添加成員方法
7.6 ngx_radix_tree_t基數樹
7.6.1 ngx_radix_tree_t基數樹的原理
7.6.2 基數樹的使用方法
7.6.3 使用基數樹的例子
7.7 支持通配符的散列表
7.7.1 ngx_hash_t基本散列表
7.7.2 支持通配符的散列表
7.7.3 帶通配符散列表的使用例子
7.8 小結
第三部分 深入Nginx
第8章 Nginx基礎架構
8.1 Web伺服器設計中的關鍵約束
8.2 Nginx的架構設計
8.2.1 優秀的模組化設計
8.2.2 事件驅動架構
8.2.3 請求的多階段異步處理
8.2.4 管理進程、多工作進程設計
8.2.5 平台無關的代碼實現
8.2.6 記憶體池的設計
8.2.7 使用統一
管道過濾器模式的HTTP過濾模組
8.2.8 其他一些用戶模組
8.3 Nginx框架中的核心結構體ngx_cycle_t
8.3.1 ngx_listening_t結構體
8.3.2 ngx_cycle_t結構體
8.3.3 ngx_cycle_t支持的方法
8.4 Nginx啟動時框架的處理流程
8.5 worker進程是如何工作的
8.6 master進程是如何工作的
8.7 小結
第9章 事件模組
9.1 事件處理框架概述
9.2 Nginx事件的定義
9.3 Nginx連線的定義
9.3.1 被動連線
9.3.2 主動連線
9.3.3 ngx_connection_t連線池
9.4 ngx_events_module核心模組
9.4.1 如何管理所有事件模組的配置項
9.4.2 管理事件模組
9.5 ngx_event_core_module事件模組
9.6 epoll事件驅動模組
9.6.1 epoll的原理和用法
9.6.2 如何使用epoll
9.6.3 ngx_epoll_module模組的實現
9.7 定時器事件
9.7.1 快取時間的管理
9.7.2 快取時間的精度
9.7.3 定時器的實現
9.8 事件驅動框架的處理流程
9.8.1 如何建立新連線
9.8.2 如何解決"驚群"問題
9.8.3 如何實現負載均衡
9.8.4 post事件佇列
9.8.5 ngx_process_events_and_timers流程
9.9 檔案的異步I/O
9.9.1 Linux核心提供的檔案異步I/O
9.9.2 ngx_epoll_module模組中實現的針對檔案的異步I/O
9.10 小結
第10章 HTTP框架的初始化
10.1 HTTP框架概述
10.2 管理HTTP模組的配置項
10.2.1 管理main級別下的配置項
10.2.2 管理server級別下的配置項
10.2.3 管理location級別下的配置項
10.2.4 不同級別配置項的合併
10.3 監聽連線埠的管理
10.4 server的快速檢索
10.5 location的快速檢索
10.6.1 HTTP處理階段的普適規則
10.6.2 NGX_HTTP_POST_READ_PHASE階段
10.6.3 NGX_HTTP_SERVER_REWRITE_PHASE階段
10.6.4 NGX_HTTP_FIND_CONFIG_PHASE階段
10.6.5 NGX_HTTP_REWRITE_PHASE階段
10.6.6 NGX_HTTP_POST_REWRITE_PHASE階段
10.6.7 NGX_HTTP_PREACCESS_PHASE階段
10.6.8 NGX_HTTP_ACCESS_PHASE階段
10.6.9 NGX_HTTP_POST_ACCESS_PHASE階段
10.6.10 NGX_HTTP_TRY_FILES_PHASE階段
10.6.11 NGX_HTTP_CONTENT_PHASE階段
10.6.12 NGX_HTTP_LOG_PHASE階段
10.7 HTTP框架的初始化流程
10.8 小結
第11章 HTTP框架的執行流程
11.1 HTTP框架執行流程概述
11.2 新連線建立時的行為
11.3 第一次可讀事件的處理
11.4 接收HTTP請求行
11.5 接收HTTP頭部
11.6 處理HTTP請求
11.6.1 ngx_http_core_generic_phase
11.6.2 ngx_http_core_rewrite_phase
11.6.3 ngx_http_core_access_phase
11.6.4 ngx_http_core_content_phase
11.7 subrequest與post請求
11.8 處理HTTP包體
11.8.1 接收包體
11.8.2 放棄接收包體
11.9 傳送HTTP回響
11.9.1 ngx_http_send_header
11.9.2 ngx_http_output_filter
11.9.3 ngx_http_writer
11.10 結束HTTP請求
11.10.1 ngx_http_close_connection
11.10.2 ngx_http_free_request
11.10.3 ngx_http_close_request
11.10.4 ngx_http_finalize_connection
11.10.5 ngx_http_terminate_request
11.10.6 ngx_http_finalize_request
11.11 小結
第12章 upstream機制的設計與實現
12.1 upstream機制概述
12.1.1 設計目的
12.1.2 ngx_http_upstream_t數據結構的意義
12.1.3 ngx_http_upstream_conf_t配置結構體
12.2 啟動upstream
12.3 與上游伺服器建立連線
12.4 傳送請求到上游伺服器
12.5 接收上游伺服器的回響頭部
12.5.2 處理包體的3種方式
12.5.3 接收回響頭部的流程
12.6 不轉發回響時的處理流程
12.6.1 input_filter方法的設計
12.6.2 默認的input_filter方法
12.6.3 接收包體的流程
12.7 以下游網速優先來轉發回響
12.7.1 轉發回響的包頭
12.7.2 轉發回響的包體
12.8 以上游網速優先來轉發回響
12.8.1 ngx_event_pipe_t結構體的意義
12.8.2 轉發回響的包頭
12.8.3 轉發回響的包體
12.8.4 ngx_event_pipe_read_upstream方法
12.8.5 ngx_event_pipe_write_to_downstream方法
12.9 結束upstream請求
12.10 小結
第13章 郵件代理模組
13.1 郵件代理伺服器的功能
13.2 郵件模組的處理框架
13.2.1 一個請求的8個獨立處理階段
13.2.2 郵件類模組的定義
13.2.3 郵件框架的初始化
13.3 初始化請求
13.3.1 描述郵件請求的ngx_mail_session_t結構體
13.3.2 初始化郵件請求的流程
13.4 接收並解析客戶端請求
13.5 郵件認證
13.5.1 ngx_mail_auth_http_ctx_t結構體
13.5.3 傳送請求到認證伺服器
13.5.4 接收並解析回響
13.6.1 ngx_mail_proxy_ctx_t結構體
13.6.2 向上游郵件伺服器發起連線
13.6.3 與郵件伺服器認證互動的過程
13.7 透傳上游郵件伺服器與客戶端間的流
13.8 小結
第14章 進程間的通信機制
14.1 概述
14.2 共享記憶體
14.3 原子操作
14.3.1 不支持原子庫下的原子操作
14.3.3 自旋鎖
14.4 Nginx頻道
14.5 信號
14.6 信號量
14.7 檔案鎖
14.8 互斥鎖
14.8.1 檔案鎖實現的ngx_shmtx_t鎖
14.8.2 原子變數實現的ngx_shmtx_t鎖
14.9 小結