每当我尝试对在 EC2 上负载平衡的站点进行负载测试时,我都会收到以下消息:
ab -n 20 -c 20 http://www.somesite.com/
Benchmarking www.somesite.com (be patient)...Send request failed!
apr_socket_recv: Connection reset by peer (54)
任何托管在没有负载均衡器的 EC2 上的站点都可以成功进行负载测试,所以我认为这与我配置的安全组无关。
AWS EC2 负载均衡器是否默认阻止此类请求?如果是,它如何区分 AB 和基于浏览器的普通 http 请求?
答案1
AWS EC2 负载均衡器默认是否阻止此类请求?
据我所知没有 - 你是不是碰巧在跑步苹果系统?似乎有一个通常 遭遇 漏洞跑步AB在这个特定的操作系统版本上 - 根据修复 Mac OS X Lion 上的 ApacheBench 错误有一个补丁可用(详情请参阅),但最好还是先检查一下官方更新,因为据说这个补丁(或等效修复)至少在 httpd-2.3.15-beta 版本中已经合并(请参阅修复 OS X Lion 上的 Apachebench)。
显然,您可以首先通过从不同的操作系统(版本)运行相同的测试来验证这一点(并且在这种情况下也将其作为一种解决方法)。
祝你好运!
答案2
当负载增加时,Amazon ELB 会扩展。当您每秒有 5 个请求时,您使用的负载均衡器与每秒运行 1000 个请求的人不同。当您在负载均衡器上运行测试时,请求数从每秒 5 个增加到 1000 个,负载均衡器无法处理负载,因此会拒绝请求。如果您在测试运行时等待 10-15 分钟让负载均衡器扩展,您应该会注意到所有请求都将完成。
如果您预计这会给您的生产环境带来问题,Amazon 可以手动升级您的负载均衡器。我在云中设置了一个负载均衡器/自动缩放组,周末的流量可以在 1-2 小时内从每秒几百到几千,我们在实际生产环境中运行时实际上并没有看到这种行为,只有在使用 jmeter 运行测试时才会看到这种情况。
答案3
作为一种安全措施,负载平衡器通常配置为限制或阻止那些看起来不像来自“真实浏览器”的请求。我怀疑这里可能就是这种情况;我相信亚马逊有一些文档。
考虑从浏览器捕获真实请求(例如使用 Fiddler 或 Firebug),并使用 ab 的 -H 参数添加可能需要的标头。例如,您通常需要“Host”、“Accept”和“Accept-Encoding”,也许还需要一个看起来真实的用户代理字符串。