负载均衡算法解析
1、nginx-轮询
1 |
|
2、nginx-ip_hash
1 |
|
1 |
|
3、hash
使用:
1 |
|
当在 Nginx 配置中使用 hash $http_x_forwarded_for;
作为负载均衡的键时,hash用的就是真实客户端ip,ngx_http_complex_value
函数将用于计算 X-Forwarded-For
HTTP 请求头的值,并将该值赋给 hp->key
。以下是该过程的详细说明:
- 复杂值初始化:
- 在 Nginx 配置阶段,当遇到
hash $http_x_forwarded_for;
配置时,相关的配置处理函数(如ngx_http_upstream_hash
)将初始化一个ngx_http_complex_value_t
结构体,这里即hcf->key
。
- 在 Nginx 配置阶段,当遇到
- 请求处理阶段:
- 当一个请求到达并需要进行上游处理时,
ngx_http_upstream_init_hash_peer
函数被调用。
- 当一个请求到达并需要进行上游处理时,
- 执行复杂值:
ngx_http_complex_value
函数被用来执行hcf->key
中定义的复杂值,这个复杂值就是$http_x_forwarded_for
。
- 计算哈希键:
ngx_http_complex_value
函数解析$http_x_forwarded_for
,这通常意味着它将获取请求的X-Forwarded-For
头的值。
- 值的变化:
- 在执行
ngx_http_complex_value(r, &hcf->key, &hp->key)
之前,hp->key
是未初始化的。 - 执行后,如果函数返回
NGX_OK
,则hp->key
将包含X-Forwarded-For
头的值,这可能是一个单一的 IP 地址或者一个 IP 地址列表,具体取决于X-Forwarded-For
头的内容。
- 在执行
- 错误处理:
- 如果
ngx_http_complex_value
函数返回NGX_ERROR
,这通常意味着在尝试获取或计算X-Forwarded-For
头的值时出现了问题,比如内存分配失败。在这种情况下,ngx_http_upstream_init_hash_peer
函数将返回NGX_ERROR
,导致当前请求的上游处理初始化失败。
- 如果
- 调试日志:
- 如果
ngx_http_complex_value
成功执行,将记录一条调试日志,显示 “upstream hash key” 以及计算出的键值。
- 如果
- 继续处理:
- 如果
ngx_http_complex_value
成功,函数将继续执行,hp->key
将用于后续的哈希计算和对等体选择过程。
- 如果
总结来说,if (ngx_http_complex_value(r, &hcf->key, &hp->key) != NGX_OK) { return NGX_ERROR; }
这段代码是用来检查 ngx_http_complex_value
函数是否成功执行,并根据执行结果决定是否继续处理请求。如果 X-Forwarded-For
头存在且格式正确,hp->key
将被赋予相应的值;如果获取头信息失败或在执行过程中遇到错误,请求处理将被中止,并返回错误状态。
初始化:
1 |
|
设置值:
1 |
|
应用:
1 |
|
4、sticky
参考自:陶辉《深入剖析Nginx负载均衡算法》:https://www.nginx.org.cn/article/detail/440
负载均衡算法解析
https://zjfans.github.io/2024/06/02/Nginx负载均衡算法解析/