Nginx是一款高性能HTTP、和反向代理服务器,是大型架构必备使用的,下面详解4大Nginx负载均衡配置@mikechen
Nginx负载均衡
NGINX作为一个高性能的反向代理服务器,可以通过负载均衡功能,将客户端的请求分发到多个后端服务器上。
Nginx负载均衡配置
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; } }
最少连接,适用于动态负载均衡的场景,比如:根据实时连接数动态调整请求分发,确保每个服务器的负载尽可能平衡。
作者简介
陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》