什么是生存异常高流量峰值的好方法?
我的想法是,在某些触发器,我的网站应该暂时切换到"低带宽"模式:切换到基本HTML页面,最小图形,禁用可能会对数据库施加不必要负载的小部件,等等.
我的想法是:
监控CPU使用情况
监控带宽
监控请求/分钟
编辑:我熟悉缓存,切换到静态内容或内容交付网络等选项作为生存的手段,所以也许问题应该更多地集中在如何检测网站何时会变得超载.(虽然其他生存方法的答案当然仍然非常受欢迎.)让我们说网站在Linux和PHP上运行Apache.这可能是最常见的配置,应该允许最大数量的人从答案中获得帮助.让我们假设购买另一台服务器和负载平衡等昂贵的选项是不可用的 - 至少对于我们大多数人来说,提及Slashdot将是一次千载难逢的事情,而不是我们可以花钱准备的东西.
安装munin来监控负载/内存消耗等,并通知过载.
如果它崩溃,安装monit重新启动apache2
将nginx安装为apache2前端,它将大量减少重负载下的内存需求
值得一提的是,如果您的连接上没有足够的带宽,那么聪明的缓存和低带宽模式将毫无用处,因此请确保与服务器的连接足够胖.例如,不要将其托管在家庭DSL连接上.
我是从被抨击的经历中说出来的.当你无法访问互联网时,这并不好玩,因为成千上万的人同时试图下载你的室友安装在George Foreman烤架内的电脑的照片.没有多少防火墙可以节省您的费用.
基础:
除非您是真正的 Windows大师,否则不要尝试在Windows上托管大容量网站.它可以完成,但这是一个时间与成本问题.
尽可能使用静态内容(即无数据库查询).
了解缓存控制标头,并将其正确用于图像和其他静态资产.
至少,使用Apache,但如果可以,请使用lighttpd或其他高性能网络服务器.
真正的答案:
真的知道你的SQL,花时间分析慢查询.大多数页面加载不应该需要超过一秒的直接查询.
确定负载的确切位置.如果它是一个媒体密集的网站,请考虑在其他地方托管内容(如Akamai或其他一些服务).如果它是一个数据库密集的站点,请考虑复制.
知道哪种复制适合您.如果你有一个读取重量级的站点,标准的MySQL主/从复制应该没问题.如果你有很多写入,你需要某种多主设置,如MySQL Cluster(或调查'级联'或'瀑布'复制).
如果可以,请避免调用PHP - 即拥有页面的缓存静态(HTML)副本(这是大多数Wordpress缓存插件所做的).与最简单的hello world PHP脚本相比,Apache提供静态文件的速度要快得多.
这是一篇关于幸存"闪电人群"的相当冗长但内容丰富的文章.
以下是他们提出的解决方案所处理情况的情景:
在本文中,我们考虑通过我们称之为车库创新者的角色来扩展的问题.车库创新者具有创造力,技术精湛,雄心勃勃.她对Web上的Next Big Thing有一个很好的想法,并使用一些坐在车库里的备用服务器来实现它.该服务已启动并正在运行,不时吸引新访问者,并从广告和订阅中获得微薄的收入.也许有一天,她的网站将获得大奖.也许它会到达Slashdot或Digg的头版; 也许Valleywag或纽约时报会提到它.
我们的创新者可能只获得一次广泛的宣传.如果发生这种情况,成千上万的人将访问她的网站.由于她的想法如此新颖,许多人将成为创收客户并推荐朋友.但闪光的人群众所周知地变幻无常; 如果网站在其负载下崩溃,结果将不会像田园诗般的那样.如果网站第一次不工作,很多人都不会费心回来.尽管如此,如果网站遇到突然的负载峰值,很难证明支付数万美元的资源是合理的.Flash人群既是车库创新者的祸根,也是她的目标.
当代效用计算实现了摆脱这一难题的一种方法.
然后,文章提出了车库创新者可以采取的一些步骤,例如使用存储传送网络和实现高度可扩展的数据库.
我重写了几个热门网站引用的所有网址,通过coralCDN重定向.
Apache的一个例子:
RewriteEngine On RewriteBase / RewriteCond %{HTTP_USER_AGENT} !^Googlebot RewriteCond %{HTTP_USER_AGENT} !^CoralWebPrx RewriteCond %{QUERY_STRING} !(^|&)coral-no-serve$ RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?digg\.com [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?slashdot\.org [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?slashdot\.com [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?fark\.com [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?somethingawful\.com [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?kuro5hin\.org [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?engadget\.com [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?boingboing\.net [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?del\.icio\.us [OR] RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?delicious\.com RewriteRule ^(.*)?$ http://example.com.nyud.net/$1 [R,L]
除非你对它进行压力测试,否则根本无法知道你的网站是否会承受重负荷.使用像围攻这样的东西,看看你的性能问题在哪里.它在内存中增长得太快了吗?是否通过一堆并发连接开始减速?是否开始永远访问数据库?
一旦你知道性能问题在哪里,那就变成了摆脱它们的问题.不幸的是,如果不了解更多关于你的具体情况的话,很难进入更多的细节,但请记住,你在这里谈论的是优化.因此,只有在您知道存在性能问题时才应该采取行动.
而且我认为你不一定只是为一生一次的事件做准备.DOS攻击仍然发生,所以即使你的网站没有被删除,也可以做好准备工作.
在我几乎所有情况下,我能想到的唯一可以帮助你的东西就是如果你gzip你的内容.这将节省大量带宽,所有现代浏览器都会支持它,而不会出现太多的性能问题.
我认为前提是错误的:你真的很想得到抨击,否则你首先就不会有网站.一个更好的问题是你如何处理额外的流量?甚至那是两个问题:
您如何在技术上管理额外的服务器负载?
你如何迎接新用户,以便你可以希望他们中的一些能够坚持下去?