我是一名 dev-ops Web 开发人员,其站点在 AWS 上的负载均衡器后面运行两个 ec2.smalls。
最近我们看到每秒有 3-4 个请求关闭我们的客户网站。
该站点已关闭,并且在多次服务器重新启动和错误日志扫描任何可能导致问题的脚本后不会恢复,即使最近没有推送任何更改。
打开负载平衡器日志记录后,我看到单个页面的 1000 多个请求来自一个 IP 地址。
我们使用 X-forwarded-for 将请求从负载均衡器转发到处理请求的服务器,并使用 .htaccess 规则阻止 IP。
在与客户 IT 通信时,他们被告知负责大量请求的 IP 地址实际上是他们的内部公司机器之一。
负责的机器被远程重启,所有请求都停止了。该网站重新上线。
对此的官方解释是“电脑吓坏了”。
Web 浏览器或 Windows 机器是否可以每秒向负载平衡的网页发出 3-4 个请求并将其关闭 5 小时以上?
以下是请求的样子:
2017-01-14T01:00:46.170447Z west-ssl XX.XXX.XX.XXX:33370 - -1 -1 -1 503 0 0 0 "GET https://www.example.com:443/example/12 HTTP/1.1" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" ECDHE-RSA-AES128-SHA256 TLSv1.2
当然有可能——尽管这取决于许多因素:
1)听起来服务器端应用程序存在并发问题。可能值得一看的是应用程序服务器是否是瓶颈,或者它是否在上游(例如数据库)并且由于 apache 配置没有足够快地刷新线程而导致应用程序服务器内存不足。如果是应用程序服务器,可能值得进行一些调整——在 ELB 之外启动一台相同的机器,并使用 JMeter 对其施加一些负载以找出瓶颈。
如果是数据库,您可以使用 memcache/elasticache(因为看起来您正在检索特定对象)来缓存实际查询。这样数据库连接快速响应,Apache 可以快速响应,并杀死线程而不是填满应用程序机器的内存池。
如果你真的感觉很脆弱,你可以将 Varnish 放在上游以 1-5 秒的 TTL 缓存请求,以防止主要的请求泛滥。但要小心,因为 VCL 是不可原谅的,并且可能导致重大问题和痛苦(缓存中毒/泄漏)。
2)至于“主题”机器本身。显然它可能已经被破坏了——它绝对应该被调查。我会让你决定 IT 人员是否诚实——这超出了服务器故障的范围。
假设它没有被破坏,它可能是一些糟糕的 javascript 代码 - 如果您进行轮询刷新并且以某种方式修改了时间参数,它很可能开始每秒发送许多请求。同样,JS 可能表现良好,但该人可能打开了 25 个选项卡并在晚上回家 - 如果每个人每 5 秒发送 1 个请求,那就是 5req/秒。