由于 Load Impact 会从 Amazon AWS 和 Rackspace 等云提供商动态分配负载生成器实例,因此您不知道测试中的负载生成器将使用哪些源 IP 地址。
如果您需要配置防火墙以允许负载影响流量通过,您可以执行以下操作之一:
向您要从中运行负载测试的负载区域使用的整个 AWS IP 地址范围打开防火墙。请注意,Rackspace 不会公开它们的 IP 范围,因此如果您想使用 Rackspace 负载区域进行测试,很遗憾根本无法知道负载生成器将使用的 IP 范围。这种方法的缺点是,即使您使用 AWS 生成流量,您也必须将防火墙开放到相当大的 IP 范围。
使用 HTTP 标头、URL 查询参数或其他有关您生成的流量的信息来发送唯一数据(即某种令牌),将流量标识为属于您的负载测试,然后配置您的防火墙以查找传入流量中的此数据。请注意,这要求您的防火墙支持扫描应用程序有效负载数据并根据它找到的内容应用规则。它还要求您的防火墙终止 SSL 连接或使用未加密的 HTTP,否则防火墙将无法检查流量。
在您知道测试使用的 IP 地址后,立即添加您的防火墙规则。
下面是关于如何执行每种不同替代方案的更详细说明
1。向测试中可能使用的所有 IP 开放防火墙
在这里,您需要查看您正在使用哪些 AWS 负载区域,然后找到这些 AWS 数据中心托管的 IP 地址范围。有关 AWS 使用的 IP 范围的更多信息,请参阅http://support.loadimpact.com/knowledgebase/articles/174262-what-ip-addresses-do-load-impact-use-to-generate-l。
2。使用 HTTP 标头、URL 查询参数发送识别令牌
您可以将自定义 HTTP 标头添加到您的用户场景代码中的任何请求,如下所示:
http.request_batch({
{"GET", "http://test.loadimpact.com/", headers={ ["X-Myheader"]="TOKEN_STRING"} }
}
不过,您需要将“headers=”参数添加到每个请求中。
如果您不依赖于让负载测试中的模拟用户伪装成某个用户代理,您还可以使用 http.set_user_agent_string() 函数为所有后续请求设置“User-Agent”标头.然后,该标头可以包含您的令牌值,您不必修改用户场景中的每个 HTTP 请求。
如果不干扰应用程序的功能,您也可以使用查询参数:
http.request_batch({
{"GET", "http://test.loadimpact.com/?firewall_token=TOKEN_STRING" }
}
另一种选择可能是从某个不在 DNS 中的主机名请求内容,但您的站点当然需要配置为响应对该主机名的请求。这就是您在负载影响方面的做法:
-- Map a secret hostname to the IP of our server (need to do this if the hostname is not in the public DNS)
util.dns_remap('very_difficult.to.guess.hostname.com', '44.55.66.77')
-- Make all your requests go to this hostname
http.request_batch({
{"GET", "https://very_difficult.to.guess.hostname.com" }
}
这会将 Host: 标头设置为包含字符串“very_difficult.to.guess.hostname.com”
当然,除非您的防火墙终止 SSL 流量或流量未加密,否则任何依赖于您的防火墙能够检查 HTTP 标头或类似内容的解决方案都将不起作用。
3。测试开始后添加防火墙规则
在许多情况下,这可能是最好的方法,因为它相当简单,几乎适用于所有情况,而且相当安全。缺点是您需要为每次运行的负载测试重新配置一次防火墙。这意味着您开始测试,然后找出负载生成器正在使用的 IP,然后快速设置允许来自这些 IP 的传入流量的防火墙规则。为了方便这种方法,您可能需要设计您的用户场景,以便他们执行以下操作:
if client.get_id() == 1 then
log.info('Load generator IP address: ' .. client.get_load_generator_ip())
end
client.sleep(300)
...
[rest of user scenario]
这将导致每个负载生成器让客户端/VU 线程 #1 在测试结果页面的“日志”窗口中打印出负载生成器的 IP 地址。所有线程将在开始执行前等待 300 秒(5 分钟),给您 5 分钟的时间来更新防火墙规则,让来自生成器使用的所有 IP 地址的流量通过。
请注意,在这种情况下,每个客户端都将从休眠 300 秒开始,因此测试启动会延迟那么长时间。 “活跃的客户端”图表会有点误导,因为它还会显示仍在执行初始睡眠的客户端。如果你想避免这种情况,你可以跳过 sleep() 语句,如果你不关心测试过程中第一分钟左右的测试结果是否正确(当 VU 将遇到连接问题,因为防火墙阻止它们时) )。