You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

k6脚本如何实现VU/HTTP请求/迭代维度的代理轮换

原因说明

k6的全局HTTP代理配置在进程启动阶段就完成初始化加载,运行过程中修改__ENV.HTTP_PROXY不会触发底层HTTP传输层的配置重载,所以脚本内打印环境变量值已变更,但实际请求仍然走启动时传入的初始代理。

可行实现方案

k6原生支持在单个HTTP请求的参数中直接指定代理,不需要依赖全局环境变量,完全可以实现按VU、单请求、单次迭代维度动态切换代理。

方案1:单请求/单迭代粒度动态切换(灵活性最高)

直接在发起http.get/http.post等请求时,传入proxy配置项指定当前请求使用的代理地址,优先级高于全局环境变量配置。
修改测试脚本逻辑如下:

import http from 'k6/http';
import { check } from 'k6';
import { SharedArray } from 'k6/data';

// 读取代理列表(保持原有SharedArray逻辑即可,避免多VU重复占用内存)
export const proxies = new SharedArray('proxies', function() {
  return JSON.parse(open('./proxies.json'));
});

// 生成指定范围随机数
function RandomRange(min, max) {
  return Math.floor((Math.random() * (max - min + 1)) + min);
}

export default function () {
  // 单次迭代开始时随机选代理,也可以在每个请求发起前单独选择
  const currentProxy = proxies[RandomRange(0, proxies.length - 1)].proxy;
  console.log(`当前迭代使用代理: ${currentProxy}`);

  // 请求参数中指定代理,注意要补全协议前缀
  const res = http.get('http://some-random-server.com/index.php', {
    proxy: `http://${currentProxy}`
  });

  check(res, {
    'Status is 200': (r) => r.status === 200,
    'Resp includes': (r) => r.body.includes('success'),
  });
}

配置说明:

  • 代理地址必须带协议前缀:HTTP代理用http://,SOCKS5代理用socks5://
  • 带账号密码的代理格式和环境变量写法一致:http://user:pass@代理IP:端口
  • 可以自由控制代理选择逻辑:单请求切换就在每个请求传参前选代理,单迭代切换就在迭代开头选一次即可。

方案2:按VU固定绑定代理

如果需要每个虚拟用户全程使用固定代理,不需要每次迭代/请求更换,可以在VU初始化阶段提前分配代理,减少重复计算:

import http from 'k6/http';
import { check } from 'k6';
import { SharedArray } from 'k6/data';

export const proxies = new SharedArray('proxies', function() {
  return JSON.parse(open('./proxies.json'));
});

function RandomRange(min, max) {
  return Math.floor((Math.random() * (max - min + 1)) + min);
}

// VU初始化阶段执行一次,给当前VU分配固定代理
const vuProxy = `http://${proxies[RandomRange(0, proxies.length - 1)].proxy}`;
console.log(`VU ${__VU} 绑定固定代理: ${vuProxy}`);

export default function () {
  // 当前VU所有请求都传入预先分配的固定代理即可
  const res = http.get('http://some-random-server.com/index.php', {
    proxy: vuProxy
  });

  check(res, {
    'Status is 200': (r) => r.status === 200,
    'Resp includes': (r) => r.body.includes('success'),
  });
}
注意事项
  • 不要尝试通过运行时修改__ENV.HTTP_PROXY变更全局代理,该操作不会触发底层配置重载,完全不生效
  • 大数量代理列表继续使用SharedArray存储即可,不会因为多VU复制导致内存占用过高
  • 代理选择逻辑可根据需求自定义:顺序轮询、权重随机、地域匹配等规则都可以,只要最终将选中的代理地址传入请求参数的proxy字段即可生效。

内容的提问来源于stack exchange,提问作者0_o

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:27:36