以从前面的章节得到的经验,大家应该知道这里就是模块的切入点了。负载均衡模块的钩子代码都是有规律的,这里通过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负载均衡模块的配置的内存布局。![](https://box.kancloud.cn/2015-08-12_55cb06b219536.PNG) 从图上可以看出,MAIN_CONF中ngx_upstream_module模块的配置项中有一个指针数组upstreams,数组中的每个元素对应就是配置文件中每一个upstream{}的信息。更具体的将会在后面的原理篇讨论。