以從前面的章節得到的經驗,大家應該知道這里就是模塊的切入點了。負載均衡模塊的鉤子代碼都是有規律的,這里通過ip_hash模塊來分析這個規律。
static char *
ngx_http_upstream_ip_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_http_upstream_srv_conf_t *uscf;
uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
uscf->peer.init_upstream = ngx_http_upstream_init_ip_hash;
uscf->flags = NGX_HTTP_UPSTREAM_CREATE
|NGX_HTTP_UPSTREAM_MAX_FAILS
|NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
|NGX_HTTP_UPSTREAM_DOWN;
return NGX_CONF_OK;
}
這段代碼中有兩點值得我們注意。一個是uscf->flags的設置,另一個是設置init_upstream回調。
#### 設置uscf->flags[](http://tengine.taobao.org/book/chapter_05.html#uscf-flags "永久鏈接至標題")
1. NGX_HTTP_UPSTREAM_CREATE:創建標志,如果含有創建標志的話,nginx會檢查重復創建,以及必要參數是否填寫;
1. NGX_HTTP_UPSTREAM_MAX_FAILS:可以在server中使用max_fails屬性;
1. NGX_HTTP_UPSTREAM_FAIL_TIMEOUT:可以在server中使用fail_timeout屬性;
1. NGX_HTTP_UPSTREAM_DOWN:可以在server中使用down屬性;
此外還有下面屬性:
1. NGX_HTTP_UPSTREAM_WEIGHT:可以在server中使用weight屬性;
1. NGX_HTTP_UPSTREAM_BACKUP:可以在server中使用backup屬性。
聰明的讀者如果聯想到剛剛遇到的那個神奇的配置錯誤,可以得出一個結論:在負載均衡模塊的指令處理函數中可以設置并修改upstream{}中”server”指令支持的屬性。這是一個很重要的性質,因為不同的負載均衡模塊對各種屬性的支持情況都是不一樣的,那么就需要在解析配置文件的時候檢測出是否使用了不支持的負載均衡屬性并給出錯誤提示,這對于提升系統維護性是很有意義的。但是,這種機制也存在缺陷,正如前面的例子所示,沒有機制能夠追加檢查在更新支持屬性之前已經配置了不支持屬性的”server”指令。
[](http:// "點擊提交Issue,反饋你的意見...")
#### 設置init_upstream回調[](http://tengine.taobao.org/book/chapter_05.html#init-upstream "永久鏈接至標題")
nginx初始化upstream時,會在ngx_http_upstream_init_main_conf函數中調用設置的回調函數初始化負載均衡模塊。這里不太好理解的是uscf的具體位置。通過下面的示意圖,說明upstream負載均衡模塊的配置的內存布局。
從圖上可以看出,MAIN_CONF中ngx_upstream_module模塊的配置項中有一個指針數組upstreams,數組中的每個元素對應就是配置文件中每一個upstream{}的信息。更具體的將會在后面的原理篇討論。
- 上篇: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 模塊編譯,調試與測試