前言
作为个人站长,最头疼的问题之一就是网站访问速度。尤其是使用 WordPress 这类动态 CMS 的站点,每次用户访问都需要 PHP 执行查询、读取数据库、渲染页面,服务器负载一高就容易卡顿甚至崩溃。Nginx 反向代理缓存是一个非常实用且高效的解决方案,配置得当可以让你的网站响应速度提升数倍甚至十倍以上。
本文将详细介绍如何为 WordPress 网站配置 Nginx 反向代理缓存,包括 FastCGI Cache 的基本原理、配置步骤、缓存清理机制以及常见问题排查方法。
一、Nginx FastCGI Cache 的工作原理
Nginx FastCGI Cache 的工作流程非常简单直接:当用户首次访问某个页面时,Nginx 将 PHP-FPM 生成的页面内容缓存到本地磁盘;后续相同 URL 的请求到来时,Nginx 直接从缓存中读取静态 HTML 返回给客户端,不再需要经过 PHP 解析和数据库查询。
这种方案相比 WordPress 自身的缓存插件有三个天然优势:
- 效率更高:Nginx 工作在内核层面,处理静态文件比 PHP 插件快得多
- 资源占用低:缓存命中时完全不消耗 PHP 进程和数据库连接
- 抗压能力强:面对突发流量高峰,缓存可以平滑吸收绝大部分请求
二、配置 Nginx FastCGI Cache
2.1 全局缓存配置
首先在 nginx.conf 的 http 块中定义缓存路径和参数:
http {
# 定义缓存路径、大小和层级目录
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:128m inactive=60m max_size=2g;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_502 http_503 http_504;
fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;
}
参数说明:
levels=1:2:缓存目录层级结构,避免单个目录文件过多影响性能keys_zone=WORDPRESS:128m:缓存元数据共享内存区域,128MB 可以存储约 80 万个缓存键inactive=60m:60 分钟无访问则自动清除缓存max_size=2g:缓存文件最大 2GB,超限后 Nginx 会自动清理最少使用的缓存fastcgi_cache_lock on:防止缓存雪崩,并发请求只有一个会回源
2.2 站点配置中的缓存规则
在站点的 server 块中配置具体的缓存规则:
server {
listen 80;
server_name yourdomain.com;
# 定义跳过缓存的变量
set $skip_cache 0;
# 登录用户、评论者、后台请求不缓存
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
# POST 请求不缓存
if ($request_method = POST) {
set $skip_cache 1;
}
# 查询参数请求不缓存(如 ?page=2)
if ($query_string != "") {
set $skip_cache 0;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 缓存配置
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 60m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache $upstream_cache_status;
}
}
三、缓存清理方案
配置了缓存之后,最需要解决的是缓存失效问题。当你更新了一篇文章,用户看到的可能还是旧内容。推荐以下方案:
3.1 Nginx Cache Purge 模块
编译 Nginx 时添加 ngx_cache_purge 模块,然后在文章更新时通过 WordPress 的 save_post Hook 自动触发清理。
3.2 手动清理
全量清理缓存非常简单:
rm -rf /var/cache/nginx/*3.3 WordPress 缓存清理插件
推荐使用 Nginx Helper 插件,它可以自动在文章发布/更新时清理对应的缓存页面,开箱即用,配置简单。
四、缓存命中率优化技巧
- 区分匿名用户和登录用户:登录用户和管理员不缓存,通过 Cookie 判断即可
- 合理设置过期时间:文章页缓存时间可以设置更长(如 2-4 小时),首页可以短一些(15-30 分钟)
- 排除动态内容:购物车、搜索结果等页面不适合缓存,务必排除
- 启用 Brotli 压缩:在 Nginx 层面启用 Brotli 压缩,进一步减小传输体积
- 配合 CDN:Nginx 缓存配合 Cloudflare 等 CDN,可以构建多层缓存体系
五、常见问题排查
Q:缓存没有生效,X-Cache 始终是 MISS?
检查 fastcgi_cache_key 是否正确,特别是 HTTPS 站点是否包含了 ssl 协议。另外检查 WordPress 是否开启了强制 HTTPS。
Q:页面更新后缓存没有自动清理?
确认 purge 模块已安装,且 WordPress 插件或主题中正确调用了清理接口。
Q:缓存文件占用磁盘过大?
调整 inactive 和 max_size 参数。对于内容更新不频繁的个人博客,60 分钟 inactive 可以调整为 30 分钟。
六、总结
Nginx 反向代理缓存是提升 WordPress 网站性能性价比最高的方案之一。配置本身并不复杂,只需要理解核心的几个参数和规则,一个晚上就能部署完成。对于一台 1 核 1G 的低配服务器,开启缓存后足以支撑几千的日 PV,效果立竿见影。
个人站长在做技术选型时,不要一上来就上各种重型缓存方案,从 Nginx FastCGI Cache 入手,逐步优化,才是务实的做法。