我是怎样优化我的WordPress网站的?

首先这里列一下我的服务器配置,是一台1核2G内存,40G高效云盘的阿里云服务器。使用学生认证的阿里云账号可以优惠购买,一年只需一百多点。

网站跑起来的架构是lnmp,这里所有的优化基本是用nginx来进行优化的。我们优化的前提条件是在于只有这一台服务器可以用。当然富有的同志可以将资源放到CDN上,我们个人网站在访问量不大的情况下就没有这个必要了。

优化的思路有以下:
1、加缓存,其中缓存包括浏览器缓存和服务器端的缓存;
2、使用http2,更加高效的加载资源;
3、替换掉大的静态js和css资源,使用大厂提供的链接;
4、替换掉默认的avatar资源路径,因为这些资源都在国外,加载慢而且有可能被墙掉;
5、限制请求的频率;
6、对上传的图片资源进行压缩,尽量减小加载时的大小。

加缓存

浏览器的缓存

这也是最有效、一劳永逸的手段(只要不在network面板disable cache的情况下),通过添加响应头部cache-control对一些静态资源进行浏览器缓存,因为这个网站部署完之后,静态资源基本不会再发生改变,所以这些静态资源可以尽可能设置到最大。这里直接使用expires max来代替add_header cache-control

这样我们访问的时候可以看到响应头部有cache-control头部和expires头部

nginx 配置expires头部为max的时候,max-age是10年也就是315360000秒

fastcgi_cache

因为网站也不是经常更新,那些动态内容也就没必要每刷新一下,就需要过一遍php渲染出来,这样稍微访问量一增,这个小服务器也就刚不住了。这个时候加上服务器缓存就好多了,第一次访问生成cache之后,后面都是nginx加载静态文件一般,性能不要好太多。贴上配置:

关于fastcgi_cache的配置和使用,这里不做过多讲解,这里有个 文章写得挺详细的:
https://www.cnblogs.com/sunsky303/p/11045194.html
第一行:配置了fastcgi_cache存放的路径,缓存目录层数是两层,其中定义了一块共享内存名为article,缓存在磁盘上存放的失效时间是20天,最大缓存存放空间不得超过10G。
第二行:定义了缓存的key,也就是以什么来区分要做不同的缓存,fastcgi_cache的key默认是没有的,不像proxy_cache默认是$scheme$proxy_host$request_uri,必须进行设置
第三行:定义哪些请求方法会被缓存
第四行:定义在什么情况下使用过期的缓存
第五行:定义在使用过期缓存的同时,开始一个子请求去更新过期的缓存。
第六行:忽略掉上游的cache-control expires vary响应头
第七行:隐藏上游的cache-control响应头

上面两个截图
第一个:定义哪些url是需要进行缓存的。这里根据WordPress的规则,使用时间来进行正则匹配,后续时间更新了,加上就好了。上面的配置的意思是先定义个变量skip_cache为1,如果url中包含2020/03、2020/02、2020/04这些关键字的话,就设置skip_cache 为0,后面会使用fastcgi_cache_bypass $sip_cache,如果skip_cache不为0则表示跳过缓存,为0表示不跳过缓存,也就是缓存,总共的意思就是如果url包含那些关键字,则进行缓存。

第二个:

添加一个响应头X_cache_status,记录缓存命中的状态
然后设置缓存生效的时间为12小时
然后定义使用的共享缓存就是我们上面定义的keys_zone
最后fastcgi_cache_bypass 对上面定义的skip_cache进行跳过不进行缓存。也就是我们只缓存文章的正文。

到这里fastcgi_cache就已经配置完成了。

缓存清除

fastcgi_cache配置好了,但是存在一个问题,就是如果我们修改了一个文章,那么不在任何干预的情况下,需要等到缓存失效了之后,才会去刷新最新的文章(nginx -s relaod 和重启nginx都不行,只要缓存文件还在,就会优先加载缓存文件。当然,可以手动删除服务器上fastcgi_cache_path下的缓存文件,这样是可以的,但是比较难以区分哪个文件是我们想要更新缓存的文件,特别是在有大量缓存的情况下,这里只是说明原理,不建议这么去做。),这多少有些不优雅,所以需要有手动删除缓存的方法。nginx缓存清除是nginx付费版的一个功能,但是github 上有一个repo是开发了一个模块,拥有简单的清除缓存的功能,支持proxy、fastcgi、uwsgi、scgi的缓存清除。地址:

https://github.com/FRiCKLE/ngx_cache_purge

nginx使用第三方模块需要进行重新编译,把项目clone下来之后,使用–add-module将模块编译到nginx中,这里我用的nginx是淘宝的tengine,方法如下:

–add-module=/root/softwares/ngx_cache_purge/

当然nginx世界中还有很多好用的模块,例如淘宝的ngx_http_concat_module、openresty的ngx_http_lua_module,都可以以这样的方式编译到你的nginx中体验体验。

在编译好了之后,根据文档进行配置。
我这里的配置如下:

我这里定义的url的规则是/$keys_zone/purge(/.*),keys_zone就是定义的共享内存的名称。location里面fastcgi_cache_purge后面跟的也是这个值,这样对应之后,我们就可以很清楚的区分在清除的是哪个共享内存中的缓存。这里监听的是127.0.0.1:7788,就只能在服务器上进行请求,或者可以使用allow和deny结合、阿里云上端口开放的白名单的方式进行客户端限制,防止有人恶意清除。

这样配置完之后,例如我们修改了一个文章,那么因为服务器上的缓存还没有失效,这个时候加载的还是服务器上缓存的修改之前的文章,从x_cache_status上也可以看到,这个值是HIT,表明命中了

但是我们想让它失效,从而加载最新的文章
就可以请求对应的purge url,可以看到,服务器上的缓存被成功的清除掉了,

这个时候再次刷新我们的文章,加载的就是最新的文章了,从x_cache_status中可以看到MISS,说明从上游的php加载了最新的文章。

至此,关于服务器上的缓存和缓存清除已经完成。

配置http2

http2协议拥有更加高效的传输性能,非常值得我们开启。配置http2协议的话,服务器上必须要配置https,就需要我们的网站域名有个证书。我直接在阿里云上买的免费的DV证书,时效是一年,当然你也可以使用 Let’s Encrypt这个免费的解决方案,但是他的证书时效是3个月,可以配置上crontab自动更新就好了,还有很多种免费证书的方法。可以去找找。nginx里面的配置方式很简单,就是在listen 443 ssl后面加上http2

这样在访问的时候,打开网络面板,点开protocol选项,刷新我们的网站:可以看到协议是http2

替换大资源

这里的大资源指的是WordPress加载的时候的一些js、css资源,例如jQuery等一些通用的库文件,我们就可以使用一些大厂提供的url,他们这些资源通常都在CDN上,加载起来就快多了,但是注意,不要找国外的地址,这样反而画蛇添足了。那么找到这些地址之后,我们怎么改变这个地址的指向呢,首先加载一遍页面之后,我们可以从网页的html中找到这些css和js的地址,或者直接在network面板里面看都行,

那么我们只需将这个地址替换成大厂的地址即可,在nginx中,有个模块ngx_http_sub_module,里面有个指令sub_filter,它可以将响应内容的指定部分进行替换,这样我们就可以将上面jquery的地址进行替换就好了,配置如下:

具体意思就是sub_filter + 要被替换的url + 替换成的url

还有一个指令sub_filter_last_modifed 表示在替换之后,在response header中保留上游返回的Last-modified字段,以方便浏览器使用if-modified-since请求头判断本地缓存是否可以用,默认是被去掉了,这里还是开启。

与此同时,sub_filter_types 指令限制了替换的内容类型,也就是content-type,默认是text/html,*代表替换所有类型。这里根据自己要替换的类型做更改。

替换默认头像

WordPress默认的头像是使用的gravatar地址,这是一个国外的地址,你会发现在加载网页的过程中,这个头像虽然很小,但是加载非常慢,非常影响整体页面的加载速度,所以我们直接把头像下载到本地,使用本地的地址,但是我发现这个头像虽然显示的画面不一样,但是其资源是一样的,只是后面跟的参数不同,但是下载到本地之后,虽然后面跟的参数和原来的一样,但是显示的头像却是一样的,不知道怎么回事,但是这个不重要,我们直接替换就好了,方法还是使用sub_filter进行替换,我做了一个专门的域名avatar.starbugs.net来放这个头像,注意,wordpress如果主站是https,加载资源的域名必须也是https,不然会有问题,是不是一定不是很确定,但是在我替换的过程中有这个问题,还是去阿里云买个证书,配上就好了,这里列出配置文件:

Avatar.starbugs.net的配置文件:

这里配置了一个防盗链和自定义403,因为tengine默认的403页面有将近1K,这里返回的就很小了。能省一点是一点。。。

这样下来,我们刷新页面,就会发现,jQuery被替换了,头像也被替换了,

限制请求的频率

限制请求频率这个方法对于我们这种小网站还是非常重要的,因为带宽就那么一点点,如果有人暴力刷,必然服务器负载高升,其他人加载缓慢,而且我配置了访问日志,还会有可能在短时间内日志爆满导致服务器崩溃,甚至ssh上去都困难。

配置限制访问频率可以用nginx的ngx_http_limit_req_module,具体使用方法可以看官方文档,或者去搜专门讲这个的文章,这里贴出我的配置:

首先以$request_uri$binary_remote_addr的组合来作为进行限制的key,也可以理解为条件,定义了一个共享内存叫做limit,限定的速度是1次/s。重写了被限制后的响应状态码,默认是503,我这里改为533,就是随便找个5xx状态码没被用到就行,专门用来提示请求过快。同时在server中定义了533的响应内容,就是提示响应过快,但是改写了状态码为200.然后指定被限制后的日志的级别为info,可以减少在被限制后的日志记录次数。

最后用limit_req 指定zone为共享内存limit,nodely表示如果超过1r/s则立即返回限制提示,而不是对请求进行延迟。

除了配置限制请求速率之外,还可以进行配置一些简单的对user-agent的限制:

当然一般情况写爬虫,对user_agent进行伪造是最基础的,但是最好也是配置上。

压缩图片

最后,就是对我们文章里面的图片进行压缩,这也是最简单、最直接的方法,更何况我用的电脑分辨率是5K屏,截下来图都非常大,更需要进行压缩了,这里贴出一个可以压缩图片的网站:https://tinypng.com

到这里对wordpress的优化就结束了,不禁感叹nginx的强大,感谢nginx的作者和献力于开源世界的大佬们,由于他们的不懈努力,我们站在巨人肩膀上才能眺望到远方的美景。上面这些思路我们完全可以利用到工作的环境中,这里只是利用WordPress做个演示。另一个就是要保持对知识的渴望,正如本站的slogan一样,你知道的越多,你就会发现有更多的未知等待去探索。

最后,如果这篇文章有幸被您看到,可以评论一起探讨,或者你也可以在评论区写上你的优化的方法。

留下评论