Nginx如何进行流量按比例转发?

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% 的比例分别转发到两个后端服务器组backend1backend2,可参考如下配置:

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:定义了两个后端服务器组backend1backend2
  • 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.combackend2.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;
    }
}

配置说明

  • 定义了两个后端服务器组 backend1backend2
  • location 块中使用 access_by_lua_block 执行 Lua 脚本。脚本生成一个 1 到 10 之间的随机数,若随机数小于等于 7,则将请求转发到 backend1;否则转发到 backend2,以此实现约 70% 和 30% 的流量分配。 配置完成后,使用以下命令重新加载 Nginx 配置:
bash 复制代码
sudo nginx -s reload

这些方法各有优劣,你可以根据具体需求和场景进行选择。

相关推荐
子兮曰11 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰11 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝12 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码12 小时前
别再前后端各写一套表单校验了
java·后端
大勇前进13 小时前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu13 小时前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile13 小时前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白8013 小时前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙13 小时前
PHP 接口返回统一响应封装,让前后端对接更省心
后端
盖伦发发14 小时前
软件工程SOLID 五大设计原则
后端·软件工程