作者:黄希彤 ,腾讯云专家工程师
国庆上班,宝贝回家的志愿者开始说网站好像有点慢了,再后来说网站打不开了。登录服务器一看log,访问量增长的有点厉害啊,疑似CC攻击,打开了各种防护,流量还是居高不下。只好赶快把弹性伸缩打开,在机器扛不住的时候迅速扩容扛过去。
(弹性伸缩是程序员和运维最好的朋友之一)
接着又找运维和安全的兄弟帮忙分析log,分析不出所以然,但是看到头像的请求量明显暴涨了数百倍,占据了log的大头,于是对头像的请求进行了分流,把头像都转向到CDN透传来缓解压力。但是CDN无法缓存用户没有设置头像(404)的情况,于是又修改了服务器配置,支持“软404”,也就是说在找不到头像的时候用默认头像通过200的方式返回,避免404。
X5是腾讯的移动端浏览器内核,被广泛应用在微信、手机QQ等腾讯的安卓客户端上。回到国庆前的群里面一问,果然不小心招来了这个大客户。这个客户有多大呢,也就比微信和手机QQ加起来大一些,没有意外的话就是全国最大了
1 先检查头像流量异常暴涨的问题:为什么页面访问量增长数十倍,头像的访问量增长了数百倍呢?对比分析了discuz的移动端和PC段页面后很快找到了原因:discuz论坛打开一个帖子的时候会显示所有评论者的头像,因此头像的访问量本来应该是帖子访问量的十几倍到几十倍。但是discuz对于PC端的头像加载采用了链接静态化、懒加载等优化手段,配合协议缓存大大减少了头像的访问量,而移动端没有做这些优化。
移动端的头像没有做链接静态化和懒加载知道原因就好办了,在template/default/touch/forum/viewthread.htm中把
<span class="avatar"><img src="<!--{if !$post['authorid'] || $post['anonymous']}--><!--{avatar(0, small, true)}--><!--{else}--><!--{avatar($post[authorid], small, true)}--><!--{/if}-->" style="width:32px;height:32px;" /></span>
改为
<span class="avatar" style="zoom:0.62">
<!--{if !$post['authorid'] || $post['anonymous']}--><!--{avatar(0, small, false, false, true)}--><!--{else}--><!--{avatar($post[authorid], small, false, false, true)}--><!--{/if}-->
沿用了PC端的头像链接生成方式。但是PC端的头像尺寸比移动端大一些,所以做了个zoom。
但是这样做完,服务器流量并没有降下来……因为头像被CDN全面分流以后,帖子的访问能力被释放出来了,现在访问论坛的帖子成了主要压力来源。
Discuz的论坛帖子是可以做伪静态化的,但是不能支持真静态化。有几个原因:如果访客是带着登录态来的,那么应该给他显示个性化的动态数;统一个链接如果由PC、手机、pad和WAP终端访问,应该返回各自对应的版本。因此discuz主要靠服务器缓存机制而不是静态化来扛压力。
但是分析一下用户场景就能发现在现状下其实是有很大的优化余地的:超过90%的用户都是由X5引流的其他app的用户,基本上不会论坛的注册用户,显示设备就是安卓手机,不用过多考虑多种设备的兼容问题。
做了这些事情以后,CDN吧绝大多数的新增压力分流走了:,静态
优化后虽然服务器负载还是比以前重了很多,但是已经可以用一台服务器扛起来了
那么最终这个抗住了X5引流的论坛使用了一个什么牛逼的服务器呢?
为啥配置这么低呢?谁叫这腾讯云的服务器这么能扛啊~~~