What IP does nginx use for ip_hash sticky sessions?
From:
http://wiki.nginx.org/HttpUpstreamModule#ip_hash
The key for the hash is the class-C network address of the client.
Also from:
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 }
Validating the documentation. It would be pretty easy to modify the code to include data like the XFF.
While this question is quite old and the answer is correct, after some digging to resolve my own load balancing problem I found that there is a newer option to make the client ip based on the X-Forwarded-For or X-Real-IP and when combined with the ip_hash directive it properly balances load using the user's actual IP as the hash.
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