Nginx 可以借助split_clients
指令或通过 weight
参数以及 Lua 脚本实现流量按比例转发。以下是两种方式具体的操作步骤与示例配置:
方式一:借助split_clients
指令
1. 配置split_clients
split_clients
指令可依据客户端 IP 地址的哈希值,按设定比例将流量分配到不同的后端服务器组。其基本语法为:
plaintext
split_clients $variable {
percentage1 backend1;
percentage2 backend2;
...
default backend_default;
}
其中,$variable
一般是客户端 IP 地址(如$remote_addr
);percentage
为分配比例,范围是 0 - 100%;backend
为后端服务器组。
2. 配置后端服务器组
使用upstream
指令定义后端服务器组。
3. 配置虚拟主机
在虚拟主机配置中,根据split_clients
的结果将请求转发到相应的后端服务器组。
示例配置
假设你要把流量按 70% 和 30% 的比例分别转发到两个后端服务器组backend1
和backend2
,可参考如下配置:
nginx
# 按比例分配流量
split_clients $remote_addr {
70% backend1;
30% backend2;
}
# 定义后端服务器组
upstream backend1 {
server backend1.example.com:80;
}
upstream backend2 {
server backend2.example.com:80;
}
# 虚拟主机配置
server {
listen 80;
server_name yourdomain.com;
location / {
# 根据split_clients的结果转发请求
proxy_pass http://$split_clients;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置说明
split_clients
:依据客户端 IP 地址的哈希值,把 70% 的流量导向backend1
,30% 的流量导向backend2
。upstream
:定义了两个后端服务器组backend1
和backend2
。server
:虚拟主机配置,监听 80 端口,把请求根据split_clients
的结果转发到相应的后端服务器组。
应用配置
配置完成后,需要重新加载 Nginx 配置以使更改生效:
bash
sudo nginx -s reload
通过上述步骤,你就能使用 Nginx 按比例转发流量了。
方式二: 通过 weight
参数以及 Lua 脚本(加权轮询)
除了使用 split_clients
指令外,Nginx 还可以通过 weight
参数以及 Lua 脚本实现流量按比例转发:
使用 weight
参数
weight
参数可用于 upstream
块中,通过设置不同服务器的权重来按比例分配流量。
示例配置
nginx
# 定义后端服务器组
upstream backend {
# 权重为 7,表示大约接收 70% 的流量
server backend1.example.com:80 weight=7;
# 权重为 3,表示大约接收 30% 的流量
server backend2.example.com:80 weight=3;
}
# 虚拟主机配置
server {
listen 80;
server_name yourdomain.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;
}
}
配置说明
upstream
块中定义了两个后端服务器backend1.example.com
和backend2.example.com
,分别设置权重为 7 和 3。Nginx 会根据权重比例,将大约 70% 的流量导向backend1.example.com
,30% 的流量导向backend2.example.com
。server
块是虚拟主机配置,监听 80 端口,并将请求转发到backend
这个后端服务器组。
使用 Lua 脚本
借助 Lua 脚本,你可以实现更复杂的流量分配逻辑。需要确保 Nginx 已经安装了 ngx_http_lua_module
模块。
示例配置
nginx
# 定义后端服务器组
upstream backend1 {
server backend1.example.com:80;
}
upstream backend2 {
server backend2.example.com:80;
}
# 虚拟主机配置
server {
listen 80;
server_name yourdomain.com;
location / {
# 使用 Lua 脚本进行流量分配
access_by_lua_block {
math.randomseed(os.time())
local random_num = math.random(1, 10)
if random_num <= 7 then
ngx.var.proxy_pass = "http://backend1"
else
ngx.var.proxy_pass = "http://backend2"
end
}
# 转发请求
proxy_pass $proxy_pass;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置说明
- 定义了两个后端服务器组
backend1
和backend2
。 - 在
location
块中使用access_by_lua_block
执行 Lua 脚本。脚本生成一个 1 到 10 之间的随机数,若随机数小于等于 7,则将请求转发到backend1
;否则转发到backend2
,以此实现约 70% 和 30% 的流量分配。 配置完成后,使用以下命令重新加载 Nginx 配置:
bash
sudo nginx -s reload
这些方法各有优劣,你可以根据具体需求和场景进行选择。