将网站从虚拟主机迁移到VPS就是因为网站访问速度比较慢,但迁移完成后速度并没有提升多少,可能是因为VPS相比虚拟主机性能没提高多少,加速效果不明显。网站访问量不高,没必要升级更高性能的服务器,我就打算尝试启用了 Nginx 原生支持的 fastcgi_cache
缓存功能,配置完成后网站的访问速度实现了质的飞跃,网页打开速度基本都在1秒以内,体验显著提升。本文将介绍宝塔面板多网站的 fastcgi_cache
配置,下一篇将介绍如何自动预热缓存。
一、WordPress 性能优化一般有哪些
在优化 WordPress 性能之前,首要任务是掌握网站当前的访问表现。除了用户自身的主观体验外,我们还应借助一系列工具进行客观分析。推荐使用如下工具来评估页面加载情况和资源利用效率:
- 浏览器开发者工具(如 Chrome DevTools)
- Google PageSpeed Insights
- Pingdom Website Speed Test
其中,它们都提供了丰富的性能评分与优化建议,适合进行页面层级的综合评估。此外,也建议结合后端数据进行观察。你可以在主题的 footer.php </body>
后面插入如下代码,用以输出页面的数据库查询次数:
<!--<?php echo get_num_queries().'次查询,耗时'.timer_stop(0).'秒。'; ?>-->
<!--将上一行目标代码作 HTML 注释并不影响其功能,实现前台页面隐藏-->
配合Edge或 Chrome 的开发者工具,操作方式如下:
- 按下
F12
或Ctrl+Shift+I
打开开发者工具; - 切换至 “网络” 标签页;
- 勾选 “停用缓存” 选项;
- 刷新页面。
这样可以更准确地查看:
- 页面加载所发起的请求总数;
- 各类资源的加载时间;
- 数据库的查询次数;
- 总体页面加载耗时等关键指标。
通过前述数据分析,我们能够更有针对性地识别性能瓶颈,为后续的缓存配置和资源压缩提供坚实的依据。那么,针对 WordPress 站点的性能优化,通常应从以下几个关键方面着手:
- 服务器性能扩容 —— 包括升级硬件配置、提升带宽和优化数据库性能;
- 静态资源优化 —— 压缩图片、合并与精简 CSS/JS 文件,合理使用浏览器缓存;
- 内容分发网络(CDN) —— 利用全球节点加速静态资源分发,降低服务器负载;
- 网页延迟加载(Lazy Load) —— 延迟加载非首屏图片和资源,减少首次渲染压力;
- 系统代码优化 —— 精简和优化 WordPress 主题与插件代码,避免不必要的查询和请求;
- 缓存机制使用 —— 包括页面缓存、对象缓存和数据库查询缓存等多层次缓存策略;
- 服务器配置优化 —— 例如 Nginx 配置调整、PHP-FPM 参数调优等。
二、宝塔Nginx 配置 ngx_cache_purge 模块
Nginx 的 FastCGI Cache 用于缓存用户请求的动态内容,当用户再次访问相同页面时,Nginx 直接返回缓存结果,减少数据库查询次数,从而显著提升服务性能。对于可缓存的动态页面或静态资源,启用该模块不仅能大幅缩短响应时间,还能有效节省服务器资源,提高系统的 QPS(每秒请求数)承载能力。宝塔在安装 Nginx 时已默认编译并预装了 ngx_cache_purge
模块。可通过 SSH 终端运行以下命令确认模块是否已正确加载:
root@ThusZen:~# nginx -V 2>&1 | grep -o ngx_cache_purge
ngx_cache_purge
如果命令输出 ngx_cache_purge
,则说明该模块已成功编译并可用。
宝塔面板-软件商店找到Nginx点击设置,在配置中定位到 server
配置段落,并在该段落上面(不要写入server
中)添加以下配置内容:
# =========================
# Nginx FastCGI Cache 配置
# =========================
# 临时文件目录(所有网站共用)
fastcgi_temp_path /www/cache/fastcgi_cache/temp;
# thuszen.com 缓存
fastcgi_cache_path /www/cache/fastcgi_cache/thuszen levels=1:2 keys_zone=thuszen_cache:50m inactive=3d max_size=2g;
# soez.world 缓存
fastcgi_cache_path /www/cache/fastcgi_cache/soezworld levels=1:2 keys_zone=soezworld_cache:50m inactive=3d max_size=2g;
# oddbbo.world 缓存
fastcgi_cache_path /www/cache/fastcgi_cache/oddbboworld levels=1:2 keys_zone=oddbboworld_cache:50m inactive=3d max_size=2g;
# websitesoez.com 缓存
fastcgi_cache_path /www/cache/fastcgi_cache/websitesoez levels=1:2 keys_zone=websitesoez_cache:50m inactive=3d max_size=2g;
# oddbbo.com 缓存(WooCommerce,缓存时间短)
fastcgi_cache_path /www/cache/fastcgi_cache/oddbbo levels=1:2 keys_zone=oddbbo_cache:100m inactive=3d max_size=2g;
# 使用过期缓存应对错误或超时
fastcgi_cache_use_stale error timeout invalid_header http_500;
# 忽略后端缓存控制头,保证缓存生效
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
# 缓存 Key(WordPress / WooCommerce 通用)
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# nginx fastcgi cache END
上面是我5个网站的Nginx FastCGI Cache 配置,inactive=3d是缓存的过期时间,可以写24h或者1d,按你的想法来设置,保存配置。如果提示有重复配置,找到配置文件注释掉相同代码。重复配置可能存在于/www/server/panel/vhost/nginx/0.fastcgi_cache.conf
文件中。
2.1 创建Nginx fastcgi_cache 缓存目录
在配置生效前,须先创建网站缓存目录并赋予其读写权限。在宝塔面板中手动创建或命令行都行:
mkdir /www/cache/fastcgi_cache/websitesoez
chmod 755 /www/cache/fastcgi_cache/websitesoez
不要把缓存目录创建到软件安装目录,如/www/server/nginx
,更新软件会将缓存目录删除,如果服务器内存充足,建议将缓存目录设置到 Linux 的虚拟内存空间 /dev/shm
中,例如 /dev/shm/nginx-cache/websitesoez
。
/dev/shm
是 Linux 系统中基于共享内存(shared memory,简称 shm)实现的虚拟文件系统,所有存放于该目录下的文件实际上保存在内存中,而非传统磁盘。其容量并非固定分配,而是动态使用系统内存,有效利用内存加快缓存读写速度,从而进一步提升缓存性能。
2.2 Nginx fastcgi_cache 配置基本解释
若服务器托管多个站点,务必为每个站点设置独立的缓存路径和 keys_zone
(缓存键区域),否则会导致缓存冲突,出现访问站点 A 时返回站点 B 的缓存内容的情况。
其中,keys_zone
后面的数值(如 100m
)代表缓存键所占用的最大内存容量,间接决定了缓存条目的最大数量,但并不代表缓存文件实际占用的磁盘空间大小;inactive
用于定义缓存条目的失效时间,默认值通常为 10 分钟;max_size
则限制缓存临时文件目录大小。
如果你计划将缓存目录设置在内存(如 /dev/shm
)中,需特别注意服务器的物理内存容量与 max_size
配置的匹配关系,避免缓存溢出导致性能问题。
三、配置网站的 ngx_cache_purge 模块
Nginx 配置文件最后一行的 include **/*.conf;
用于加载各个站点的独立配置文件,这是宝塔面板实现高效站点管理的一种常见做法。
为了便于个性化定制缓存清理规则,我们将全局的 ngx_cache_purge
配置与各站点的 ngx_cache_purge
配置分开管理。具体做法是,将以下站点专属的 ngx_cache_purge
配置内容插入到各网站 Nginx 配置文件中。
宝塔面板-网站,点击你网站的设置,打开配置文件,将以下代码插入 #SSL-END
标记之后:
# 配置 Nginx fastcgi_cache START
set $skip_cache 0;
# POST 不缓存
if ($request_method = POST) {
set $skip_cache 1;
}
# 动态查询不缓存
if ($query_string != "") {
set $skip_cache 1;
}
# 后台/特殊页面不缓存
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# 登录用户、评论过的用户不缓存
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
location ~ [^/]\.php(/|$) {
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-84.sock; # 这里改成自己的PHP版本
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache websitesoez_cache; # 这里改成本站专属 keys_zone
fastcgi_cache_valid 200 301 302 3d;
add_header X-Cache "$upstream_cache_status From $host";
add_header Cache-Control max-age=600; # 浏览器缓存10分钟
add_header Last-Modified $date_gmt;
add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套
add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型
add_header X-XSS-Protection "1; mode=block"; # XSS 保护
etag on;
}
# 缓存清理接口
location ~ /purge(/.*) {
allow 127.0.0.1;
allow "209.54.104.33"; # 引号要保留
deny all;
fastcgi_cache_purge websitesoez_cache "$scheme$request_method$host$1";
}
# 配置 Nginx fastcgi_cache END
3.1 WordPress 配置 Nginx fastcgi_cache 注意事项
add_header Cache-Control
指令用于设置缓存控制策略。若动态内容需要实时更新,应将其设置为no-cache
或max-age=0
;若允许缓存,则可根据需求设置较长的缓存时间,单位默认为秒。sock
路径务必正确配置,否则可能导致 Nginx 与后端 PHP-FPM 之间通信失败,出现 502 Bad Gateway 错误。- 代码中涉及的服务器公网 IP 地址请替换为您实际服务器的公网 IP,且须保留双引号。
- 可选缓存配置示例:若部分主题在移动端访问时出现异常,可针对移动端请求设置不启用缓存,示例如下:
#不缓存移动端访问
if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry|windowss(ce|phone))) {
set $skip_cache 1;
}
- 如果已发表评论的用户仍然加载缓存页面,通常是因为 WordPress 未正确识别用户的 Cookie。为解决该问题,可将以下代码添加至主题的
functions.php
文件中,以确保登录用户绕过缓存,实时获取个性化内容:
//nginx-cache 缓存配置代码
add_action('set_comment_cookies','coffin_set_cookies',10,3);
function coffin_set_cookies( $comment, $user, $cookies_consent){
$cookies_consent = true;
wp_set_comment_cookies($comment, $user, $cookies_consent);
}
- 启用 fastcgi_cache 缓存时,发现在 Nginx 配置文件中添加了 Cache-Control 信息,但是总是不生效。HTTP 头部信息会总会包含以下信息:
Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache
,这时需要修改宝塔面板中 php 配置文件中的关键词session.cache_limiter
,其默认值是 nocache ,将它设置为none
即可。
四、检查 Nginx fastcgi_cache 缓存状态
如果已按照上述步骤正确配置并重启 Nginx,fastcgi_cache
缓存即已生效。可以通过以下方法验证:
- 按下
F12
或Ctrl+Shift+I
打开浏览器开发者工具; - 切换到 “Network”(网络)标签页;
- 勾选 “Disable cache”(停用缓存)选项;
- 点击访问页面的文档请求,查看响应头信息。
通常,缓存命中时响应头会包含类似如下内容:
x-cache HIT

这表明页面内容来自缓存,访问速度得到显著提升。
其中有显示 XCache 这一状态便表示配置代码生效了,这一状态一般有三个属性分别是 MISS/BYPASS/HIT:
- MISS 表示未命中:即这个页面还没被缓存,新发布或刚被删除的页面,首次访问将出现这个状态;
- HIT 表示缓存命中:打开一个没被排除的页面,刷新两次一般就是这种状态;
- BYPASS 表示不缓存:即页面路径在 Nginx 规则中被设置成不缓存(set $skip_cache 1;),比如用户登录时。
OK,宝塔面板WordPress设置 Nginx FastCGI 缓存已经配置完毕,打开网站感受一下毫秒级的网速。使用Nginx Helper 插件可以在发布文章时自动清理fastcgi_cache 缓存,再配置一个定时预热缓存的计划任务,完美!