Nginx负载均衡
NGINX作为一个高性能的反向代理服务器,可以通过负载均衡功能,将客户端的请求分发到多个后端服务器上。
这里的核心点:是如何把客户端的访问,更好的方式分配到后端服务器,这机会涉及到负载均衡配置策略,下面我重点详解4大常用的配置
1.轮询
轮询是一种按照“顺序”,依次分配请求的负载均衡策略,如下图所示:
原理:
- 首先,客户端发起一个请求到NGINX;
- 其次,NGINX按照定义的服务器列表顺序,将请求发送给下一个服务器;
- 然后,下一个请求将发送到列表中的下一个服务器,以此类推,直到所有服务器都接收到了请求。
- 最后,当再次收到新请求时,NGINX重新从列表的第一个服务器开始。
举一个例子:
假设我们有三台后端服务器,分别是 192.168.1.10、192.168.1.11 和 192.168.1.12。
我们希望NGINX,将所有的请求按照轮询的方式分发到这三台服务器上,配置如下:
upstream backend { server 192.168.1.10; server 192.168.1.11; server 192.168.1.12; } 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; } }
配置说明:
backend :是我们给这组服务器起的名字;
192.168.1.10、192.168.1.11 、 192.168.1.12, :分别列出了三台后端服务器的地址;
proxy_pass http://backend; :将所有请求代理,到定义的 backend 组中的服务器。
应用:
这种轮询策略,适用于后端服务器性能相似,能够平均处理请求的场景,适用于大多数基本的Web应用和服务。
2.加权
加权(Weighted)负载均衡策略,是为每个后端服务器都分配了一个权重值,NGINX根据这些权重值,决定将请求分发到哪个服务器上。
具体来说:
- 每台后端服务器都被赋予一个权重值,通常通过配置文件进行设置;
- NGINX在处理请求时,按照服务器的权重比例来分配请求;
- 权重越高的服务器,会接收到更多的请求。
配置如下:
upstream backend { server backend1.example.com weight=3; server backend2.example.com weight=2; server backend3.example.com weight=1; } 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; } }
- server backend1.example.com weight=3;:定义了一个权重为3的 backend1.example.com;
- server backend2.example.com weight=2;:定义了一个权重为2的 backend2.example.com;
- server backend3.example.com weight=1;:定义了一个权重为1的 backend3.example.com。
这意味着backend1.example.com会接收到的请求比backend2.example.com多,而backend3.example.com接收到的请求最少。
应用场景:
可以用来平衡服务器的负载,确保性能较高的服务器承担更多的请求,从而提高整体系统的效率和可用性。
3.IP 哈希(IP Hash)
IP哈希(IP Hash),是根据客户端的IP地址,将请求分发到后端服务器。
如下图所示:
具体来说:
- 首先,客户端发送请求到NGINX服务器,NGINX从客户端的IP地址,计算出一个哈希值;
- 其次,根据这个哈希值,NGINX选择一台后端服务器来处理请求;
- 最后,同一个客户端的后续请求,会根据相同的哈希值选择相同的后端服务器,以保持会话的一致性。
配置如下:
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com; } 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; # 透传客户端真实IP地址 proxy_set_header X-Forwarded-For $remote_addr; } }
这种策略适用于:
需要确保与客户端相关联的会话数据、或状态信息,在同一台服务器上处理的情况,例如:网站的登录状态、或购物车信息等。
4.最少连接
最少连接(Least Connections),是将请求分发到当前连接数最少的后端服务器。
如下所示:
最少连接负载均衡策略,的工作原理如下:
- 当有新的请求到达NGINX时,NGINX会检查当前所有后端服务器的连接数;
- NGINX选择当前连接数最少的那台服务器,来处理新的请求;
- 这样可以避免出现某些服务器负载过高,而其他服务器负载较轻的情况,提高整体的负载均衡效果。
配置如下:
upstream backend { least_conn; server backend1.example.com; server backend2.example.com; server backend3.example.com; } 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; # 透传客户端真实IP地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; } }
最少连接,适用于动态负载均衡的场景,比如:根据实时连接数动态调整请求分发,确保每个服务器的负载尽可能平衡。