Nginx upstream的5种权重分配方式分享


Nginx 的 upstream 模块支持多种权重分配方式,以实现负载均衡。以下是 Nginx 中常用的五种权重分配方式的简要介绍:

1. **默认权重分配(Equal Load Balancing)**

如果不特别指定权重,Nginx 会假设所有服务器的权重都是 1,实现简单的轮询负载均衡。

配置示例(无特别指定权重,默认权重为 1):

nginx upstream myapp1 { server server1.example.com; server server2.example.com; }

2. **指定权重分配(Weighted Load Balancing)**

可以明确地为每个服务器指定权重,Nginx 会根据权重比例分配请求。

配置示例:

nginx upstream myapp1 { server server1.example.com weight=3; server server2.example.com weight=1; }

3. **IP 哈希(IP Hash)**

基于客户端 IP 地址的哈希值来选择服务器,确保来自同一个 IP 的请求被发送到同一个后端服务器,这有助于处理需要保持会话状态的应用。

配置示例:

nginx upstream myapp1 { ip_hash; server server1.example.com; server server2.example.com; }

4. **最少连接(Least Connections)**

将新的请求分配给当前连接数最少的服务器。这种方法有助于平衡服务器之间的负载,但可能不如轮询或权重分配方法简单直观。

配置示例(Nginx 原生不支持直接配置“最少连接”,但可以通过第三方模块如 nginx-module-vts 实现类似功能):

nginx # 注意:以下仅为示例,Nginx 原生不支持直接配置 upstream myapp1 { least_conn; # 假设这是一个可用的指令,但实际上需通过模块或其他方式实现 server server1.example.com; server server2.example.com; }

5. **基于请求头或变量的负载均衡**

虽然 Nginx 并没有内置直接基于请求头或变量进行负载均衡的策略,但你可以通过编写更复杂的配置或使用第三方模块(如 ngx_http_lua_module)来实现基于请求头或变量的请求分发逻辑。

示例(通过 Lua 脚本实现):

nginx # 假设使用 ngx_http_lua_module location / { set $target ''; access_by_lua_block { # 假设根据某个请求头选择服务器 local header_value = ngx.var.http_my_custom_header if header_value == 'value1' then ngx.var.target = 'server1.example.com' else ngx.var.target = 'server2.example.com' end } proxy_pass http://$target; }

请注意,最后一个示例使用了 ngx_http_lua_module 来实现基于请求头的负载均衡,这并非 Nginx 原生支持的功能,而是通过扩展模块实现的。在实际应用中,你可能需要根据自己的需求和环境来选择合适的负载均衡策略。