k6负载测试:如何指定自定义IP发起HTTP请求及证书问题解决
解决k6负载测试中指向自定义IP的HTTP/HTTPS请求问题
我刚好处理过类似的场景,来帮你一步步解决这两个问题:
1. 如何在k6中向自定义IP发起HTTP请求?
如果是HTTP协议,直接请求IP地址即可,还可以根据需要手动指定Host头:
import http from 'k6/http'; export default function () { // 直接请求自定义IP,可选添加Host头模拟域名请求 const res = http.get('http://192.168.1.100', { headers: { 'Host': 'your-domain.com' } }); console.log(`HTTP请求状态码: ${res.status}`); }
如果是HTTPS协议,直接请求IP会触发证书验证失败(因为证书通常绑定主机名而非IP),针对这种情况的解决方案我会在下面详细说明。
2. 是否可强制k6的HTTP请求指向自定义IP?
完全可以,针对你提到的「DNS指向IP A,但要请求部署在IP B的同域名HTTPS服务」场景,有两种推荐方案:
方案一:使用k6的resolve参数自定义DNS解析(最优解)
k6支持在HTTP请求中通过resolve参数指定主机名到IP的映射,这样k6会直接用你指定的IP建立连接,同时请求的Host头保持原主机名,完美适配HTTPS证书验证逻辑(证书绑定的是主机名,和请求头匹配就能通过验证)。
示例脚本:
import http from 'k6/http'; export default function () { // 将your-domain.com强制解析到目标IP B(替换成你的实际IP) const res = http.get('https://your-domain.com', { resolve: { 'your-domain.com': '192.168.1.100' } }); console.log(`HTTPS请求状态码: ${res.status}`); }
这个方案不需要修改系统配置,完全在脚本层面控制,灵活且符合安全验证要求,是最推荐的方式。
方案二:跳过HTTPS证书验证(仅适合测试环境)
如果必须直接用IP发起HTTPS请求,你可以关闭k6的证书验证,但这会跳过安全检查,只建议在内部测试环境使用:
方式1:通过命令行参数全局设置
k6 run --insecure-skip-tls-verify your-script.js
方式2:在脚本中单独配置请求
import http from 'k6/http'; export default function () { const res = http.get('https://192.168.1.100', { headers: { 'Host': 'your-domain.com' }, // 指定原主机名 tls: { insecureSkipVerify: true } // 跳过证书验证 }); console.log(`HTTPS请求状态码: ${res.status}`); }
临时方案:修改/etc/hosts
你提到的修改/etc/hosts将主机名指向IP B的方式确实有效,但这是系统级别的配置,会影响所有使用该主机名的请求,适合临时快速测试,但脚本层面的resolve参数更灵活可控。
关于k6 API的支持
k6的HTTP请求参数中的resolve选项就是专门为这类自定义IP指向场景设计的,完全满足你「通过k6 API实现该功能」的需求,不需要依赖外部工具或系统配置。
内容的提问来源于stack exchange,提问作者user3640248
相关产品推荐
相关产品推荐

