虽然有很多介绍WordPress缓存插件的,我也介绍过用Redis来缓存WordPress生成的页面,这也不失为一个较便捷的优化方法。但是很多时候我们会使用动态的元素,比如手机端和桌面端分发不同的图片,如果直接使用前端缓存插件会导致这些元素失去原有的效果。
Apache因为可以把PHP作为自己的一个模块,所以在大并发的时候理论上效率要比Nginx之类的使用FastCGI方式的效率高一点,而且不容易出现502错误。不过我个人觉得这种差异非常小,而且PHP+Nginx也是非常常见的搭配方式,所以这里不讨论。

0x00 主题资源

很多人使用了外国主题,里面调用了许多国内无法访问或者访问很慢的资源,比如Google fonts,或者直接引用的外国CDN上的js文件,都可能导致网站加载速度过慢。在Chrome中按F12打开Developer Tools,选择其中的Network面板就可以看到加载过慢的元素,你可以下载这些文件到自己的服务器中,然后通过跨文件搜索工具搜索引用这些元素的文件并将他们的URL修改为自己网站的链接。

0x01 Nginx

如果你使用了HTTPS,那请直接开启HTTP2,极大的提高网页加载速度

listen 443 ssl http2 fastopen=3 reuseport;

fastopen是Linux内核的特性,客户端和服务端均为Linux内核时才有作用,可加快TCP握手速度。reuseport为Nginx 1.9.1的新特性套接字端口共享,详情可参考Socket Sharding in NGINX Release 1.9.1

使用keepalive并设定一个过期时间,单位为秒,在时间内浏览器和服务器会保持连接,有新的请求响应会更迅速。

keepalive_timeout 70;

对于https,可以设置ssl会话过期时间

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

对于一些静态化的资源,比如js与css文件,可以通过设置缓存过期时间,告诉浏览器在规定时间内不需要再次请求这些资源以加快访问速度(d为天,h为小时)

location ~.*\.(js|css)?$  
{  
 expires 1d;  
} 

大多数Nginx配置中都已经启用Gzip来压缩网页内容,你也可以使用谷歌开发的Brotli来提高压缩率,需要在Nginx编译时引入

#下载Brotli的Nginx模块
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init

#在Nginx编译时设定参数
./configure --add-module=../ngx_brotli

#在Nginx的主配置http块中开启Brotli
brotli             on;
brotli_comp_level  6;
brotli_types       text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

0x02 PHP

PHP对WordPress性能的影响非常大,建议使用7.0以及更新的版本,我目前在使用PHP7.1。PHP的几个大版本性能差异可以看PHP核心开发者鸟哥的评测,大致上7.x版本会比5.x版本提高一倍左右的性能。
PHP另外一个需要注意的点是要开启OPcache,OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
PHP 5.5.0及以后的版本只要未在编译时禁用默认扩展,OPcache均已附带在PHP中,只需要在PHP配置文件PHP.ini中使用zend_extension=opcache.so即可加载(Windows使用zend_extension=php_opcache.dll加载)
推荐配置(官方配置说明)

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=5
opcache.validate_timestamps=60 (你对代码的改动将会在此秒数后生效)
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.file_cache=/tmp (让Opcache把opcode缓存缓存到外部文件中)

同时可以为OPcache启用大页内存,使用命令sudo sysctl vm.nr_hugepages=512分配,PHP.ini中加入

opcache.huge_code_pages=1

对于使用IIS的用户,可以使用WinCache扩展,下载后将其释放到PHP目录下的ext文件夹中,在PHP.ini中加载

extension=php_wincache.dll
wincache.fcenabled=1
wincache.ocenabled=1

0x003 WordPress后端缓存

WordPress的后端缓存有例如使用Memcached和Redis的,不过无一例外,都需要使用TCP进行通讯,而使用PHP的扩展APCu进行后端缓存则可以绕过这一瓶颈。
首先安装APCu,如果你和我一样直接使用包管理器安装PHP,那么使用同样的方式安装即可。如果你使用的一键包或者自己手动编译安装,则需要自己手动编译,你可以在这里找到最新的模块

wget https://pecl.php.net/get/apcu-5.1.8.tgz
tar zxf apcu-5.1.8.tgz
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
sudo make install

在PHP.ini中添加

extension=apcu.so
apc.enabled=1
apc.enable_cli=1

在WordPress中安装WP LCache插件并启用,在WordPress网站目录下的wp-content中新建一个文件object-cache.php,在其中填入

<?php
$lcache_path = dirname( realpath( __FILE__ ) ) . '/plugins/wp-lcache/object-cache.php';
require_once( $lcache_path );

保存即可生效,之后会发现WP后台的响应速度有可见变化。

参考文档:
[1] 让PHP7达到最高性能的几个提示-Laruence
[2] 本博客 Nginx 配置之完整篇-Jerry Qu
[3] OPcache运行时配置
[4] PHP的WinCache扩展
[5] Socket Sharding in NGINX Release 1.9.1