### POST_READ階段[](http://tengine.taobao.org/book/chapter_12.html#post-read "永久鏈接至標題")
POST_READ階段是nginx處理請求流程中第一個可以添加模塊函數的階段,任何需要在接收完請求頭之后立刻處理的邏輯可以在該階段注冊處理函數。nginx源碼中只有realip模塊在該階段注冊了函數,當nginx前端多了一個7層負載均衡層,并且客戶端的真實ip被前端保存在請求頭中時,該模塊用來將客戶端的ip替換為請求頭中保存的值。realip模塊之所以在POST_READ階段執行的原因是它需要在其他模塊執行之前悄悄的將客戶端ip替換為真實值,而且它需要的信息僅僅只是請求頭。一般很少有模塊需要注冊在POST_READ階段,realip模塊默認沒有編譯進nginx。
POST_READ階段的checker函數是ngx_http_core_generic_phase,這個函數是nginx phase默認的checker函數,后面的PREACCESS phase也是用checker,下面對它做一下介紹:
[](http:// "點擊提交Issue,反饋你的意見...")
ngx_int_t
ngx_http_core_generic_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)
{
ngx_int_t rc;
/*
* generic phase checker,
* used by the post read and pre-access phases
*/
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"generic phase: %ui", r->phase_handler);
rc = ph->handler(r);
if (rc == NGX_OK) {
r->phase_handler = ph->next;
return NGX_AGAIN;
}
if (rc == NGX_DECLINED) {
r->phase_handler++;
return NGX_AGAIN;
}
if (rc == NGX_AGAIN || rc == NGX_DONE) {
return NGX_OK;
}
/* rc == NGX_ERROR || rc == NGX_HTTP_... */
ngx_http_finalize_request(r, rc);
return NGX_OK;
}
這個函數邏輯非常簡單,調用該phase注冊的handler函數,需要注意的是該函數對handler返回值的處理,一般而言handler返回:
<table class="docutils field-list" frame="void" rules="none" style="margin: 0px -0.5em; border: 0px; color: rgb(0, 0, 0); font-family: 'segoe UI', sans-serif; letter-spacing: -0.1599999964237213px; line-height: 24px; white-space: normal; background-color: rgb(255, 255, 255);"><colgroup><col class="field-name"/><col class="field-body"/></colgroup><tbody valign="top"><tr class="field-odd field"><th class="field-name" style="padding: 1px 8px 1px 5px; border: 0px !important;">NGX_OK:</th><td class="field-body" style="padding: 1px 8px 1px 5px; border: 0px !important;">表示該階段已經處理完成,需要轉入下一個階段;</td></tr><tr class="field-even field"><th class="field-name" style="padding: 1px 8px 1px 5px; border: 0px !important;">NG_DECLINED:</th><td class="field-body" style="padding: 1px 8px 1px 5px; border: 0px !important;">表示需要轉入本階段的下一個handler繼續處理;</td></tr><tr class="field-odd field"><th class="field-name" colspan="2" style="padding: 1px 8px 1px 5px; border: 0px !important;">NGX_AGAIN, NGX_DONE:</th></tr><tr class="field-odd field"><td style="padding: 1px 8px 1px 5px; border: 0px !important;">?</td><td class="field-body" style="padding: 1px 8px 1px 5px; border: 0px !important;">表示需要等待某個事件發生才能繼續處理(比如等待網絡IO),此時Nginx為了不阻塞其他請求的處理,必須中斷當前請求的執行鏈,等待事件發生之后繼續執行該handler;</td></tr><tr class="field-even field"><th class="field-name" style="padding: 1px 8px 1px 5px; border: 0px !important;">NGX_ERROR:</th><td class="field-body" style="padding: 1px 8px 1px 5px; border: 0px !important;">表示發生了錯誤,需要結束該請求。</td></tr></tbody></table>
checker函數根據handler函數的不同返回值,給上一層的ngx_http_core_run_phases函數返回NGX_AGAIN或者NGX_OK,如果期望上一層繼續執行后面的phase則需要確保checker函數不是返回NGX_OK,不同checker函數對handler函數的返回值處理還不太一樣,開發模塊時需要確保相應階段的checker函數對返回值的處理在你的預期之內。
- 上篇:nginx模塊開發篇
- nginx平臺初探
- 初探nginx架構
- nginx基礎概念
- connection
- request
- keepalive
- pipe
- lingering_close
- 基本數據結構
- ngx_str_t
- ngx_pool_t
- ngx_array_t
- ngx_hash_t
- ngx_hash_wildcard_t
- ngx_hash_combined_t
- ngx_hash_keys_arrays_t
- ngx_chain_t
- ngx_buf_t
- ngx_list_t
- ngx_queue_t
- nginx的配置系統
- 指令參數
- 指令上下文
- nginx的模塊化體系結構
- 模塊的分類
- nginx的請求處理
- handler模塊
- handler模塊簡介
- 模塊的基本結構
- 模塊配置結構
- 模塊配置指令
- 模塊上下文結構
- 模塊的定義
- handler模塊的基本結構
- handler模塊的掛載
- handler的編寫步驟
- 示例: hello handler 模塊
- handler模塊的編譯和使用
- 更多handler模塊示例分析
- http access module
- http static module
- http log module
- 過濾模塊
- 過濾模塊簡介
- 過濾模塊的分析
- upstream模塊
- upstream模塊
- upstream模塊接口
- memcached模塊分析
- 本節回顧
- 負載均衡模塊
- 配置
- 指令
- 鉤子
- 初始化配置
- 初始化請求
- peer.get和peer.free回調函數
- 本節回顧
- 其他模塊
- core模塊
- event模塊
- 模塊開發高級篇
- 變量
- 下篇:nginx原理解析篇
- nginx架構詳解
- nginx的源碼目錄結構
- nginx的configure原理
- 模塊編譯順序
- nginx基礎設施
- 內存池
- nginx的啟動階段
- 概述
- 共有流程
- 配置解析
- nginx的請求處理階段
- 接收請求流程
- http請求格式簡介
- 請求頭讀取
- 解析請求行
- 解析請求頭
- 請求體讀取
- 讀取請求體
- 丟棄請求體
- 多階段處理請求
- 多階段執行鏈
- POST_READ階段
- SERVER_REWRITE階段
- FIND_CONFIG階段
- REWRITE階段
- POST_REWRITE階段
- PREACCESS階段
- ACCESS階段
- POST_ACCESS階段
- TRY_FILES階段
- CONTENT階段
- LOG階段
- Nginx filter
- header filter分析
- body filter分析
- ngx_http_copy_filter_module分析
- ngx_http_write_filter_module分析
- subrequest原理解析
- https請求處理解析
- 附錄A 編碼風格
- 附錄B 常用API
- 附錄C 模塊編譯,調試與測試