先從下列結構體開始,他也被包含在ngx_http_upstream_srv_conf_s結構中
1 2 3 4 5 6 7 |
|
以下重點分析下兩個成員變數init_upstream和init
init_init_init_uppstream >每個upsteam配置區塊塊執行一次;
可透過配置keepalive或ip_hash功能配置,即碰到keepalive或ip_hash配置被調用,如果沒有配置預設實作為ngx_http_upstream_init_round_robin函數,在配置初始化函數ngx_http_upstream_init_main_conf被調用,預設為主要功能是有2個 >
us->servers陣列中取得資料初始化ngx_http_upstream_rr_peers_t結構存房子us->peer.data中供init函式使用;
init函數對於每一個到oringin的請求執行一次;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
ngx_http_upstream_init_request->ngx_http_upstream_connect->ngx_event_connect_peer->
rc = pc->get(pc, pc->data);
round_robin ,ip_hash,keepalive模組之間關係
round_robin和ip_hash模組都用於查找嚇一跳ip,keepalive功能用於找到嚇一跳ip位址之後,透過ip位址尋找是否已經存在可用的connection,所以兩個模組的get實作方式不同,ip_hash是現使用ip_hash找下一下,查找失敗後採用預設的round_robin功能,
而keepalive功能是在ip查找到之後才能使用,ip查找可以使用ip_hash的方法,也可以使用round_robin提供的方法,
如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
可以看出keepalive類似於裝飾器模型,即在下一跳ip上增加一個keepalive的功能,keepalive包含origin實現的函數指針
而ip_hash和round_robin 能類似策略模型,也就是在init_upstream中設定對於request查找ip的不同策略。
而這三個模組整體關係,類似於建造者之間關係,即都必須實現且按順序調用init_upstream,init,get,free等函數。
後記:
round_robin多提供了一個create函數,用於upstream中resolved成員被設定的情況,例如透過
proxy_pass http://$vhost;的方式設定到origin的位址。 此時init被create代替,且不能在具有keepalive和ip_hash功能。 keepalive和iphash都只能用於upstream模組中。
以上就介紹了 nginx roundrobin 、keepalive、ip_hash模組分析,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。