最近趁着有空,我陆陆续续对自己搭建的 WordPress 网站做了些优化工作,前端视觉和后台逻辑都做了小幅调整。过程中意外发现:原本部署的 Memcached 实际并未启用,同时每篇文章的数据库查询次数居然高达百次(现已修复),访问速度自然也就提不起来。
于是,我开始着手从根本上解决性能瓶颈,对网站前后端做了系统性的优化尝试。最终实践证明,借助 Nginx 的 fastcgi_cache
模块进行页面缓存,不仅部署简单、控制灵活,实际效果也非常显著——页面响应时间从“秒”直接压缩到“毫秒”,可以说是真正实现了秒开体验。

1. WordPress 性能优化一般有哪些
在优化 WordPress 性能之前,首要任务是掌握网站当前的访问表现。除了用户自身的主观体验外,我们还应借助一系列工具进行客观分析。推荐使用如下工具来评估页面加载情况和资源利用效率:
- 浏览器开发者工具(如 Chrome DevTools)
- Google PageSpeed Insights
- Pingdom Website Speed Test
其中,它们都提供了丰富的性能评分与优化建议,适合进行页面层级的综合评估。此外,也建议结合后端数据进行观察。你可以在主题的 footer.php
中插入如下代码,用以输出页面的数据库查询次数:
</body>
<!--<?php echo get_num_queries().'次查询,耗时'.timer_stop(0).'秒。'; ?>-->
<!--将上一行目标代码作 HTML 注释并不影响其功能,实现前台页面隐藏-->
</html>
配合 Chrome 的开发者工具,操作方式如下:
;
- 按下
F12
或Ctrl+Shift+I
打开开发者工具; - 切换至 “网络” 标签页;
- 勾选 “停用缓存” 选项;
- 刷新页面。
这样可以更准确地查看:
- 页面加载所发起的请求总数;
- 各类资源的加载时间;
- 数据库的查询次数;
- 总体页面加载耗时等关键指标。
通过前述数据分析,我们能够更有针对性地识别性能瓶颈,为后续的缓存配置和资源压缩提供坚实的依据。那么,针对 WordPress 站点的性能优化,通常应从以下几个关键方面着手:
- 服务器性能扩容 —— 包括升级硬件配置、提升带宽和优化数据库性能;
- 静态资源优化 —— 压缩图片、合并与精简 CSS/JS 文件,合理使用浏览器缓存;
- 内容分发网络(CDN) —— 利用全球节点加速静态资源分发,降低服务器负载;
- 网页延迟加载(Lazy Load) —— 延迟加载非首屏图片和资源,减少首次渲染压力;
- 系统代码优化 —— 精简和优化 WordPress 主题与插件代码,避免不必要的查询和请求;
- 缓存机制使用 —— 包括页面缓存、对象缓存和数据库查询缓存等多层次缓存策略;
- 服务器配置优化 —— 例如 Nginx 配置调整、PHP-FPM 参数调优等。
就 Kevin's Space 当前状况而言,静态资源优化尤为紧迫。首页首屏即加载超过 2.5MB 的内容,且尚未配置有效缓存及服务器优化,显著影响了页面加载速度和用户体验。
本文将系统介绍如何为 WordPress 配置 Nginx 的 fastcgi_cache
缓存机制,基于我个人在实际站点优化过程中的实践经验整理而成。虽然网上已有不少相关教程,但许多内容对初学者并不友好,缺乏从零讲清的完整流程。因此,我希望通过这篇文章,为真正的小白用户提供一份更清晰、可操作的参考指南。在尝试 Nginx 缓存之前,我也评估并实测过多种主流方案,包括:
- 对象缓存工具:Memcached、Redis;
- WordPress 缓存插件:WP-Rocket、WP Super Cache 等。
根据我在个人站点上的实际测试结果,总结如下两点建议:
- 对象缓存方面,推荐使用 Memcached 结合 Batcache 的方案,因其轻量且性能稳定,适合中小型网站。相较之下,Redis 配置复杂且资源消耗较高,对于中小型站点而言,其性能提升有限,不建议作为首选。
- 页面缓存插件方面,WP-Rocket 在功能与性能上表现最佳;若追求免费,Fastest Cache 是更实用的选择。
不过,最终我并未使用上述方案。一方面,我在尝试配置 Memcached 时遇到兼容性问题,安装失败;另一方面,那些 WordPress 插件在我的站点环境中未带来预期的性能提升,甚至部分插件还引入了额外负担。
相反,当我启用了 Nginx 原生支持的 fastcgi_cache
后,页面响应速度实现了质的飞跃,缓存命中时可将响应时间压缩至毫秒级,体验显著提升。因此,本文将围绕这一方案展开详细配置与优化说明。
2. Nginx 配置 ngx_cache_purge 模块
Nginx 的 FastCGI Cache 用于缓存用户请求的动态内容,当用户再次访问相同页面时,Nginx 直接返回缓存结果,避免向后端服务器发起重复请求,从而显著提升服务性能。对于可缓存的动态页面或静态资源,启用该模块不仅能大幅缩短响应时间,还能有效节省服务器资源,提高系统的 QPS(每秒请求数)承载能力。
本人习惯使用宝塔面板管理服务器,以下内容将以宝塔面板为例,详细记录如何配置 Nginx 的 fastcgi_cache
来加速 WordPress 网站。值得一提的是,宝塔在安装 Nginx 时已默认编译并预装了 ngx_cache_purge
模块。可通过 SSH 终端运行以下命令确认模块是否已正确加载:
root@aliyun:~# nginx -V 2>&1 | grep -o ngx_cache_purge
ngx_cache_purge
如果命令输出 ngx_cache_purge
,则说明该模块已成功编译并可用。确认无误后,下一步即可开始配置服务器中的 Nginx 缓存。请在宝塔面板的 “Nginx 管理” → “配置” 中,定位到对应站点的 server
配置段落,并在该段落开头添加以下配置内容:
# nginx fastcgi cache 的 HTTP 配置 START
#站点 1 缓存配置
fastcgi_cache_path /tmp/nginx-cache/shephe_com levels=1:2 keys_zone=SHEPHE.COM:100m inactive=1d max_size=5G;
#如果要开启更多站点缓存,参照第一行设置,注意每个站点的 缓存路径 和 keys_zone 要区分开
#站点 2 缓存配置
fastcgi_cache_path /tmp/nginx-cache/othersite_com levels=1:2 keys_zone=OTHERSITE.COM:100m inactive=1d max_size=5G;
#多站点时共用以下配置
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
# nginx fastcgi cache END
2.1 Nginx fastcgi_cache 缓存目录创建
对于如我这样的小白,需针对性解释下第一句配置:其中的 /tmp/nginx-cache/shephe_com 为站点 1 的缓存路径,在配置生效前,须先创建本目录并赋予其读写权限(0755 或 0777)。在宝塔面板中手动创建或命令行都行:
mkdir /tmp/nginx-cache/shephe_com
chmod 755 /tmp/nginx-cache/shephe_com
mkdir /tmp/nginx-cache/othersite_com
chmod 755 /tmp/nginx-cache/othersite_com
本例中,缓存目录设置在磁盘的临时文件夹 /tmp
下。如果服务器内存充足,建议将缓存目录设置到 Linux 的虚拟内存空间 /dev/shm
中,例如 /dev/shm/nginx-cache/shephe_com
。
/dev/shm
是 Linux 系统中基于共享内存(shared memory,简称 shm)实现的虚拟文件系统,所有存放于该目录下的文件实际上保存在内存中,而非传统磁盘。其容量并非固定分配,而是动态使用系统内存,有效利用内存加快缓存读写速度,从而进一步提升缓存性能。
2.2 Nginx fastcgi_cache 关键配置基本解释
虽然配置中的注释已经较为详细,但仍需特别强调:若服务器托管多个站点,务必为每个站点设置独立的缓存路径和 keys_zone
(缓存键区域),否则会导致缓存冲突,出现访问站点 A 时返回站点 B 的缓存内容的情况。
其中,keys_zone
后面的数值(如 100m
)代表缓存键所占用的最大内存容量,间接决定了缓存条目的最大数量,但并不代表缓存文件实际占用的磁盘空间大小;inactive
用于定义缓存条目的失效时间,默认值通常为 10 分钟;max_size
则限制缓存临时文件目录(如本例中的 /tmp/nginx-cache/temp
)的最大磁盘空间,默认为无限制。
如果你计划将缓存目录设置在内存(如 /dev/shm
)中,需特别注意服务器的物理内存容量与 max_size
配置的匹配关系,避免缓存溢出导致性能问题。以本站为例,若使用物理内存作为缓存存储,配置可能如下:
fastcgi_cache_path /dev/shm/nginx-cache/shephe_com levels=1:2 keys_zone=SHEPHE.COM:32m inactive=60m max_size=128m;
2.3 本例 Nginx 完整配置备份(多站点)
如果你的服务器仅托管单个站点,为简化管理,也可以将上述 Nginx 缓存配置直接写入该站点的配置文件(放置于 server
块的最前面),这同样是一个合理且便捷的做法。
user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
stream {
log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time';
access_log /www/wwwlogs/tcp-access.log tcp_format;
error_log /www/wwwlogs/tcp-error.log;
include /www/server/panel/vhost/nginx/tcp/*.conf;
}
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
#include luawaf.conf;
log_format quic '$remote_addr|$remote_user|$time_local|$request|$status|$body_bytes_sent|$http_referer|$http_user_agent|$http3';
access_log /www/wwwlogs/quic_access.log quic;
include proxy.conf;
default_type application/octet-stream;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server_tokens off;
access_log off;
# nginx fastcgi cache 配置 START
#站点 1 缓存配置
fastcgi_cache_path /tmp/nginx-cache/shephe_com levels=1:2 keys_zone=SHEPHE.COM:100m inactive=1d max_size=5G;
#如果要开启更多站点缓存,参照第一行设置,注意每个站点的 缓存路径 和 keys_zone 要区分开
#站点 2 缓存配置
fastcgi_cache_path /tmp/nginx-cache/othersite_com levels=1:2 keys_zone=OTHERSITE.COM:100m inactive=1d max_size=5G;
#多站点时共用以下配置
#fastcgi_temp_path /tmp/nginx-cache/temp;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
# nginx fastcgi cache END
server
{
listen 888;
server_name phpmyadmin;
index index.html index.htm index.php;
root /www/server/phpmyadmin;
#error_page 404 /404.html;
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /www/wwwlogs/access.log;
}
include /www/server/panel/vhost/nginx/*.conf;
}
3. 网站配置 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;
}
#此处查看网站配置上下文严格设置,如果你的网站使用 PHP7.4,就写-74.sock
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-82.sock;
fastcgi_index index.php;
include fastcgi.conf;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
#新增的缓存规则
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache "$upstream_cache_status From $host";
fastcgi_cache SHEPHE.COM;
add_header Cache-Control max-age=0;
add_header Nginx-Cache "$upstream_cache_status";
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;
fastcgi_cache_valid 200 301 302 1d;
}
#缓存清理配置
location ~ /purge(/.*) {
allow 127.0.0.1;
allow "112.124.26.230"; # 引号要保留
deny all;
fastcgi_cache_purge SHEPHE.COM "$scheme$request_method$host$1";
}
#配置 Nginx fastcgi_cache EDN
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
即可。
3.2 本站完整配置文件备份
server
{
listen 80;
listen 443 ssl;
http2 on;
server_name shephe.com www.shephe.com;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/shephe.com;
#SSL-START SSL 相关配置,请勿删除或修改下一行带注释的 404 规则
#error_page 404/404.html;
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
ssl_certificate /www/server/panel/vhost/cert/shephe.com/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/shephe.com/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#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;
}
#这里请参考你网站之前的配置,特别是 sock 的路径,弄错了就 502 了!如果你的网站使用 PHP7.4,就写-74.sock
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-82.sock;
fastcgi_index index.php;
include fastcgi.conf;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
#新增的缓存规则
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache "$upstream_cache_status From $host";
fastcgi_cache SHEPHE.COM;
add_header Cache-Control max-age=0;
add_header Nginx-Cache "$upstream_cache_status";
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;
fastcgi_cache_valid 200 301 302 1d;
}
#缓存清理配置
location ~ /purge(/.*) {
allow 127.0.0.1;
allow "112.124.26.230"; # 引号要保留
deny all;
fastcgi_cache_purge SHEPHE.COM "$scheme$request_method$host$1";
}
#配置 Nginx fastcgi_cache EDN
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP 引用配置,可以注释或修改
include enable-php-82.conf;
#PHP-INFO-END
#REWRITE-START URL 重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/shephe.com.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请 SSL 证书验证目录相关设置
location ~ \.well-known{
allow all;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
access_log /www/wwwlogs/shephe.com.log;
error_log /www/wwwlogs/shephe.com.error.log;
}
最后测试配置文件(如果配置不对,宝塔面板一般会报错),再重启 Nginx 和 PHP。不出意外的话现在缓存已经生效了。参考:「WordPress 前端优化之 Nginx fastcgi_cache 缓存」。
4. 检查 Nginx fastcgi_cache 缓存状态
如果已按照上述步骤正确配置并重启 Nginx,fastcgi_cache
缓存即已生效。可以通过以下方法验证:
- 按下
F12
或Ctrl+Shift+I
打开浏览器开发者工具; - 切换到 “Network”(网络)标签页;
- 勾选 “Disable cache”(停用缓存)选项;
- 点击访问页面的文档请求,查看响应头信息。
通常,缓存命中时响应头会包含类似如下内容:
X-Cache-Status: HIT
Cache-Control: public, max-age=xxx
这表明页面内容来自缓存,访问速度得到显著提升。具体来讲,如下图所示:


其中有 Nginx-Cache 这一状态便表示以上的工作做好了,这一状态一般有三个属性分别是 MISS/BYPASS/HIT,代表:
- MISS 表示未命中:即这个页面还没被缓存,新发布或刚被删除的页面,首次访问将出现这个状态;
- HIT 表示缓存命中:打开一个没被排除的页面,刷新两次一般就是这种状态;
- BYPASS 表示不缓存:即页面路径在 Nginx 规则中被设置成不缓存(set $skip_cache 1;),比如用户登录时。
5. 利用 Nginx Helper 清理 fastcgi_cache 缓存
Nginx Helper 是一款专为 WordPress 配合 Nginx fastcgi_cache 缓存设计的插件。它轻量、无广告且完全免费,能够方便地在后台实现缓存的清理、管理与故障排查。只需在官方插件库中搜索 “Nginx Helper” 进行安装并启用,后台设置如下:

5.1 Nginx Helper 清理 fastcgi_cache 模式选择
①、purge 模式
这个模式需要保留上文 Nginx 配置中的 purge 清理路径,清理的时候会产生一个请求。
出于安全考虑,一般 purge 都不会完全开放!只有特定的 IP 可以访问,所以,如果用了 CDN 的朋友,再使用模式一,则需要在服务器上的 /etc/hosts 中将网站域名解析为服务器真实 IP,以便插件直接请求 purge 路径,而不用走 CDN 节点,避免请求被拒绝。还是没搞懂的话就放弃这个模式吧!
②、文件模式
模式二是直接清理对应的缓存文件,不需要请求 purge 这个清理路径,所以使用模式二,不需要配置上文 Nginx 的 purge 规则(我个人推荐使用这个模式)。
由于插件作者定义的缓存路径是 /var/run/nginx-cache
,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除!解决办法是在插件中找到这一处路径,并替换成我们自己上边设置的路径 /tmp/nginx-cache/shephe_com
。定义缓存路径的位置在/www/wwwroot/网站空间/wp-content/plugins/nginx-helper/includes/class-nginx-helper.php
,约 88 行位置。
如果怕更新插件忘了改,那么最好是在 WordPress 根目录下的 wp-config.php
中新增如下代码即可(不知道添加到第几行的话,可以添加到 define('WPLANG', 'zh_CN');
的后面。添加后建议重载一下 PHP,确保变量生效(主要针对开启了 PHP 缓存的网站),参考Nginx 开启 fastcgi_cache 缓存加速,支持 html 伪静态页面 - 张戈):
//根据实际情况定义缓存的存放路径
define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/nginx-cache/shephe_com
');
5.2 Nginx Helper 开启 Debug 选项
一般没啥事儿的话不用 Debug。第一个是日志选项,如果需要看日志还得在 wp-config.php
中增加 NGINX_HELPER_LOG
开启日志并定义位置;第二个是在页面底部加上加载信息,和本文最开始的那个函数一样。
6. 免插件清理 fastcgi_cache(Nginx Helper 纯代码版)
Nginx Helper 这款插件主要用于 Nginx fastcgi_cache 缓存或 Redis 缓存清理,用起来确实不错,但因为某些原因你实在不想用插件的话,也可以使用张戈大大的纯代码。
/**
* WordPress Nginx FastCGI 缓存清理代码(Nginx-Helper 纯代码版) By 张戈博客
* 文章地址:https://zhang.ge/5112.html
* 转载请保留原文出处,谢谢合作!
*/
//初始化配置
$logSwitch = 0; //配置日志开关,1 为开启,0 为关闭
$logFile = '/tmp/purge.log'; //配置日志路径
$cache_path = '/tmp/wpcache'; //配置缓存路径
//清理所有缓存(仅管理员) 范例:http://www.domain.com/?purge=all
if ($_GET['purge'] == 'all' && is_user_logged_in()) {
if( current_user_can( 'manage_options' ))
{
delDirAndFile($cache_path, 0);
}
}
//缓存清理选项
add_action('publish_post', 'Clean_By_Publish', 99); //文章发布、更新清理缓存
add_action('comment_post', 'Clean_By_Comments',99); //评论提交清理缓存(不需要可注释)
add_action('comment_unapproved_to_approved', 'Clean_By_Approved',99); //评论审核清理缓存(不需要可注释)
//文章发布清理缓存函数
function Clean_By_Publish($post_ID){
$url = get_permalink($post_ID);
cleanFastCGIcache($url); //清理当前文章缓存
cleanFastCGIcache(home_url().'/'); //清理首页缓存(不需要可注释此行)
//清理文章所在分类缓存(不需要可注释以下 5 行)
if ( $categories = wp_get_post_categories( $post_ID ) ) {
foreach ( $categories as $category_id ) {
cleanFastCGIcache(get_category_link( $category_id ));
}
}
//清理文章相关标签页面缓存(不需要可注释以下 5 行)
if ( $tags = get_the_tags( $post_ID ) ) {
foreach ( $tags as $tag ) {
cleanFastCGIcache( get_tag_link( $tag->term_id ));
}
}
}
// 评论发布清理文章缓存
function Clean_By_Comments($comment_id){
$comment = get_comment($comment_id);
$url = get_permalink($comment->comment_post_ID);
cleanFastCGIcache($url);
}
// 评论审核通过清理文章缓存
function Clean_By_Approved($comment)
{
$url = get_permalink($comment->comment_post_ID);
cleanFastCGIcache($url);
}
//日志记录
function purgeLog($msg)
{
global $logFile, $logSwitch;
if ($logSwitch == 0 ) return;
date_default_timezone_set('Asia/Shanghai');
file_put_contents($logFile, date('[Y-m-d H:i:s]: ') . $msg . PHP_EOL, FILE_APPEND);
return $msg;
}
// 缓存文件删除函数
function cleanFastCGIcache($url) {
$url_data = parse_url($url);
global $cache_path;
if(!$url_data) {
return purgeLog($url.' is a bad url!' );
}
$hash = md5($url_data['scheme'].'GET'.$url_data['host'].$url_data['path']);
$cache_path = (substr($cache_path, -1) == '/') ? $cache_path : $cache_path.'/';
$cached_file = $cache_path . substr($hash, -1) . '/' . substr($hash,-3,2) . '/' . $hash;
if (!file_exists($cached_file)) {
return purgeLog($url . " is currently not cached (checked for file: $cached_file)" );
} else if (unlink($cached_file)) {
return purgeLog( $url." *** CLeanUP *** (cache file: $cached_file)");
} else {
return purgeLog("- - An error occurred deleting the cache file. Check the server logs for a PHP warning." );
}
}
/**
* 删除目录及目录下所有文件或删除指定文件
* 代码出自 ThinkPHP:http://www.thinkphp.cn/code/1470.html
* @param str $path 待删除目录路径
* @param int $delDir 是否删除目录,1 或 true 删除目录,0 或 false 则只删除文件保留目录(包含子目录)
* @return bool 返回删除状态
*/
function delDirAndFile($path, $delDir = FALSE) {
$handle = opendir($path);
if ($handle) {
while (false !== ( $item = readdir($handle) )) {
if ($item != "." && $item != "..")
is_dir("$path/$item") ? delDirAndFile("$path/$item", $delDir) : unlink("$path/$item");
}
closedir($handle);
if ($delDir)
return rmdir($path);
}else {
if (file_exists($path)) {
return unlink($path);
} else {
return FALSE;
}
}
}
将这带代码引入进function.php
,按注释改成自己配置的情况。现在发布/更新文章、评论提交/审核,就会自动删除当前文章缓存了,发布/更新文章还会清理首页、分类以及相关标签页缓存(不需要可根据代码中的注释进行屏蔽)。
另外,如果想清理全部缓存,可在管理员登陆状态下访问首页+?purge=all
参数,比如:https://www.shephe.com//?purge=all
,其他用户或访客访问这个地址则没有任何作用,如果还不放心也可以自行更改代码中的参数判断字符串。但需要注意的是这个 URL 本身也会被缓存,以至于只能清理一次缓存,后续刷新就没用了,所以需要在宝塔网站配置文件
中去排除:
#后台等特定页面不缓存,请严格按照浏览器显示去添加,有无“/”是不同的页面
if ($request_uri ~* "purge=all|/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
[…] 如果 TTFB 很高,说明你的主机响应慢,建议检查后端性能或是否启用了动态页面缓存(如 FastCGI Cache)。 […]