tags: WordPress, 性能优化, 缓存, Nginx, Redis
最近给本站做了一整套加速优化,把成果和方法整理出来,分享给同样用 WordPress + Nginx 的朋友。全程不花一分钱,所有工具都是开源/免费的。
最终效果
优化前,匿名访问首字节时间(TTFB)在 800ms~1.2s 左右(取决于数据库查询和 PHP 执行时间)。优化后:
- FastCGI 缓存命中 → TTFB ≈ 100ms
- Redis 对象缓存 → 数据库查询次数降为 0~2 次
- OPcache JIT 编译 → PHP 执行效率翻倍
- WebP 自动转换 → 图片体积减少 60%~80%
一、Nginx FastCGI 缓存(最立竿见影的一步)
直接在 Nginx 配置文件(站点 conf)的 http 块或 server 块前加上缓存定义:
# 在 http {} 块内
fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=WPCACHE:128m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
然后在 location ~ \.php$ 块内添加:
set $skip_cache 0;
# 登录用户、评论者、后台不缓存
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
set $skip_cache 1;
}
# POST 请求不缓存
if ($request_method = POST) {
set $skip_cache 1;
}
# 不带参数的首页、文章页缓存 30 分钟
fastcgi_cache WPCACHE;
fastcgi_cache_valid 200 30m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache $upstream_cache_status;
解释:
- 缓存文件存到
/tmp/fastcgi_cache(内存临时文件系统,性能好) - 缓存区大小 128MB,存 60 分钟无访问自动清理
X-Cache响应头会显示HIT(命中)或MISS(未命中),方便调试
改完 nginx -t 检查语法,systemctl reload nginx 生效。
二、安装 Redis 7.0 + PHP Redis 扩展
2.1 安装 Redis
# 编译安装 Redis 7.0
wget https://download.redis.io/releases/redis-7.0.15.tar.gz
tar xzf redis-7.0.15.tar.gz
cd redis-7.0.15
make -j$(nproc)
make install
配置 systemd 服务 /etc/systemd/system/redis.service:
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
RestartSec=5
User=redis
Group=redis
[Install]
WantedBy=multi-user.target
2.2 安装 PHP Redis 扩展
# 用 pecl 安装
pecl install redis-6.3.0
# 或在 php.ini 中添加
extension=redis.so
验证:php -m | grep redis 看到输出即成功。
三、WordPress Redis Object Cache 插件
安装并激活 Redis Object Cache 插件:
- 插件 → 安装插件 → 搜索 “Redis Object Cache”
- 安装并激活
- 进入 设置 → Redis,点击 “启用对象缓存”
启用后效果:数据库查询次数从 10~30 次降为 0~2 次,后台响应速度明显提升。
四、WP Super Cache(页面缓存层的最后保障)
- 插件 → 安装插件 → 搜索 “WP Super Cache”
- 激活后进入 设置 → WP Super Cache
- 推荐设置:
| 选项 | 设置值 |
|---|---|
| 缓存模式 | PHP 缓存模式 |
| 压缩 | ✅ 启用 |
| 缓存重建 | ✅ 启用 |
| 已知用户 | ✅ 不缓存已知用户 |
| 缓存超时 | 1800 秒(30 分钟) |
| 预缓存 | 可选,建议开启 |
注意:WP Super Cache 的页面缓存 和 Nginx FastCGI 缓存 是两个独立的缓存层,互不冲突。FastCGI 在最外层挡掉大部分请求,WP Super Cache 作为 PHP 层的补充。
五、Nginx Helper(自动清除 FastCGI 缓存)
安装 Nginx Helper 2.3.5:
- 插件 → 安装插件 → 搜索 “Nginx Helper”
- 激活后进入 设置 → Nginx Helper
- 配置:
- Enable Purge → ✅ 启用
- Purge Method →
unlink_files(删除缓存文件) - Caching Method →
fastcgi - Purge URL → 按需勾选(推荐全选)
这样每次发布/更新文章、发表评论时,Nginx Helper 会自动删除对应的 FastCGI 缓存文件,保证用户看到的是最新内容。
六、EWWW Image Optimizer(图片 WebP 自动转换)
安装 EWWW Image Optimizer 8.7.1:
- 激活后进入 设置 → EWWW IO
- 推荐设置:
- WebP Conversion → ✅ 开启(推荐 ExactDN 模式或本地转换)
- Lazy Load → ✅ 开启(如果主题没有自带懒加载)
- 自动优化 → ✅ 上传图片时自动优化
图片是 WordPress 页面体积的主要贡献者。开启 WebP 后,图片体积减少 60%~80%,且对用户完全透明(浏览器支持 WebP 时自动输出 WebP,不支持时输出原图)。
七、WP-Optimize(数据库清理,仅用优化功能)
安装 WP-Optimize 4.5.5:
- 激活后进入 WP-Optimize → 数据库
- 只做数据库优化:清理草稿、回收站、垃圾评论、优化表
- ⚠️ 页面缓存功能关掉,避免与 WP Super Cache 冲突
定期运行数据库优化(建议每周一次),保持数据库整洁。
八、OPcache 深度调优:开启 JIT
在 php.ini 中配置:
[opcache]
opcache.enable=1
opcache.memory_consumption=64
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=30000
opcache.revalidate_freq=2
opcache.validate_timestamps=1
opcache.use_cwd=0
opcache.enable_file_override=1
; JIT 配置(PHP 8.0+)
opcache.jit=tracing
opcache.jit_buffer_size=64M
参数解释:
memory_consumption=64→ OPcache 缓存 64MB 编译后的 PHP 代码max_accelerated_files=30000→ 最多缓存 30000 个 PHP 文件(WordPress + 插件 + 主题很够用)revalidate_freq=2→ 每 2 秒检查文件是否有修改(开发友好,改代码最多等 2 秒生效)validate_timestamps=1→ 启用文件修改时间检查jit=tracing→ PHP 8 的 JIT 编译,追踪模式(性能最好)jit_buffer_size=64M→ JIT 用 64MB 内存存放编译后的机器码
生产环境建议把 validate_timestamps=0 + revalidate_freq=0,改代码后手动清缓存,性能更好。
九、一条指令清所有缓存
为了方便日常运维,写了一个统一清缓存脚本 .php,放在网站根目录:
<?php
// 验证密钥
$key = isset($_GET['key']) ? $_GET['key'] : '';
if ($key !== '你的密钥') {
die('Access Denied');
}
// 1. 清理 FastCGI 缓存
$fastcgi_cache_path = '/tmp/fastcgi_cache';
system("rm -rf $fastcgi_cache_path/*");
// 2. 清理 WP Super Cache
if (function_exists('wp_cache_clear_cache')) {
wp_cache_clear_cache();
}
// 3. 清理 OPcache
if (function_exists('opcache_reset')) {
opcache_reset();
}
// 4. 清理 Redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->flushAll();
echo 'All cache cleared!';
访问 https://你的域名/***.php?key=你的密钥 即可一键清空所有缓存层,非常方便。
十、验证优化效果
检查 FastCGI 缓存是否命中
curl -I https://你的域名/
# 看到 X-Cache: HIT 即命中
检查 Redis 对象缓存
后台 → 设置 → Redis,查看命中率,应该 >95%。
检查 WebP 是否生效
浏览器 DevTools → Network,查看图片响应头的 Content-Type 是否为 image/webp。
检查 OPcache
php -i | grep opcache
# 或安装 Opcache Status 插件可视化查看
注意事项
- 插件冲突:不要同时启用两个页面缓存插件(我们这里 FastCGI 是 Nginx 层,WP Super Cache 是 PHP 层,不冲突。但 WP Super Cache 不要和 W3 Total Cache 的页面缓存同时开)
- 修改文件后清缓存:改 CSS/JS/PHP 后,记得执行一次清缓存(FastCGI + OPcache + Redis),否则看不到效果
- 备份配置:改 Nginx/PHP 配置前先备份,以防万一
- 各缓存层的关系:
用户请求 → Nginx FastCGI 缓存(最外层,最快)
→ 未命中时到 PHP → WP Super Cache
→ 未命中时到 WordPress → Redis 对象缓存(减少数据库查询)
→ 数据库
总结
这一套优化下来,没有用任何收费服务,纯开源方案。关键在于多级缓存协同工作:
| 层级 | 技术 | 作用 |
|---|---|---|
| L1 | Nginx FastCGI 缓存 | 挡掉 90%+ 的匿名访问请求 |
| L2 | WP Super Cache | PHP 层页面缓存,补充缓存粒度 |
| L3 | Redis Object Cache | 减少数据库查询,加速动态请求 |
| L4 | OPcache JIT | 减少 PHP 编译开销,提升执行效率 |
| L5 | WebP 图片 | 减少传输体积,降低加载时间 |
如果你的 WordPress 也在变慢,不妨按这个步骤试试。有任何问题欢迎留言交流!