nginx收到一個請求以后,如果發現需要訪問upstream,就會執行對應的peer.init函數。這是在初始化配置時設置的回調函數。這個函數最重要的作用是構造一張表,當前請求可以使用的upstream服務器被依次添加到這張表中。之所以需要這張表,最重要的原因是如果upstream服務器出現異常,不能提供服務時,可以從這張表中取得其他服務器進行重試操作。此外,這張表也可以用于負載均衡的計算。之所以構造這張表的行為放在這里而不是在前面初始化配置的階段,是因為upstream需要為每一個請求提供獨立隔離的環境。
為了討論peer.init的核心,我們還是看IP hash模塊的實現:
[](http:// "點擊提交Issue,反饋你的意見...")
r->upstream->peer.data = &iphp->rrp;
ngx_http_upstream_init_round_robin_peer(r, us);
r->upstream->peer.get = ngx_http_upstream_get_ip_hash_peer;
第一行是設置數據指針,這個指針就是指向前面提到的那張表;
第二行是調用Round Robin模塊的回調函數對該模塊進行請求初始化。面前已經提到,一個負載均衡模塊可以調用其他負載均衡模塊以提供功能的補充。
第三行是設置一個新的回調函數get。該函數負責從表中取出某個服務器。除了get回調函數,還有另一個r->upstream->peer.free的回調函數。該函數在upstream請求完成后調用,負責做一些善后工作。比如我們需要維護一個upstream服務器訪問計數器,那么可以在get函數中對其加1,在free中對其減1。如果是SSL的話,nginx還提供兩個回調函數peer.set_session和peer.save_session。一般來說,有兩個切入點實現負載均衡算法,其一是在這里,其二是在get回調函數中。
- 上篇: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 模塊編譯,調試與測試