Skip to content

记录一次网站首页被刷量的经历,对网站页面静态化处理的思考和尝试

还原故事背景

有一个N多年前的老项目,接到了服务器的报警短信,带宽和CPU都超过了80%。紧接着网站打开特别慢,然后挂掉了, 第一反应就是被刷量了!

定位问题

  1. 首先查询统计平台,发现同时在线人数为0,感觉很奇怪。马上想到因为网站已经挂掉了,无法执行到统计js,所以真实的在线人数并不为0
  2. 马上查询Nginx的log
bash
tail -f /data/logs/nginx/access.log
  1. 在查询access.log的时候发现几个接口以肉眼可见的速度疯狂滚屏,问题就在这里了。
  2. 分析日志,发现这些接口的请求竟然是自己的机器,说明攻击者不是在curl接口,而是在刷页面
  3. 定位到基本都是不同的ip,封禁ip不是解决办法
  4. 那就优化被刷的页面吧,定位到刷的是首页,查询了网站首页代码,发现首页的请求异常的多,项目比较老,使用的PHP框架yaf+smarty渲染的,且部分接口已经做了数据缓存,但是机器还是经不起这么疯狂的查询。(这是一个小项目,单机部署,包括:web服务+MySQL+MongoDB)
  5. 灵机一动,把“首页静态化处理”吧
  6. 静态化处理核心思路见代码注释,非常简单,但是非常高效
php
核心思路如下: /**  * 生成静态首页  * 1 静态首页从缓存中取  * 2 动态首页另写一个路由,保证有实时首页可供访问  * 3 考虑到curl网站可以直接获得包括html标签的string字符串,我就直接curl了  * 4 考虑到从Redis读取数据性能比较快,且操作方便,就不把页面保存成HTML文件了  * 5 Redis中有数据就直接获得,没有数据就curl获得html dom字符串存储到Redis中  * 5 把html直接echo输出  */ public
function indexAction() {     $cacheKey = 'statichtml_staticIndex';
$result = Service_CacheModel::get($cacheKey);
if (empty($result)) {         //这是动态页面,这个页面的数据都是请求数据动态生成的           $url = "https://www.xxxxx.com.cn/index/dynamic/";
$result = Request::curl($url);
Service_CacheModel::set($cacheKey, $result, 60*10);
//10分钟
}     echo $result;
}

首页静态处理之后秒开

访问速度几十毫秒 静态处理之后首页的访问速度仅为33毫秒,之前要1秒左右,性能提升了30倍+

备注

我能通过上述解决思路解决问题只能说明3点

  1. 之前的首页实在是太浪费性能,非常差
  2. 并发量并没有那么高,否则静态化处理之后也没法解决问题。

上述不是解决刷量攻击的根本办法,但却是优化性能,提高网站访问速度的一种解决思路

AI 应用开发训练营 · 现在开始

别只收藏 AI 文章,今天就做出第一个能上线的项目

文章解决认知,项目才证明能力。把 Agent、RAG、MCP 变成可运行、可展示、可面试表达的成果,现在就从一次岗位准备度自测开始。

立即开始 AI 岗位准备度自测 查看训练营路线
真实学员成果先看成果,再决定是否开始 →
  1. 01选方向
  2. 02做项目
  3. 03出成果
  4. 04拿面试