今天,我们客户的一个网站出现了一次有趣的中断。网站突然无法访问。该网站在专用的物理 Windows 2003 R2 服务器上自行运行(我知道这可能有点过头了,但这是另一天的讨论)。重新启动 IIS 和 ColdFusion 应用程序服务后,问题又出现了好几次。我最初的想法是 DNS 问题,这种情况偶尔会发生 - 最后一次发生是在飓风桑迪之后,当时我们的 ISP 停运了,我们不得不进行一些网络配置更改。但这不是 DNS 问题。我的第二个想法是这是一次 DDOS 攻击,但几乎没有人会想关闭这个网站。当我们打电话给我们的 ISP 时,另一端的接线员注意到流量大幅飙升。事实证明,客户在通过 FTP 传输了一个非常大的视频文件,然后通过电子邮件群发了指向该文件的链接后,无意中对网站造成了 DDOS。数百人点击了该链接,导致该网站瘫痪。
我主要是一名网站程序员,但有时我经常需要参与服务器管理。遗憾的是,我是 ColdFusion 和 IIS 专家,但我对这个问题没有太多经验。我可以采取哪些基本步骤来防止这种情况再次发生,因为我们无法始终控制客户端发布到网站上的文件。
以下是我的一些想法,但我不确定其影响:
- 限制 IIS 中的连接数。
- 将媒体文件放在单独的服务器上(如亚马逊网站等)。
- 这种类型的文件请求目前位于服务器脚本(即 /www.site.com/viewFile.cfm?fileId=1424545,其中 fileId 引用 webroot 之外的文件)后面,该脚本记录请求并使用 CFCONTENT 将文件推送到浏览器。我可以编辑此脚本,以在给定时间范围内请求超过一定数量时拒绝请求(即 5MB 可以在一小时内在全球范围内被访问 10 次)。这可能会让一些用户感到沮丧,但是,如果有数百名用户试图查看该文件,该网站无论如何都会崩溃,就像今天一样,这更令人沮丧,因为没有“漂亮”的消息解释他们为什么无法访问该文件。
- ColdFusion 管理员中的更新请求调整设置。
Maximum number of simultaneous Template requests
当前设置为 20。我可以将此数字减少到 5 左右以防止发生这种情况,但这可能会对网站的正常使用产生不利影响。
我愿意接受任何建议,因为我正在继续我的研究,向首席技术官报告最佳选择,以便我们能够实施解决方案。
谢谢。
更新:停电前后的使用报告:
答案1
对于大型静态项目,将其移动到 CDN,例如 Amazon CloudFront。
答案2
这是我现在正在使用的解决方案:
所有这些加载文档的链接都会转到一个页面,并在查询字符串中附加了其他信息:
/www.site.com/viewFile.cfm?fileId=1424545
我已更新此文件,使其仅包含一个 iframe,该 iframe 指向提供媒体文件的单独站点:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
html {
overflow: hidden;
}
iframe {
position: absolute;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
border: none;
}
</style>
</head>
<body>
<cfoutput>
<iframe src="http://media.site.com/index.cfm#CGI.PATH_INFO#" frameborder="0"></iframe>
</cfoutput>
</body>
</html>
该单独的站点(media.site.com)位于不同的服务器上(由单独的 ISP 线路提供服务,该线路实际上是一条 15Mbps 线路,但也处理公司的其他流量),并且index.cfm
该站点包含之前驻留在当前登录页面中的所有逻辑,并从本地目录提供文件,该目录可同步媒体文件与其原始驻留位置。
有点黑客风格,但确实能完成任务。这样,如果用户对媒体文件的请求超载,只有该站点/服务器/IPS 线路会瘫痪,但原始网站仍将保持“运行”,这样即使用户无法查看媒体文件,他们仍可以执行正常功能。