由于流量太大,我的网站已经三天没有响应了。
页面上的 JavaScript 元素会定期从服务器请求图像,而由于人们一直打开浏览器窗口(因此从未停止请求图像),连接数量就成了问题。
我重新设计了网站,使用单个精灵并只加载一次;然而,现在出现了大量 404 错误,因为人们仍然试图加载旧内容。该网站位于 VPS 上,由于延迟而无法使用。
更糟糕的是,我最初以为延迟是由于缺少缓存造成的。我在 .htaccess 文件中添加了一条指令,让访问者缓存资源(包括旧的、低效的代码)。
我的主机无法纠正该问题。如何才能强制持久连接停止尝试加载过时的内容?
答案1
您无法真正阻止某人向不存在的资源发出请求(例如,任何人都可以为不存在的页面编造 URL 并得到 404)。但是,您可以采取一些措施来改善这种情况。
首先,更改新内容的文件名 - 如果您仍然在 html 中引用 javascript 文件,请确保它的名称与有问题的名称不同,以便浏览器不会使用缓存的副本。
其次,使您的 404 页面尽可能简单(一定要选择静态页面,而不是动态页面,而且要非常小)。
第三,Apache 在处理大量并发请求时效率不高,因为没有太多可用内存(它为每个请求启动一个工作线程)。考虑(至少暂时)在 Apache 前面添加另一台服务器,以便更有效地处理 404 请求。一些示例可能包括:
- nginx - 让它处理 404 请求(可能还有所有静态文件),并将其他请求通过 proxy_pass 传回 Apache(它还可以缓存代理请求)
- Varnish - 它可以缓存 404 请求并直接从内存中提供服务,从而减少 Apache 的负载
答案2
我将首先立即创建一个零字节文件来消除 404 错误并尽量降低每次检索的成本。
答案3
我的主机上的系统管理员使用脚本解决了这个问题:
任何试图访问旧内容的 IP 地址(本质上,这样的用户会不断发出请求并消耗连接)都会立即添加到服务器的防火墙中。到目前为止,只有几百名(数千名访问者中的)被检测和阻止。该解决方案效果很好。