为了加速WordPress网站我踩过了哪些坑?wordpress程序加速经验分享

内容纲要

我有一个Wordpress的站点,上面跑了非常多插件(大概运行的有40多个),导致整个网站的速度很慢,很多时候要load一个页面需要差不多10秒。

为什么我要装这么多插件呢?其实也是为了满足多多少少的不同功能,比如SEO,在线业务系统,电商系统,SMTP,Cache,备份,性能调优,微信小程序,微信登录,支付系统,统计系统,营销系统,翻译系统等等……基本上很多插件是不太能一下子取缔的。这么些插件慢慢得消耗了很多服务器的资源,导致服务器越来越慢,用户也是怨声载道,这个对用户体验来说非常差,而且也很影响用户留存。

其实Wordpress的调优这个过程,前前后后经历了小半年,在这里我把一些还记得的记录下来,也给大家提供不同的思路。

  1. 首先在安装很多插件的时候,插件是极有可能调用一些跨域的内容的,比如js文件,比如font字体文件。而这里面一些知名的字体文件(比如Google字体)以及js文件,所在的域名可能是国内访问不了的,比如是引用的地址来自Akamai CDN或者其他MAXCDN等。因此,这个时候需要找到特定插件,并且可能需要改掉插件里面的一些涉及这些无法访问的域名地址的地方。一个比较好的方法是充分利用Wordpress的Child主题,和mu-plugins目录。

  2. 我们网站里面,如果出现了很多图片,一定要进行图片压缩,否则一个图片就需要占用几百KB甚至是几兆的空间,用户加载起来就非常慢了。另外,一定要用Lazy-loading,这个功能的好处是,在你的图片还没有完全加载完之前,先加载并显示你的网页内容(这个时候你的图片会转圈圈),然后再慢慢加载你的图片。这样对用户体验会提升非常多。我们用的是Smush插件,自带图片压缩和Lazy-loading功能。

  3. 缓存,缓存,缓存!重要的事情说三遍,利用W3 Total Cache之类的插件引入Wordpress的缓存,你可以利用Memcached或者Redis来做缓存,将页面缓存,数据库缓存,对象缓存都打开。这个功能很重要,如果在游客(非登录)状态,可以将页面加载从秒级变成毫秒级。因为缓存是跑在内存的,会比普通磁盘或者SSD的读取速度快很多。但是这个方法对登录用户的提升有限,因为登录的用户有很多内容无法缓存(比如每个人的购物车等)。

  4. CDN,一定要将静态文件(视频,图片,js,字体,css等等)全部卸载在CDN网络上,这样用户加载这些文件能更加快速。用户能直接从离ta最近的CDN POP点下载文件,而不需要回到服务器本身。这个功能也能通过插件W3 Total Cache完成。并且我们需要对不同的文件类型进行分类,比如视频很少更新,TTL为一年,图片次之,TTL为一个月等……

  5. 选择性能足够的主机。在很长一段时间,我们使用的是AWS上T系列的主机(突发型,也是共享CPU和内存的),因此服务器性能是不稳定的,而且这个状况无法单纯地从CPU/内存的使用率看出来,需要看CPU队列里是否有过多等待处理的事务。性能不足导致间接性服务器502报错。因此一定要赋予足够多的性能空间。

  6. Apache方面,开启mpm module的worker进程管理模式(安装worker依赖模块),机器暂时稳定。 但是机器时不时莫名其妙CPU过高,从OS层面查到%st数值非常高, 并且overload数值很高以及waiting的进程都有淤塞。但是从apache,php,OS各个层面都未查到错误。于是怀疑是机器的CPU超卖导致CPU竞争。升级到t系列xlarge机型,问题依然存在,只是时间间隔拉长。于是决定换到其他系列测试,自从换到M系列之后,系统趋于稳定。

  7. 优化PHP。Wordpress是基于PHP的,因此在优化PHP的过程中也遇到了很多坑,比如选择版本问题。并不是最新的版本是最好的,我们尝试过用最新的7.3的版本,但是导致网站出现了非常多问题,最后回退了一个版本解决了。不过总体来说,还是会比用PHP5.x的版本速度快很多,尽量我们还是要选择更高级的版本。

  8.  很多插件,其实只会用在某一些页面,比如BBpress论坛插件只会用在论坛的页面,比如Contact Form 7只会用在“联系我们”的页面,还有一些后台服务(比如备份,SEO等)默认是每一个Wordpress前端页面都全部加载。这样导致了效率非常不好,很多没有必要加载的插件或多或少会拖累页面的速度。要解决这个问题,刚开始想的是做Workpress微服务化,或者拆分前后端,但后来发现因为工作量过大,或者市面上也没有比较成熟好用的方案而放弃。最后在寻找了很多不同的解决方案之后,找到了一个神器!那就是Plugin Organizer!它能做到某个页面只加载某些插件,另外的页面只加载另外一些插件,这样我就能做到特定的页面只加载特定的插件了,这样能大大减少页面的加载时间!并且很多后台服务,我都在前端给关闭了。这个功能又让我的页面整体加速了100%

  9.  我们很多视频文件,刚开始是MP4的格式,单一的文件。用户访问视频文件的时候需要下载很长一段视频才能开始播放,并且分辨率比较固定。后来引入了m3u8的播放列表和hls的点播格式视频文件,能自适应客户端分辨率和客户端网速来提供不同视频分辨率的视频分片给用户。用户能在下载一个小分片视频的情况下开始观看视频,并且实时自动调整视频的质量。这个对用户体验也是个很大的提升,而且也有很高的灵活性。

  10. 负载均衡和数据库高可用。服务器在不同时间段会遇到不同的性能波峰波谷,因此我们需要服务器能够自适应这样的情况。我们用到了AWS ELB的负载均衡器,以及Auto Scaling Group的弹性伸缩组,根据服务器的CPU和内存指标来自动扩展服务器集群。数据库也是用的托管Aurora(有5倍开源Mysql性能,并且兼容Mysql),自动解决高可用问题。

  11. WordPress性能监控/Debug,有时候我们需要知道什么插件导致Wordpress慢,什么过程导致Wordpress慢(是用户下载过程,还是PHP执行过程,还是程序查询数据库的过程呢?),我们需要借助例如Query Monitor这种插件来实时查看。

  12. 几个可以测试网站速度的网站,也是很有用的,比如gtmetrix或者UPTRENDS

Todo:

  • 将JS,CSS文件进行Merge。网站一般会加载来自不同插件的JS和CSS文件,插件越多这样的文件越多,因此用户需要到每一个文件的URL上建立一个HTTP/HTTPS的TCP连接,会有时间消耗。因此如果将很多JS,CSS文件进行内容合并(这个功能还是能通过W3 Total Cache插件完成,多么万能的插件啊。。)能很大减少网页加载时间。

  • 目前Object Cache是没有开启的,而且Page Cache也是对已登录用户关闭的,原因是已经登录的用户会查看自己的课表,自己的购物车,因此很多内容不能缓存,是动态的。需要更加细化进行调整才能不对用户操作带来影响。

  • 服务器动态加速,后期能计划利用CDN网络做全站的动态加速,目前只有静态加速