网站突然流量上涨但服务器不崩的真实排查过程:带宽、缓存与限流分析
今天遇到一个比较值得记录的问题:网站流量突然上涨了。
刚开始看到监控数据时,我第一反应是服务器是不是要扛不住了。因为访问量比平时高了不少,带宽曲线也明显抬高,但奇怪的是,网站没有崩,服务器也没有直接报错。
网站可以打开,后台也能登录,只是部分页面偶尔会有一点延迟。
这种情况不能简单判断为“好事”,也不能直接判断为“攻击”。因为流量上涨背后可能有很多原因:
可能是文章被搜索引擎收录后带来了访问。
可能是某个页面被用户集中访问。
可能是图片、静态资源被频繁请求。
也可能是异常爬虫或无效请求造成的流量上涨。
所以我没有急着升级服务器,而是先从带宽、访问日志、缓存和限流几个方向开始排查。
一、问题出现时的表现
这次问题的表现比较明显:
网站访问量比平时高。
服务器带宽曲线明显上涨。
部分页面响应有轻微变慢。
CPU没有爆满。
内存没有明显异常。
网站没有出现持续性 502 或 504。
后台还能正常登录。
从表面上看,服务器并没有崩,但流量已经和平时不一样了。
这种情况比较特殊。
如果服务器已经崩了,那排查方向很明确,要先恢复服务。
但现在服务器没崩,就要判断这波流量到底是正常增长,还是异常请求。
二、第一步:先看服务器资源有没有被打满
我先登录服务器查看基础资源。
top
CPU没有持续100%。
再看内存:
free -m
内存还有剩余,swap也没有明显暴涨。
继续看磁盘:
df -h
磁盘空间也正常。
这一步说明服务器整体资源还没有进入危险状态。
然后我重点看带宽和连接情况。
三、第二步:检查当前连接数
流量上涨时,连接数很重要。
我先查看总连接数:
netstat -an | wc -l
再看已建立连接:
netstat -an | grep ESTABLISHED | wc -l
连接数比平时高,但没有高到异常夸张。
这说明访问量确实增加了,但不是那种瞬间把连接打满的情况。
如果连接数特别高,而且大量来自少数几个IP,就要重点怀疑异常请求或爬虫。
四、第三步:查看访问日志里的请求来源
接下来我查看网站访问日志。
tail -n 200 /www/wwwlogs/access.log
只看最后几百行还不够,所以我统计了一下访问IP。
awk '{print $1}' /www/wwwlogs/access.log | sort | uniq -c | sort -nr | head
结果发现有几个IP请求量明显偏高。
但不是所有请求都异常,其中有一部分是搜索引擎蜘蛛,一部分是用户访问,还有一部分看起来像普通爬虫。
这时候不能直接封IP,因为如果误封搜索引擎蜘蛛,可能影响网站收录。
所以要继续看请求路径。
五、第四步:分析哪些页面流量上涨
继续统计访问最多的URL:
awk '{print $7}' /www/wwwlogs/access.log | sort | uniq -c | sort -nr | head
结果发现,流量主要集中在几个页面:
一部分是文章页面。
一部分是图片资源。
还有一部分是接口请求。
这说明这波流量不是完全随机打过来的,而是有明显集中路径。
如果流量集中在正常文章页,可能是搜索收录带来的访问。
如果集中在图片、JS、CSS资源,可能是静态资源消耗带宽。
如果集中在某些接口,就要重点看接口是否被频繁调用。
六、第五步:检查带宽是不是被图片资源吃掉
因为带宽上涨比较明显,我专门看了一下图片资源请求。
grep -E "\.jpg|\.png|\.webp|\.gif" /www/wwwlogs/access.log | wc -l
发现图片请求数量明显增加。
再结合之前的图片加载慢排查经验,我知道图片资源如果没有压缩,或者CDN缓存没有命中,就很容易消耗带宽。
所以我继续检查图片是否走了CDN缓存。
如果图片请求大量回源,服务器带宽就会被快速拉高。
这次排查发现,部分图片资源确实有回源情况。
也就是说,用户访问页面时,一些图片没有完全从CDN节点返回,而是回到源站服务器取资源。
这会增加源站带宽压力。
七、第六步:检查CDN缓存命中情况
网站接入CDN后,流量上涨时最重要的不是只看访问量,而是看缓存命中率。
如果缓存命中率高,服务器压力不会太大。
如果缓存命中率低,所有请求都回源,源站很快就会吃不消。
我进入CDN后台查看缓存命中情况,同时也通过响应头判断部分资源是否命中缓存。
重点看:
图片是否命中缓存。
CSS、JS是否命中缓存。
文章页面是否有必要缓存。
是否存在大量回源请求。
排查后发现,静态资源大部分命中正常,但某些上传目录缓存规则没有完全覆盖。
这就解释了为什么服务器没崩,但带宽变高。
因为一部分流量被CDN挡住了,一部分仍然回源。
八、第七步:判断是否需要限流
流量上涨时,不能马上限流。
如果是真实用户访问,限流太严格会影响正常用户。
如果是异常爬虫,不限流又会消耗服务器资源。
所以我先看请求特征:
同一个IP是否频繁访问。
是否短时间重复请求同一页面。
User-Agent 是否异常。
是否大量请求不存在的路径。
是否频繁访问接口。
如果发现某些IP一分钟内请求非常高,就可以考虑限制。
比如在Nginx中设置简单限流:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
再在对应位置启用:
limit_req zone=one burst=10 nodelay;
但这类配置不要随便套到全站,最好先针对接口、登录页或异常路径设置。
九、第八步:区分搜索引擎蜘蛛和异常爬虫
流量上涨时,搜索引擎蜘蛛也是一个重要因素。
有些文章被收录后,蜘蛛抓取会变多。
这对网站来说不一定是坏事。
但也要区分真假蜘蛛。
不能只看 User-Agent 里写着 Baiduspider 就相信它是真的。
可以反查IP归属,也可以观察访问行为。
正常蜘蛛通常访问路径相对规律,不会疯狂提交接口,也不会大量访问后台路径。
异常爬虫则可能高频请求、无规律扫描、访问不存在路径。
这次排查中,我没有直接屏蔽所有蜘蛛,而是只限制明显异常的高频请求。
十、问题真正原因
这次网站流量突然上涨,但服务器没有崩,主要原因是:
部分文章页面访问量增加。
图片资源请求明显增多。
CDN挡住了一部分静态资源压力。
但部分上传目录缓存规则不完整,导致一定比例回源。
少量异常爬虫增加了无效请求。
所以服务器没有崩,但带宽曲线明显升高,部分页面偶尔变慢。
这不是单纯的攻击,也不是单纯的自然流量,而是正常访问、缓存回源和异常请求叠加造成的。
十一、实际处理过程
确认原因后,我做了几个处理。
1. 优化CDN缓存规则
把图片目录、上传目录、静态资源目录统一加入缓存规则。
重点处理:
uploads目录。
images目录。
static目录。
css和js资源。
减少源站回源请求。
2. 压缩部分大图
对访问量较高页面里的大图进行压缩。
图片体积降下来后,即使有回源,也能降低带宽压力。
3. 限制异常请求
对短时间内频繁请求的异常IP进行观察和限制。
没有直接全站封禁,只针对明显异常路径做限制。
4. 检查接口访问频率
对部分接口请求增加频率限制,避免接口被频繁调用拖慢服务。
5. 持续观察带宽曲线
处理后继续观察带宽走势,看是否回落到合理范围。
十二、处理后的效果
调整完成后,网站整体访问更稳定。
带宽曲线没有继续异常升高。
图片资源回源减少。
服务器连接数保持在正常范围。
页面偶尔卡顿的情况明显减少。
这说明这次处理方向是正确的。
流量上涨不一定需要马上升级服务器,很多时候先优化缓存和请求规则,就能降低源站压力。
十三、这次排查的经验总结
网站流量突然上涨时,不要只看“访问量变多”这个结果。
要拆开看:
谁在访问。
访问哪些页面。
是不是静态资源占带宽。
CDN有没有命中缓存。
有没有异常爬虫。
接口有没有被频繁调用。
服务器有没有真正吃不消。
如果不分析清楚,可能会做错判断。
真实流量应该保护,异常请求应该限制,静态资源应该尽量走缓存。
十四、后续优化措施
为了避免后续流量上涨时服务器压力过大,我做了几个长期优化。
第一,定期查看访问日志。
第二,重点页面图片尽量压缩。
第三,CDN缓存规则覆盖主要静态目录。
第四,对高频接口设置合理限流。
第五,观察搜索引擎蜘蛛访问情况。
第六,发现异常IP先分析再处理,不盲目封禁。
第七,带宽上涨时同时看缓存命中率。
网站流量增长本来是好事,但如果缓存没做好,增长也可能变成压力。
写在最后
这次网站突然流量上涨但服务器没有崩,最终不是单纯的攻击,也不是服务器配置突然变强,而是CDN缓存帮服务器挡住了一部分压力,同时部分资源回源和异常请求又带来了额外负担。
站长遇到流量上涨时,不要第一时间慌,也不要马上升级配置。
先看日志、看带宽、看缓存命中率,再判断是正常流量还是异常请求。
网站稳定不是靠一味加配置,而是靠缓存、限流、日志分析和资源优化一起配合。