JMeter本身不依赖代理服务器,但在录制脚本、抓取HTTPS请求、绕过网关限制或调试分布式测试时,代理服务器就是必须的“中间人”。简单说,代理让JMeter能看到客户端和服务器之间说了什么,或者替它把请求发出去。
为什么JMeter必须搭配代理服务器才能完成脚本录制
JMeter不像Selenium那样直接操作浏览器界面,它底层只认HTTP请求,想拿到一个完整的业务流程,比如登录、搜索、下单,你不可能手写每个请求的参数和头信息,代理服务器在这里扮演了“窃听器”的角色。
代理录制的工作原理
当你把JMeter的HTTP代理服务器启动后,它会监听一个本地端口,比如8888,接着你把浏览器的代理设置指向localhost:8888,浏览器发出的所有请求都会先经过JMeter,JMeter把这些请求解析成Sampler,同时把Cookie、请求头、POST参数全部记录下来,没有这个过程,你只能对着抓包工具逐个复制,效率极低。
移动端录制也必须靠代理
手机App测试是JMeter的高频场景,手机和电脑处于同一局域网,手机WiFi代理指向电脑IP的8888端口,所有App的流量就都被JMeter截获了,行业共识认为,这是目前录制App脚本最通用的方式,没有代理,普通工程师根本拿不到加密的HTTPS报文内容。
绕过HTTPS证书校验:代理服务器的关键附加价值
现在的Web应用几乎全站HTTPS,JMeter录制时默认会生成一个CA证书,当你把代理指向JMeter,其实就是在告诉浏览器“信任这个中间人”,没有代理,直接输入URL测试HTTPS接口,JMeter会报SSLHandshakeException,因为服务器不认JMeter自带的证书。
证书安装的两个实操步骤
- 在JMeter的
bin目录下找到ApacheJMeterTemporaryRootCA.crt,双击安装到“受信任的根证书颁发机构”。 - 如果在手机端录制,把这个证书文件传到手机,在系统设置里安装,以Android为例,需要在“安全”->“加密与凭据”里选择安装证书。
完成这两步,HTTPS流量才能被正常解密,多数情况下,新手卡在这一步就是没装证书或没装对位置。
高频问题:本地请求为什么也要走代理
有些用户会问,我访问localhost的接口,浏览器代理已经指向JMeter了,为什么录制不到?原因很简单,浏览器对localhost和0.0.1默认不走代理,你需要在代理设置里添加“绕过代理”的白名单,或者反过来,让JMeter代理强制捕获本地地址,在HTTP代理服务器配置中,找到“目标控制器”下方的“排除模式”,去掉不需要的排除项,或者直接在浏览器代理设置里取消“对本地地址不使用代理”的勾选。
代理服务器解决跨网络和网关限制问题
在真实压测场景中,JMeter所在机器可能和目标服务器不在同一个网段,或者目标服务器只允许特定IP访问,这时候代理就变成了“跳板”。
正向代理与反向代理的区分
JMeter自带的代理是正向代理,服务的是客户端,如果你需要让JMeter发出的请求经过一个固定的出口IP,可以在JMeter的HTTP请求采样器里配置“代理服务器”字段,这在企业内网中很常见,比如目标环境只放行运维跳板机的IP,那么JMeter就必须把请求转发给跳板机上的代理服务,再由代理转发到目标服务器,这个场景经常出现在百度搜索相关的问题里,jmeter设置代理服务器地址怎么填”,答案就是填跳板机的IP和端口。
反向代理在性能测试中的用法
另一种情况是部署Nginx或HAProxy作为反向代理,JMeter直接压反向代理,再由它把流量分发到后端集群,这样做的目的是测试整个负载均衡链路,而不是单台机器。没有代理层,你测出的只是单个应用服务器的性能上限,不是生产环境的真实表现。
分布式压测中代理服务器的角色
JMeter做大规模压测时要用到Master和Slave架构,Master负责调度,Slave负责发请求,这里有一个隐藏需求:所有Slave的脚本必须一致,而且结果要汇总到Master,虽然JMeter通过RMI通信完成这些,但RMI本身经常被防火墙拦截,这时候可以用代理服务器来中转控制命令和测试结果。
基于云的代理压测方案
越来越多团队选择云上的压测代理服务,本地JMeter把脚本上传到云端,云端用多台压力机通过代理执行,据部分公开服务商介绍,这种方式能轻松发起每秒数万请求的压力,对于预算有限的小团队,也可以直接用云服务器搭一个Squid代理,成本很低,但能突破本地带宽瓶颈。
代理服务器的性能开销
注意,代理本身会引入额外的延迟和资源消耗,如果你用代理压测,代理所在机器的带宽和连接数就成了瓶颈,业内专家指出,配置代理压测时,必须把代理机的配置给足,否则测试结果失真,数据对比来看,直连模式延迟在1-2毫秒时,经过一层代理通常增加到3-5毫秒,这是正常现象,测试报告里要注明是否经过代理,否则后续分析会走弯路。
用代理模拟用户真实网络场景
压测不能只测内网高速环境,用户访问你的产品,可能用的是4G网络、弱网WiFi,或者隔了半个地球,代理服务器可以在这里模拟网络损耗。
利用代理限制带宽和丢包率
你可以用Charles或Fiddler这类代理工具配合JMeter进行弱网测试,也可以直接用JMeter的HTTP代理服务器结合系统工具tc(Linux)或Network Link Conditioner(Mac)来模拟高延迟和丢包,操作路径如下:
- 在代理服务器上开启
tc qdisc,设置延迟100ms,丢包1%。 - JMeter脚本里的请求会经过这个代理,感知到人为增加的延迟。
- 对比不同网络参数下的响应时间和错误率,判断系统在恶劣环境下的表现。
这种做法比单纯修改JMeter的Constant Timer更真实,因为TCP层面的重传和拥塞控制都会被触发。
为什么不能只用JMeter本身的定时器
定时器只是让线程等待固定时间再发下一个请求,并没有改变网络链路的物理特性,代理模拟的是从客户端到服务器整条链路的传输状态,两者有本质区别,比如丢包会引发TCP重传,重传会加剧响应时间,定时器模拟不出这个连锁反应。
JMeter代理服务器配置的自检清单
很多时候配置了代理但脚本还是录不上,按照下面的顺序排查,五分钟内解决问题。
- 检查JMeter的HTTP代理服务器是否已启动,端口是否被占用,可在命令行执行
netstat -ano | findstr 8888查看监听状态。 - 检查浏览器代理设置是否指向了正确的IP和端口,注意,如果用网络代理插件,可能需要关闭插件自带的规则。
- 检查手机和电脑是否在同一网段,防火墙是否放行了JMeter端口。
- 检查HTTPS证书的安装位置,Windows需要放在“受信任的根证书颁发机构”,Android 7.0以上还需要配置App的
networkSecurityConfig信任用户证书。 - 在JMeter的“代理服务器”页面中,确认“目标控制器”选择的是“测试计划->线程组”,否则录制的Sampler不会出现在预期位置。
关于JMeter代理服务器的高频疑问解答
用JMeter代理录制时,浏览器打开网页很慢,正常吗?
正常,所有请求都经过JMeter,JMeter需要解析和存储每个报文,同时还要实时添加到脚本树中,这个过程会拖慢浏览速度,录制完成后关闭代理,浏览速度立即恢复,绝大多数情况下,这种“卡顿”反而是好事,说明请求确实被截获了。
JMeter直连也能发请求,为什么还要专门去配置代理?
直连模式适合已经知道精确的协议格式、参数列表的场景,比如调一个简单的REST接口,但只要业务流程有动态值、加密参数或复杂的Cookie关联,直连就束手无策了,代理录制能把这些动态内容完整捕获,作为后续关联提取的原始素材,统计下来,绝大多数的JMeter压测脚本,尤其是涉及登录态和交易流程的脚本,都是通过代理录制起步的。
代理服务器的IP和端口写错了会有什么表现?
如果JMeter监听的是localhost:8888,而浏览器代理填的是电脑局域网IP,往往导致录制窗口无内容,如果端口冲突,JMeter启动时会直接弹出BindException,所以最稳妥的写法是,在JMeter所在机器上填localhost:8888,如果手机或远程机器要连,就填电脑的实际局域网IP,并保证防火墙放行该端口。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/924604.html


评论列表(3条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于请求的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
读了这篇文章,我深有感触。作者对请求的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
读了这篇文章,我深有感触。作者对请求的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!