nginx使用ip_hash粘性会话的IP是什么?

nginx是否使用直接客户端的ip为ip_hash,或者它是否也观察到X-forwarded-for HTTP头用作ip_hash的IP地址?

例如,在某些使用共享代理服务器的客户端访问nginx负载均衡器(w / ip_hash)的情况下,所有这些客户端是否都会散列到同一个节点?

或者,nginx会使用X-forwarded-for头将它们散列到不同的节点上?

从:

http://wiki.nginx.org/HttpUpstreamModule#ip_hash

散列的关键是客户端的C类networking地址。

还来自:

nginx-0.8.53/src/http/modules/ngx_http_upstream_ip_hash_module.c: 91 static ngx_int_t 92 ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r, 93 ngx_http_upstream_srv_conf_t *us) 94 { ... 114 if (r->connection->sockaddr->sa_family == AF_INET) { 115 116 sin = (struct sockaddr_in *) r->connection->sockaddr; 117 p = (u_char *) &sin->sin_addr.s_addr; 118 iphp->addr[0] = p[0]; 119 iphp->addr[1] = p[1]; 120 iphp->addr[2] = p[2]; 121 122 } else { 123 iphp->addr[0] = 0; 124 iphp->addr[1] = 0; 125 iphp->addr[2] = 0; 126 } ... 164 for (i = 0; i < 3; i++) { 165 hash = (hash * 113 + iphp->addr[i]) % 6271; 166 } 

validation文档。 修改代码来包含像XFF这样的数据是相当容易的。

虽然这个问题是相当古老的,答案是正确的,经过一些挖掘解决我自己的负载平衡问题,我发现有一个更新的选项,使客户端IP基于X-Forwarded-For或X-Real-IP和当与ip_hash指令结合使用时,它将使用用户的实际IP作为散列来平衡负载。

http://nginx.org/en/docs/http/ngx_http_realip_module.html

  set_real_ip_from 127.0.0.1; # nginx and varnish on other ports real_ip_header X-Real-IP; # or X-Forwarded-For # real_ip_recursive on; # doesn't work on nginx 1.0