wordpress据说特别慢,但是用惯了,也懒得修改了。本文介绍我对wordpress访问速度的优化。
配置
独立服务器,16G内存,4核 Intel(R) Xeon(R) CPU。
centos 7, nginx, php-fpm, mysql.
插件 (按字母顺序)
- Add From Server:迁移网站以后,用来导入图片。不必安装。
- Akismet Anti-Spam:垃圾邮件屏蔽。
- Async JavaScript:js优化工具。可以根据gtmetrix报告自动化调正参数。
- Autoptimize: 页面缓存插件。和Async JavaScript配合使用,代替wp super cache和w3c。
- Classic Editor:系统插件。不喜欢Gutenberg。我喜欢简洁风格。
- Cloudflare: cdn
- Jetpack by WordPress.com:为了手机显示,不得不装。也有图片cdn的功能可以利用。
- Math Captcha:防止程序自动暴力登录破解管理员账户。
- Post Views Counter:用于显摆。
- Redis Object Cache:mysql查询缓存。
- Smush:自动图片压缩。
- UpdraftPlus – Backup/Restore:自动备份插件。直接备份到google drive。
- Wordfence Security:病毒防火墙。
- WP 404 Auto Redirect to Similar Post:方便用户查找文章。404自动跳转相似关键字。
- WP Editor.md:markdown编辑器。
- WP Word Count: 统计字数。
- WP-Optimize:数据库优化。
- 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
- 去gtmetrix注册一个帐号,从gtmetrix/api拿到你的API Key。
- 安装上述两个插件。
- 打开async JavaScript的参数设定页面,使用wizard,填写gtmetrix注册邮箱和api key,选择测试服务器位置。开始优化。
- 按照优化的建议设定参数,特别是建议的autoptimize参数。
中国用户,应当在附加配置中选择“Remove Google Fonts”。
NGINX的fastcgi_cache
这个机制和wordpress无关,乃是前端http服务器的功能。它可以将页面保存为静态,不经过Php处理就直接发给用户,因此提高性能,降低系统负载。
- 修改你的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
测试和调整
使用pingdom和gtmetrix对网站进行测试,修正各种小问题。比如,没有使用gzip,没有设置cookie生存时间等等。
如果还有什么需要做的,就是找一个cdn了。我使用cloudflare.自行参考cloudflare的说明.
结果
如上图所示,
PageSpeed Score = 96%
YSlow Score = 93%
这是因为我调用了英国的liberapay.com的支付按钮,有大概900ms的延迟,否则性能应该还要好一些。取消下面两个按钮的代码,可以将得分提高到
97%-94%.