众所周知,一个网站能否成功吸引用户持续访问,除了超高的安全度和优秀的内容以外,最重要的便是其访问速度了。如果网站的访问速度非常非常慢,一张网页的内容超过五秒了都没有正常加载出来,这样肯定会让访客失去耐心,从此再也不来这个“破网站”了。

为了解决这个至关重要的关键问题,我们准备了一套简单易行的简易加速方案,希望能为WordPress站点的速度核心增添一份澎湃动力。

16.1 Linux服务器流量加速:BBR


在众多的互联网协议中,以TCP协议和UDP协议这两个协议的流量最为常见,当然还有其他的协议,但是在服务器上则是这两个协议最常被使用。由于UDP协议常被用来做私有协议的流量通信,电信运营商为了运营安全以及其他一些原因,所以将服务器发送到用户主机上这个下行通道的所有UDP协议的流量端口全部封锁了。

由于此原因,所以我们只能加速TCP协议下的流量了。我们选择了Google开源的名为BBR的TCP拥塞控制算法,它解决的是OSI中的第四层——传输层的问题。Google将算法提交到了Linux内核中,Linux内核的最新版内核已经用上了该算法。根据以往的传统,Google会先在自家的生产环境上线运用后,然后才会将代码开源,大家可以不用担心自己替别人趟了浑水。当然,我们也可以选择使用其他算法来加速我们的服务器,比如KCPTun、FinalSpeed、Net-Speeder等等;这些方案有的可能比BBR的加速效果明显或是运用范围广泛,但它们有的侵略性强可能导致服务器被封禁、有的则是服务器流量的加速效果不明显,我们综合考虑以后再进行选择,还是BBR最为合适稳妥。

在正式使用之前,我们要友情提示一下,BBR必须在搭建正式的网站应用运行环境之前完成,如果在环境完成以后再进行安装的话,可能会导致网站数据丢失或者失效等一些不可预知的麻烦。这里我们使用Github上一位开发者开发的一键安装脚本,来为Linux安装最新的内核并开启BBR。

这个脚本可以在以下三大Linux发行版上进行使用,它们分别是CentOS 6+,Debian 7+,Ubuntu 12+;服务器的虚拟技术不能为OpenVZ,也就是说可以使用以KVM、Xen、VMware等虚拟技术虚拟出来的服务器;对服务器的内存要求不是很高,只要大于或等于128M即可。国内外的云计算服务商所提供的服务器,一般最小的都为1G,都可以满足其安装要求。

此一键安装脚本已经在阿里云、腾讯云、美团云、Vultr、DigitalOcean、ConoHa等国内外主流的云计算服务商的服务器全部测试通过,可以正常安装使用。少数云计算服务商如Linode所提供的Linux内核是自行编译的精简内核,使用一键安装脚本可能会出现一些问题;如果一键安装脚本检测到服务器的虚拟方案为OpenVZ,会提示错误,并自动退出安装;脚本运行完重启发现开不了机的,打开VPS后台控制面板的VNC,开机卡在grub引导,手动选择内核即可;由于使用的是最新版的Linux系统内核,为保险起见,请勿在生产环境安装使用,产生不可预测的麻烦后不负任何责任。如果非要在生产环境中使用,请将重要数据进行备份。

16.1.1

升级Linux系统内核
要想正常使用BBR,Linux内核的版本至少得是4.9。如图16-1所示,我们登录服务器,输入命令uname -a或uname -r,去查看系统的内核版本,返回的数值大于或等于4.9就可以正常安装使用BBR。我们从图16-1中可以看出,此系统的内核版本明显不符合要求。
2-7-1-1-794×61.png
图16-1 查看系统的内核版本

如图16-2所示,如果是CentOS系统,我们执行如下命令即可升级内核:yum —enablerepo=elrepo-kernel -y install kernel-ml kernel-ml-devel,执行命令后可能会碰到如图16-2所示的错误反馈。
2-7-2-1-720×90.png
图16-2 尝试升级系统内核

如果真的碰到了这种情况,不要惊慌,也不要害怕。系统是在告诉我们,它缺失一个ELRepo仓库。CentOS作为世界上使用最广泛的企业级Linux发行版,为了保持系统的稳定性,一般不会集成一些不必要的软件到系统上。如果少了我们需要的东西,我们就自己动手把它安装完成。

如图16-3所示,我们输入命令rpm —import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org,然后进入ELRepo仓库的官网,根据提示复制粘贴适合自己系统的相关命令。由于我们的系统是 CentOS 7,我们选择执行rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm这条命令;如果系统是CentOS 6的系统,我们则选择执行如图16-4所示中的第三条命令。此时,我们再重新执行yum —enablerepo=elrepo-kernel -y install kernel-ml kernel-ml-devel这条命令,操作将会成功完成。接下来我们输入命令grub2-set-default 0来更新grub文件,如果是CentOS 6,则输入命令sed -i ‘s/^default=./default=0/g’ /boot/grub/grub.conf 来更新grub文件。最后输入命令reboot重启服务器。
2-7-3-1-720×90.png
图16-3 安装ELRepo仓库

2-7-4-1-700×465.png
图16-4 ELRepo仓库官网安装提示

如果是Debian或Ubuntu系统,我们需要手动下载最新版的内核来安装升级。我们可以去http://kernel.ubuntu.com/~kernel-ppa/mainline/下载最新版的格式为deb的内核安装包。如果系统是64位,则下载amd64的linux-image中含有generic的deb包;如果系统是32位,则下载i386的linux-image中含有generic的deb包。

安装的命令如下(以64位4.12.4举例,如果不同请替换为下载好的deb包):dpkg -i linux-image-4.12.4-041204-generic_4.12.4-041204.201707271932_amd64.deb;安装完成以后,我们再执行命令/usr/sbin/update-grub。最后重启服务器即可。

*拓展知识:

如果使用的是Google Cloud Platform的服务器,在更换内核后有时会遇到重启后整个磁盘变为只读的情况,我们只需执行命令mount -o remount rw /即可恢复正常。

16.1.2

安装使用BBR一键安装脚本
我们使用超级管理员root登录服务器,输入以下代码块:

  1. wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh
  2. chmod +x bbr.sh
  3. ./bbr.sh


服务器下载完成这个一键安装脚本以后,我们按一次回车键执行命令,接下来系统会提示随意按一个键来安装脚本,我们继续按回车键即可。脚本安装完成后,我们按照系统提示输入y来重启系统。

系统重启完成以后进入服务器,如图16-5所示,我们输入命令sysctl net.ipv4.tcp_available_congestion_control,系统的反馈信息通常情况下会为net.ipv4.tcp_available_congestion_control = bbr cubic reno;接下来我们输入命令sysctl net.ipv4.tcp_congestion_control,系统的反馈信息通常情况下会为net.ipv4.tcp_congestion_control = bbr;接着,我们输入命令sysctl net.core.default_qdisc,系统的反馈信息通常情况下会为net.core.default_qdisc = fq;最后我们输入命令lsmod | grep bbr,如果系统反馈信息中出现tcp_bbr模块,即说明TCP BBR已经成功启动。
2-7-5-1-550×150.png
图16-5 查看BBR模块是否成功启动

16.2 Web服务端缓存:CDN


我们一开始的方案的想法,是针对Web服务器本身进行优化,调整Apache和Nginx的各项性能参数,但是又想到不同的业务具体的性能要求又不同,这样会大大增加具体操作难度。故我们想到了使用一键优化脚本的简单办法,不过这个脚本的适用性不高,只能在有限的场景里使用。我们考虑到使用阿里云的人数比较多,所以在阿里云的OneinStack镜像里,增加了一个专用的一键优化脚本;它除了能优化Apache和Nginx的性能参数外,也能根据服务器实际情况优化如MySQL的性能参数。具体代码块如下:

  1. wget http://mirrors.linuxeye.com/scripts/optimize.sh
  2. chmod +x ./optimize.sh
  3. ./optimize.sh


后来我们在查询资料的过程中,发现谷歌开源过一个PageSpeed模块。这个模块可以让管理员无需更改网页内容和工作流程,自动将网页性能最佳实践应用到前端页面和相关资源,从而加速网站、减少页面加载时间。不过深入了解后,我们发现PageSpeed模块还是不够稳定,贸然使用可能会出现一些未知的麻烦,如果个人不是相关方面的高手很难解决,再加上中文网络世界里有关PageSpeed模块的详实有用的资料不是很多,所以我们又放弃了这个方案。

拓展知识:
如果大家想尝尝鲜的话,可以自行参考我们帮大家筛选出的资料:
Google网页性能优化分析工具
https://developers.google.com/speed/pagespeed/insights/
Google PageSpeed Module英文官网 https://developers.google.com/speed/pagespeed/module/
Google PageSpeed Module官方英文文档
https://www.modpagespeed.com/doc/
《Apache下安装配置PageSpeed模块,轻松完成网站提速》
https://blog.linuxeye.cn/349.html
《Nginx下安装配置PageSpeed模块,轻松完成网站提速》
https://blog.linuxeye.cn/318.html
《实测Nginx服务器开启PageSpeed后的加速效果》
https://zhangge.net/5063.html

更多关于PageSpeed模块的资料,请大家自行使用百度或谷歌等搜索引擎进行搜索。

在进行综合考虑以后,我们选择了一个最常用的成熟方案——使用内容分发网络即CDN来加速网站,并且使用CDN无需进行操作复杂的配置过程!目前,云服务市场上大致有两种类型的CDN,一种是混合型CDN,它除了有加速网站应用的效果,通常还有其他功能如WAF即Web应用防火墙;另外一种就是专用型CDN,这种类型的CDN功能很纯粹,不过配置过程可能要比前面提到的混合型CDN配置要复杂些。

CDN这个云服务的细分市场的竞争十分激烈,可以说早已经是一片红海了,因此以免费为噱头来吸引新用户注册使用的云服务厂商的数量特别多。但是,敢于到处宣传自己的CDN产品支持HTTPS流量,并提供一定免费额度的云服务厂商,就不是特别多了。下面提到的五家云服务厂商,是我们精选出的、云服务市场上比较有名的、且有一定的免费HTTPS流量额度的、实力和财力都还不错的厂商!

16.2.1

混合型CDN
我们从国内外选择了混合型CDN 的两个代表,它们分别是360网站卫士和Cloudflare。

360网站卫士中文官网 http://wangzhan.360.com/
Cloudflare英文官网 https://www.cloudflare.com/

360网站卫士属于我们前面提到的混合型CDN,除了可以对网站应用加速以外,还把功能拓展到了与360的核心业务——安全上。

我们使用360网站卫士,来为网站应用加速保护的配置过程十分简单,按照系统提示,将DNS解析配置好即可。不过,有些设置项,需要按照网站应用的需求专门配置一下;如图16-6和图16-7所示,如果网站是使用WordPress为基础开发的,则防护设置中的“防火墙绿色通道”和加速设置中的“静态资源”,这样设置以后使用过程中才不会出现问题。
2-7-6-1-800×400.png
图16-6 设置防火墙绿色通道

2-7-7-1-800×300.png
图16-7 设置静态资源的缓存时间

360网站卫士也可以对HTTPS流量进行加速,我们把相关证书上传即可,不过其前提是网站本身已经配置好了安全证书,然后才能正常使用此功能。不过我们测试后发现,开启HTTPS流量加速后,我们的网站应用的速度反而慢了好几倍,还不如不用这个功能。可能是由于360网站卫士这个业务不赚钱反而还亏钱,所以360方面没有认真对待;

Cloudflare的使用配置过程,大致流程和360网站卫士相似。不过还是有细小差别的,使用其服务无需对域名进行备案;另外必须把域名的解析全部交给Cloudflare,单独对域名的某个前缀进行配置比较麻烦。

16.2.2

专用型CDN
我们从国内选择了专用型CDN的三个代表,它们分别是腾讯云CDN、VeryCloud云分发和又拍云CDN。

腾讯云CDN中文官网 https://cloud.tencent.com/product/cdn
VeryCloud云分发中文官网 https://www.verycloud.cn/cloud/cdninfo
又拍云CDN中文官网 https://www.upyun.com/products/cdn

三家云服务商都提供了一定的免费HTTPS流量额度——腾讯云CDN提供了每个月10GB的额度;VeryCloud云分发提供了每个月50GB的额度;又拍云CDN则提供了每个月15GB的额度和10GB的存储空间,不过前提是加入又拍云联盟,在网站页面底部挂上又拍云的标识。这三家云服务厂商的CDN,其中的两家——腾讯云和又拍云深度使用过,用户体验相对比较好;这三家云服务厂商的CDN的使用配置过程,要属腾讯云CDN的配置最为细致繁琐,我们按照系统流程配置完成以后,还需要对各种配置参数的细节按照网站应用的需求进行测试调整,然后才能发挥出最大的效果。

我们可以对这三家云服务厂商的CDN单独测试,也可以结合智能DNS来一起进行测试。如图16-8所示,我们可以利用第9章的内容里介绍的CloudXNS的CNAMEX解析,来为我们将要测试的这些CDN进行赋权。
2-7-8-1-500×80.png
图16-8 使用智能DNS为CDN赋权

如图16-8所示,其中的1和100分别代表1%和100%。在某一项的数值为100时,相当于对某一家的CDN做单独测试;几项值的数字加起来等于100时,相当于同时进行测试。只不过比例可能是大致平分,几家的CDN轮流当主力;也可能是某一家的CDN作为测试主力,其他几家则是测试替补。

接下来,我们以腾讯云CDN作为示例,来详细展示配置腾讯云CDN的几个主要细节;此配置细节可能只能应用在WordPress中,如果要使用到其他CMS中,请大家认真思考后再进行模仿操作。按照系统提示配置完成DNS解析等各项操作以后,我们来对除基本配置外的其他四项配置——访问控制、缓存配置、回源配置和高级配置,来一一进行细节展示。

首先,基本配置必须填写无误。基本信息中,业务类型应为静态加速;源站信息中的源站类型一般应为自有源,源站地址应为类似192.168.1.1:443或192.168.1.1:80的记录形式。只不过大家需要将192.168.1.1更改成自己购买的服务器的公网IP地址,后面的端口是443还是80取决于网站应用是否配置了安全证书;回源配置中的回源host填写源站的访问域名,而不是专用于CDN的加速域名。譬如,我们为爱评测网配置回源主机名,应该填写主域名ipc.im,而不是CDN专用的二级域名cdn.ipc.im或CDN专用服务域名的二级域名cdn.ibeatx.com。

访问控制的主要重点在过滤参数配置和IP访问限频配置。如图16-9所示,我们必须将过滤参数关闭。因为WordPress后台的不少功能的URL地址中都含有“?”这个符号,打开过滤参数功能后会影响网站的正常运行;IP访问限频,限制的是每一个IP在每一个节点每一秒钟的访问次数,它是在传输层上对CC攻击进行抵御。腾讯云CDN的默认单IP访问阈值是10QPS,一般来说不需要修改默认值。
2-7-9-1-900×800.png
图16-9 腾讯云CDN的访问控制

其他的三个选项中,防盗链配置和IP黑白名单配置暂时不用管,视频拖拽基本上用不到。如果使用的是如OneinStack这样的工具搭建的网站应用,防盗链配置则不用开启。一是因为这些工具本身便会提供防盗链功能。二是使用工具提供的防盗链功能后再开启这里的防盗链,会发生规则上的冲突,导致网站应用没有权限访问的故障出现;IP黑白名单,作用类似于前面提到的iptables防火墙和安全组。如果已经设置好了iptables防火墙和安全组的规则,我们就没有必要再进行重复设置;之所以说视频拖拽基本用不到,是因为很少有把视频等流媒体文件存储在私人服务器上进行播放的需求。一般来说,都是将视频上传到如优酷、YouTube和哔哩哔哩等第三方视频网站,通过审核后再引用相关视频的播放代码到自己网站上使用。

如图16-10所示,缓存配置部分的主要重点,在于具体的缓存过期规则;和一条条缓存过期规则的权重分配,越在上面的规则其被执行时的权重越低。
2-7-10-1-1200×600.png
图16-10 腾讯云CDN的缓存配置

我们将在下面展示为WordPress打造的具体缓存过期规则,请大家根据个人需求再进行参考使用:

类型 内容 刷新时间
全部 All 0秒
文件类型 .bmp;.psd;.ttf;.pix;.tiff 365天
文件类型 .jpg;.jpeg;.gif;.png;.ico 365天
文件类型 .html;.htm;.shtml 180天
文件类型 .js;.css 30天
文件类型 .php;.txt;.xml;.jsp;.asp;.aspx;.do 0秒
文件夹 /wp-admin 0秒
全路径文件 /robots.txt;/sitemap.xml;/wp-login.php;/wp-signup.php 0秒


请注意内容中的标点符号,都是使用半角状态下的英文输入法打出来的;如果需要调整每一条缓存过期规则的具体顺序,请先点击“调整优先级”。

回源配置的具体细节如图16-11所示,一开始我们可以把三项回源设置都开启,然后在使用过程中根据自身业务特点进行微调。其中的Range回源配置一定得开启,因为它有助于减少大文件分发时的回源消耗,缩短网站应用的响应时间;中间源配置可以根据服务器的性能决定是否开启。不过我们还是建议开启此项,因为它可以降低回源后源站的访问压力;回源跟随302配置暂时不建议开启。因为开启它后会出现一些偶尔的访问错误,影响访客访问网站时的浏览体验。
2-7-11-1-800×500.png
图16-11 腾讯云CDN的回源配置

如图16-12所示,高级配置的主要重点在前面三项;最后一个选项是超高难度的选项,我们暂时使用不到,可以先不管,保持默认状态不会影响具体使用时的体验。带宽封顶配置中,请打开“带宽封顶”设置项。这个设置项默认的带宽阀值是带宽阈值10Gbps,超出免费流量额度后,其流量会回到源服务器的IP ,也就是说会暴露服务器的真实IP地址。但是我们不得不打开这个选项,如果有人恶意攻击网站,不打开这个选项,CDN的使用成本将会十分高昂,可以说一夜之间赔一套房子都有可能。目前的解决方法,除了使用CloudXNS进行流量负载均衡等措施以外,还可以提前购买一个足额的流量包以备不时之需;HTTPS配置的设置项中,一定要将“强制跳转HTTPS”打开,并将跳转方式设置为301跳转(设置成302跳转也可以,只不过前者是永久性跳转,后者是临时性跳转)。证书可以在腾讯云里面申请后导入到CDN中,也可以在别的云服务厂商处申请后将证书的公钥和私钥文本复制粘贴进去。需要注意的是,如果服务器上没有配置证书,这里最好不要开启配置;SEO优化配置选项处,我们选择打开“搜索引擎自动回源”。
2-7-12-1-1500×750.png
图16-12 腾讯云CDN的高级配置

最后一个设置项,“HTTP header配置”我们可以先不管,不进行配置也不会对网站应用有影响。如果大家想进行尝试,可以先查看腾讯云提供的指导文档,具体的网址是https://cloud.tencent.com/document/product/228/6296;也可以购买本书后面的推荐书单中出现的相关入门书籍,如《图解HTTP》。如果不带www的域名和带www的域名同时接入了腾讯云CDN,可以利用HTTP header配置,将不带www的域名永久重定向到带www的域名(这里只需要在example.com处设置),具体设置为:将HTTP header参数设置为Access-Control-Expose-Headers,并在弹出的相关输入框中填写设置为response.sendRedirect(“http://www.example.com");这里的www.example.com请替换为大家自己购买的域名。如果网站启用了安全证书,请将http更换为https。

16.3 PHP加速:代码缓存和进程管理

16.3.1

PHP代码缓存:Zend OPcache
为了提高PHP的性能,同时降低对服务器的压力,我们可以使用PHP缓存插件来提升PHP代码的执行效率。

比较常见的PHP缓存插件一般有三个:APC、XCache、eAccelerator。不过,2012年11月中旬发布的PHP 5.5版本中集成了一个官方的PHP缓存插件——Zend OPcache,所以常见的 PHP 缓存插件目前是四个。

我们前面介绍的OneinStack里面已经集成了这四种PHP缓存插件:官方的Zend OPcache,中国人自己开发的XCache,APC的简化版APCu,以及eAccelerator。如果我们想使用PHP缓存插件,一般情况下推荐官方的Zend OPcache。不过,如果大家想要试试其他的插件如XCache也是可以的,只不过使用上可能要稍微麻烦一点,因为它需要另外设置一个单独的密码。

使用OneinStack安装PHP缓存插件有两种途径:如图16-13所示,一种是在搭建网站应用运行的环境时顺便安装上;如果在前面的操作步骤中忘记安装了,我们还可以使用OneinStack附带的附加组件安装脚本来安装,把遗漏安装的PHP缓存插件补充进去。我们可以登录服务器,输入cd oneinstack命令进入相应的目录,然后执行./addons.sh命令,这时会出现如图16-14所示的安装选项。我们选择1,然后再输入1确认,这时会出现如图16-15所示的四个选项,我们根据自己的喜好选择即可,一般情况下只需要安装一个;OneinStack官方默认选择1,不输入直接回车确认会安装Zend OPcache。
2-7-13-1-440×120.png
图16-13 搭建网站应用运行环境时安装PHP缓存插件

2-7-14-1-500×250.png
图16-14 网站应用运行环境搭建完成以后独立安装PHP缓存插件

2-7-15-1-360×150.png
图16-15 选择需要安装的PHP缓存插件

16.3.2

PHP进程管理:PHP-FPM
PHP-FPM(FPM英文全称:FastCGI Process Manager)是一个PHP FastCGI进程管理器,它可以用来替换PHP FastCGI的大部分附加功能,这对于高负载网站来说是非常有用的。

从PHP 5.3.3版本开始,官方已经将PHP-FPM收录进来了,我们使用它无需单独安装,只需在安装PHP选择版本时注意一下,大于或等于这个版本号即可。如果我们是使用OneinStack安装的PHP,我们可以使用如图16-16所示的组合命令来管理其进程。假设我们想查看进程的状态,我们可以使用命令service php-fpm status。不过需要注意的是,只有网站应用运行环境为LAMP或LEMP时才能使用此命令。
2-7-16-1-625×450.png
图16-16 管理PHP-FPM进程的命令组合

拓展知识:
《PHP-FPM参数优化》
https://blog.linuxeye.cn/380.html

16.4 数据库加速:Redis和MemCached/MemCache


Redis、MemCached和MemCache这三者的具体概念就不过多解释了,我们只简单介绍一下它们的作用——我们可以用它们来给数据库进行缓存加速。其中,Redis和MemCached/MemCache没有太大的联系,它们的优缺点各有不同,使用它们要考虑应用场景后再进行选择;MemCached可以看作MemCache的升级版,是一个后来新开发的分布式高速缓存系统。通常来说,喜新不用旧,一般情况下我们优先使用MemCached。我们这里不谈它们的详细情况,就说一下如何安装使用它们。

跟安装PHP缓存插件一样,我们在使用OneinStack搭建网站应用运行环境时,可以顺便把Redis和MemCached安装完成;我们也可以在事后使用附加组件安装脚本,单独安装Redis和MemCached。
2-7-17-1-660×200.png
图16-17 搭建网站应用运行环境时安装Redis和MemCached

2-7-18-1-500×150.png
图16-18 网站应用运行环境搭建完成以后独立安装Redis和MemCached

注意:本方案之所以叫简易方案,是有一些原因的,因为它只是一份完整详细的方案之中的一部分而已。一个完整详细的方案,是需要我们根据自身业务需要而进行调整——即不是普适的。譬如,我们前面采用一个名为OpenResty的高性能Web平台,是由于它能方便地搭建处理超高并发、扩展性极高的动态Web应用,适合用在我们后面提到的网站实例中;另外,本方案最后提到的Redis和MemCached,需要我们配合一些WordPress插件进行使用,才能正常发挥其作用。