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 原生支持的功能,而是通过扩展模块实现的。在实际应用中,你可能需要根据自己的需求和环境来选择合适的负载均衡策略。