Skip to content

负载均衡

约 556 字大约 2 分钟

2025-08-28

负载均衡需要上游服务的支持,可以理解为多个车道(后端服务)到达同一个目的地(同一个业务),显然使每个车道的车辆密度一致能够最大化利用

http {
	upstream backend_servers { # 后端服务器组
		server 192.168.1.100:8080;
		server 192.168.1.101:8080;
	}
	server {
		listen 80;
		server_name ecommerce.com;
		location / {
			proxy_pass http://backend_servers; # 将客户端的请求转发到指定的后端服务器组
			proxy_set_header Host $host;
			proxy_set_header X - Real - IP $remote_addr; # 设置请求头信息,确保后端服务器能获取客户端的真实信息。
		}
	}
}

定义一个upstream,即上游服务组,在路由转发中将请求转发至目标服务组中

策略

有了服务列表,Nginx 需要依据一定的策略选择请求转发的目的地

轮询(默认)

依据组中的顺序依次轮询,让每一个服务器轮流处理请求。例如:

upstream backend_servers { # 后端服务器组
	server 192.168.1.100:8080;
	server 192.168.1.101:8080;
}

第一个请求发送至192.168.1.100:8080,第二个请求发送至192.168.1.101:8080,以此类推

加权轮询

在轮询的基础上,为每个服务器添加权重(默认为 1),权重更大的服务器将会被转发更多的请求

upstream backend_servers {
	server 192.168.1.100:8080 weight=6;
	server 192.168.1.101:8080 weight=1;
}

IP 哈希

将请求 IP 进行哈希,再与服务器组数量进行取模,这样能够保证同一个请求的 IP 总会发送到同一个同一个后端服务器

upstream backend_servers {
	ip_hash;
	server 192.168.1.100:8080;
	server 192.168.1.101:8080;
}

最少连接

将请求发送至当前连接数最少的后端服务器,保证负载均衡 与轮询的区别:每个请求的耗时不一定相同,轮询总是按照顺序转发请求,而最少连接能够保证每一个服务器连接数的请求更一致

upstream backend_servers {
	least_conn;
	server 192.168.1.100:8080;
	server 192.168.1.101:8080;
}

其他配置

健康检查

使用max_failsfail_timeout参数进行健康检查,若发现某一服务器在fail_timeout时间内出现了超过max_fails次失败,则认为该服务器不可用,则在当前时间 + fail_timeout内不会向其发送请求