Windows下Nginx upstream hash一致性哈希配置

星枫姑娘_9641

星枫姑娘_9641

2026-04-02

689人浏览

原创

Windows下Nginx原生hash不支持一致性哈希,仅支持普通哈希取模;增减后端节点会导致大部分key重映射。可行方案为使用OpenResty(含Lua实现一致性哈希)或改用Nginx Plus(但无Windows版)。

windows下nginx upstream hash一致性哈希配置

Windows 下 Nginx 的 upstream hash 指令本身不支持一致性哈希(consistent hashing),这是关键前提。Nginx 官方版(包括 Windows 编译版)的 hash 指令仅支持普通哈希 + 轮询兜底(hash $key consistent; 是不存在的语法),真正的 consistent hashing 需要第三方模块。

官方 hash 指令的实际行为(非一致性)

Nginx 原生 hash 指令工作方式是:

  • 对指定变量(如 $remote_addr、$request_uri)计算 CRC32 哈希值
  • 对该哈希值对后端服务器数量取模,决定转发目标
  • 当 upstream 中增减服务器时,绝大多数 key 的映射关系会改变 → 不具备一致性

例如:3 台 server 时,key A 映射到 server2;删掉 server1 后只剩 2 台,key A 很可能映射到 server1 —— 这正是传统哈希的“雪崩”问题。

Windows 下实现一致性哈希的可行方案

在 Windows 环境中,有且仅有以下两种实用路径:

  • 使用 OpenResty(推荐):OpenResty 是基于 Nginx + Lua 的发行版,Windows 官方提供预编译包(openresty.org/download)。它内置 balancer_by_lua* 和 resty-balancer 库,可轻松实现一致性哈希逻辑。示例 Lua 代码片段:
    lua_shared_dict consistent_hash_dict 10m;
    upstream backend {
        server 0.0.0.0:1; # 占位,实际由 Lua 分发
    }
    <p>location / {
    balancer_by_lua_block {
    local balancer = require "ngx.balancer"
    local resty_hash = require "resty.hash"
    local hash = resty_hash:new()
    local key = ngx.var.remote_addr .. ngx.var.uri
    local servers = { "127.0.0.1:8081", "127.0.0.1:8082", "127.0.0.1:8083" }
    local node = servers[hash:hash(key, #servers) + 1]
    local host, port = string.match(node, "(.<em>):(.</em>)")
    local ok, err = balancer.set_current_peer(host, tonumber(port))
    if not ok then ngx.log(ngx.ERR, "failed to set peer: ", err) end
    }
    proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
    }</p>
  • 改用 nginx-plus(不推荐 Windows):Nginx Plus 商业版支持 hash $key consistent; 语法,但官方不提供 Windows 版本,仅支持 Linux/macOS。Windows 下无法使用。

替代思路:用 sticky session 规避一致性需求

若目标是会话保持(如用户登录态),而非严格 key 分布,可考虑更轻量的方案:

  • ip_hash:按客户端 IP 哈希,简单稳定,适合内网或 IP 较固定的场景
  • cookie(需第三方模块):如 nginx-sticky-module-ng,但该模块无官方 Windows 支持,需自行编译(难度高、维护成本大)
  • 应用层控制:在业务代码中生成 token 并路由,Nginx 仅做透明代理

验证与调试建议

无论采用哪种方式,务必验证一致性效果:

  • 写个简单脚本,模拟 1000 个不同 key,记录每轮(3/4/5 台 server)的分发结果
  • 对比增减节点前后,相同 key 是否始终落在同一台 server 上
  • 开启 Nginx error_log debug;,配合 log_subrequest on; 查看真实转发目标

Windows 下路径、权限、防火墙也常导致 upstream 不可达,先确保基础代理正常再优化哈希逻辑。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

457

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

980

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

3352

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

1096

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

989

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

514

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

3076

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

5792

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

887

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习