Nginx

nginx 為 ip_hash 粘性會話使用什麼 IP?

  • August 19, 2015

nginx 是否將直接客戶端的 IP 用於 ip_hash,或者它是否還觀察 X-forwarded-for HTTP 標頭用作 ip_hash 的 IP 地址?

例如,在某些使用共享代理伺服器的客戶端訪問帶有 ip_hash 的 nginx 負載平衡器的情況下,所有這些客戶端是否會散列到同一個節點?

或者 nginx 會使用 X-forwarded-for 標頭將它們散列到不同的節點?

從:

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 之類的數據將非常容易。

引用自:https://serverfault.com/questions/310729