nginx 针对 ip_hash 粘性会话使用哪个 IP?

nginx 针对 ip_hash 粘性会话使用哪个 IP?

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

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

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

答案1

从:

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

哈希的密钥是客户端的 C 类网络地址。

另请参阅:

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         }

验证文档。修改代码以包含 XFF 之类的数据相当容易。

答案2

虽然这个问题已经很老了,而且答案是正确的,但是在解决我自己的负载平衡问题之后,我发现有一个较新的选项可以使客户端 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

相关内容