缘起
昨天晚上我在v2ex.com里中宣告www.joyocapital.com博客可以访问,随后被来自全国各地的热心网友蜂拥而入把网站搞挂。有部分小伙伴反馈访问慢,还有一个小伙伴还尝试CC攻击,直接让wordpress小站不可用。我的xmlrpc.php已删除但还是能被cc攻击成功,可见性能差到何种程度。
今天上午至今折腾了博客性能优化。待会儿就要出门办理事情,趁热把经验总结写下来。
wordpress网站加速
为了更好地对比,我记录了网站加速前后的性能测试对比。从chrome浏览器看,TTFB响应>30s。TTFB是接收到响应的首字节前花费的毫秒数,主站http://www.joyocapital.com的服务器处理时间过长。
从360云ce.cloud.360.cn/task进行了测试,即使不在杭州,全国各地的访问结果都很慢。
我们开始性能优化之旅…
性能优化选型
要解决问题,首先得搞清楚问题是什么。经过分析,wordpress的处理链路可以抽象成 以下3个阶段:
Domain->ip->页面计算->数据库计算
在Domain->ip这个阶段,我们可以使用CDN来加速。目前国内外的加速CDN可选范围很广,如阿里云盾、百度云加速、腾讯云XX、知道创宇加速乐、云锁、安全狗等都提供此项服务。国外同类产品做得最大的是cloudflare和akamai。
CDN加速的原理简单说就是在全国各地部署CDN缓存服务器,引导用户在访问时优先选择近源的CDN镜像,整体网络传输链路变短了,服务器压力也会小。
最终我的技术选型是使用百度云加速,说不上很强大,免费的,能用就好。百度云加速网站在这里:next.su.baidu.com。
在ip->页面这个阶段,其实就是要部署wordpress的一些插件能达到这个效果。我主要做了以下优化:
WordPress默认引用了google的font被墙导致页面访问不到或特别慢,通过修改为360的useso.com解决。
WordPress默认使用一个国外的头像服务,同样因为被墙导致访问特别慢,通过禁用头像解决。
WordPress的插件方面我选型使用了Lazy Load,图片懒加载用的,说明只有需要访问图片的时候再加载,平时不需要。
在wordpress目录下wp-config.php添加以下两个设置,表明不需要存储postversion并且开启缓存。
define(‘WPPOSTREVISIONS’, false);
define(‘ENABLE_CACHE’, true);
在wordpress的index.php目录下,找到define(’WPUSETHEMES’, true);
在后面加上:obstart(‘obg zhandler’),表明会使用gzip压缩传输。
在页面计算->数据库阶段,我的技术选型是使用memcached加速方案,安装方法主要是参考以下实施步骤:
[安装memcached]
#yum -y install memcached
[安装 php的memcache插件]
#wget http://pecl.php.net/get/memcache-2.2.6.tgz
tar vxzf memcache-2.2.6.tgz
cd memcache-2.2.6
/usr/bin/phpize (如果不知道phpize在什么位置,可以用find / -name phpize查找)
./configure –enable-memcache –with-php-config=/usr/bin/php-config –with-zlib-dir
make
make install
记录下安装成功后的提示,类似于:
Installing shared extensions: /usr/lib/php/modules/
把这个地址记录下来,增加扩展extension配置文件
查看是否存在 /etc/php.d/memcache.ini 这个文件,如果不存在,我们就自己建立一个
vi /etc/php.d/memcache.ini
增加1行 extension=memcache.so
最后验证一下是否安装完成 php -m|grep memcache
应该会显示memcache
关于php.ini的修改,一般需要重启php-fpm才会生效。
#/etc/init.d/php-fpm restart
可以自己写一个小程序验证下memcache是否生效,相关代码如下:
$memcache = new Memcache; //创建一个memcache对象
$memcache->connect(‘localhost’, 11211) or die (“Could not connect”); //连接Memcached服务器
$memcache->set(‘key’, ‘test’); //设置一个变量到内存中,名称是key 值是test
$get_value = $memcache->get(‘key’); //从内存中取出key的值
echo $get_value;
?>
执行之后没有报错则表明配置成功。我处理时发现的问题是”Memcache类没找到”,回头看之前的步骤,确认是忘记重启php-fpm了。
优化效果
上述这些优化做完后,还是会有一些提升的,再测访问速度就基本没有红色的了。
小插曲:wordpress遭受cc攻击的解决方案
昨晚有热心网友测试cc攻击,现在记录解决方案如下:
找到自己的访问日志存储地址,一般在nginx的conf目录下有定义的。
到日志访问存储地址下,使用以下语句看看到底什么ip在刷:
# cat wordpress.log | awk ‘{print $1}’ | uniq -c|sort -rn|head -20
会得到对应的访问top的ip地址,使用iptables把对应ip丢到黑名单即可,譬如:
iptables -I INPUT -s {ip} -j DROP
搞定
后续计划
博客搭起来了,除了能记录一些日常感悟以外,还可以尝试growth Hacking技巧,在实践中提高。
需求也可以来自网友小伙伴,有兴趣及有好主意合作的朋友可以给我留言。