wordpress据说特别慢,但是用惯了,也懒得修改了。本文介绍我对wordpress访问速度的优化。

配置

独立服务器,16G内存,4核 Intel(R) Xeon(R) CPU。

centos 7, nginx, php-fpm, mysql.

插件 (按字母顺序)

  1. Add From Server:迁移网站以后,用来导入图片。不必安装。
  2. Akismet Anti-Spam:垃圾邮件屏蔽。
  3. Async JavaScript:js优化工具。可以根据gtmetrix报告自动化调正参数。
  4. Autoptimize: 页面缓存插件。和Async JavaScript配合使用,代替wp super cache和w3c。
  5. Classic Editor:系统插件。不喜欢Gutenberg。我喜欢简洁风格。
  6. Cloudflare: cdn
  7. Jetpack by WordPress.com:为了手机显示,不得不装。也有图片cdn的功能可以利用。
  8. Math Captcha:防止程序自动暴力登录破解管理员账户。
  9. Post Views Counter:用于显摆。
  10. Redis Object Cache:mysql查询缓存。
  11. Smush:自动图片压缩。
  12. UpdraftPlus – Backup/Restore:自动备份插件。直接备份到google drive。
  13. Wordfence Security:病毒防火墙。
  14. WP 404 Auto Redirect to Similar Post:方便用户查找文章。404自动跳转相似关键字。
  15. WP Editor.md:markdown编辑器。
  16. WP Word Count: 统计字数。
  17. WP-Optimize:数据库优化。
  18. Yoast SEO:搜索引擎优化。

基本上这些插件都是我必须的,无法缩减。我不是那种为了速度,要将所有插件删掉的geek。

主题

Chronus:轻量级的杂志主题。很简单,不是太占资源。

缓存机制

使用三重缓存机制:
1. redis:数据库级别
2. Autoptimize: js和页面缓存。
3. fastcgi_cache: http服务器级别缓存。

redis

参考DigitalOcean的文章。

安装

sudo apt-get install redis-server php5-redis

配置

sudo nano /etc/redis/redis.conf

增加下面两行到文件末尾:

maxmemory 256mb #根据自己的内存大小调整。我设的1G.
maxmemory-policy allkeys-lru

启动wordpress的数据库对象缓存

有两种方式。一种是不用插件,直接“drop-in”。参见上述digitalocean的文章。

我有点懒,不想每次自己去github升级。所以用了插件“Redis Object Cache”。

需要注意的问题:redis是一个内存数据库,速度特别快。因此,黑客可以每秒钟1500次暴力以上的速度来攻击系统。为了保护数据,在/etc/redis.conf中增加登录配置:

sudo nano /etc/redis.conf

增加一行(用你的密码替换“your-password”:

requirepass your-password

然后,在wordpress的wp-config.php中修改:

define(‘WP_REDIS_PASSWORD’, ‘your-password’);

在/etc/php.ini中(或者你的etc/php/…/php-fpm/php.ini)中,修改[Session]配置:

[Session]
Session.save_handler = redis
seesion.save_path = “tcp://127.0.0.1:6379”

增加Session的缓存。

然后,重新启动各种服务:

sudo systemctl restart redis
sudo systemctl restart nginx
sudo systemctl restart php-fpm

autoptimize + Async JavaScript

  1. gtmetrix注册一个帐号,从gtmetrix/api拿到你的API Key。
  2. 安装上述两个插件。
  3. 打开async JavaScript的参数设定页面,使用wizard,填写gtmetrix注册邮箱和api key,选择测试服务器位置。开始优化。
  4. 按照优化的建议设定参数,特别是建议的autoptimize参数。
    gtmetrix result

中国用户,应当在附加配置中选择“Remove Google Fonts”。

NGINX的fastcgi_cache

这个机制和wordpress无关,乃是前端http服务器的功能。它可以将页面保存为静态,不经过Php处理就直接发给用户,因此提高性能,降低系统负载。

  1. 修改你的nginx配置文件:

sudo vim /etc/nginx/sites-enabled/eddyemma

在最前面“server {}”之外,加上这样两句:

fastcgi_cache_path /var/www/cache levels=1:2 keys_zone=eddyemma.com:100m inactive=60m;
fastcgi_cache_key “$scheme$request_method$host$request_uri”;

其中,/var/www/cache是目录,eddyemma.com是区域标志。根据你的需要自行修改。

在你的“server{}”段中的”location ~ .php$ {}”段中加上:

#fastcgi_cache setting
fastcgi_cache eddyemma.com;
fastcgi_cache_valid 200 60m;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
add_header X-Cache $upstream_cache_status;

创建缓存磁盘:

sudo mkdir /var/www/cache
chown nginx:nginx -R /var/www/cache

创建内存虚拟盘。首先修改/etc/fstab

sudo vim /etc/fstab

增加一行(大小自己修改,我使用512M):

tmpfs /var/www/cache tmpfs defaults,size=512M 0 0

保存关闭。加载并检查:

mount -a
df

有人说linux自己就有文件缓存,所以这一步是不必要的。只要内存足够,这些文件自动缓存到内存中。如果使用ssd硬盘,也不需要加载虚拟盘,因为访问速度差别不大。不过我测试的结果,还是加载了比较好一点,因为我的服务器是sata硬盘。

重新启动各种服务。

sudo systemctl restart redis
sudo systemctl restart nginx
sudo systemctl restart php-fpm

测试和调整

使用pingdomgtmetrix对网站进行测试,修正各种小问题。比如,没有使用gzip,没有设置cookie生存时间等等。

如果还有什么需要做的,就是找一个cdn了。我使用cloudflare.自行参考cloudflare的说明.

结果

如上图所示,

PageSpeed Score = 96%
YSlow Score = 93%

这是因为我调用了英国的liberapay.com的支付按钮,有大概900ms的延迟,否则性能应该还要好一些。取消下面两个按钮的代码,可以将得分提高到
97%-94%.

Donate using Liberapay
Paypal.me