Nginx 的负载均衡有哪些策略?如何配置?
Nginx 提供了多种负载均衡策略,可以根据不同的业务需求选择合适的算法。负载均衡通过 upstream 模块实现,可以将请求分发到多个后端服务器。
主要负载均衡策略:
1. 轮询(Round Robin,默认)
按顺序依次将请求分配给每个服务器,适用于服务器性能相近的场景。
nginxupstream backend { server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
2. 最少连接(Least Connections)
将请求分配给当前活动连接数最少的服务器,适用于请求处理时间差异较大的场景。
nginxupstream backend { least_conn; server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
3. IP 哈希(IP Hash)
根据客户端 IP 地址进行哈希计算,确保同一 IP 的请求总是分配到同一台服务器,适用于需要会话保持的场景。
nginxupstream backend { ip_hash; server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
4. 加权轮询(Weighted Round Robin)
为每台服务器设置权重,权重高的服务器接收更多请求,适用于服务器性能不均衡的场景。
nginxupstream backend { server 192.168.1.100:8080 weight=3; server 192.168.1.101:8080 weight=2; server 192.168.1.102:8080 weight=1; }
5. 哈希(Hash)
根据指定的 key 进行哈希计算,可以是变量如 $request_uri、$cookie_name 等。
nginxupstream backend { hash $request_uri consistent; server 192.168.1.100:8080; server 192.168.1.101:8080; }
服务器状态参数:
nginxupstream backend { server 192.168.1.100:8080 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.101:8080 weight=2 max_fails=3 fail_timeout=30s; server 192.168.1.102:8080 down; server 192.168.1.103:8080 backup; }
- weight:服务器权重,默认为 1
- max_fails:允许的最大失败次数,超过则标记为不可用
- fail_timeout:失败超时时间,在标记不可用后的等待时间
- down:标记服务器为永久不可用
- backup:标记为备用服务器,只在主服务器都不可用时使用
- max_conns:限制最大并发连接数
完整配置示例:
nginxhttp { upstream backend { least_conn; server 192.168.1.100:8080 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.101:8080 weight=2 max_fails=3 fail_timeout=30s; server 192.168.1.102:8080 weight=1 max_fails=3 fail_timeout=30s; server 192.168.1.103:8080 backup; keepalive 32; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
健康检查:
Nginx 开源版本不提供主动健康检查,但可以通过被动健康检查(max_fails/fail_timeout)实现。商业版 Nginx Plus 提供主动健康检查功能。
选择策略建议:
- 服务器性能相近:使用轮询
- 请求处理时间差异大:使用最少连接
- 需要会话保持:使用 IP 哈希
- 服务器性能不均衡:使用加权轮询
- 需要基于特定 key 分发:使用 hash