配置 Nginx FastCGI 缓存:全面提升网站加载速度

配置 Nginx FastCGI 缓存:全面提升网站加载速度

文章目录
文章目录
  1. 1. WordPress 性能优化一般有哪些
  2. 2. Nginx 配置 ngx_cache_purge 模块
  3. 3. 网站配置 ngx_cache_purge 模块
  4. 4. 检查 Nginx fastcgi_cache 缓存状态
  5. 5. 利用 Nginx Helper 清理 fastcgi_cache 缓存
  6. 6. 免插件清理 fastcgi_cache(Nginx Helper 纯代码版)

最近趁着有空,我陆陆续续对自己搭建的 WordPress 网站做了些优化工作,前端视觉和后台逻辑都做了小幅调整。过程中意外发现:原本部署的 Memcached 实际并未启用,同时每篇文章的数据库查询次数居然高达百次(现已修复),访问速度自然也就提不起来。

于是,我开始着手从根本上解决性能瓶颈,对网站前后端做了系统性的优化尝试。最终实践证明,借助 Nginx 的 fastcgi_cache 模块进行页面缓存,不仅部署简单、控制灵活,实际效果也非常显著——页面响应时间从“秒”直接压缩到“毫秒”,可以说是真正实现了秒开体验。

配置 Nginx FastCGI 缓存:全面提升网站加载速度
让 WordPress 从秒级访问到毫秒级访问

1. WordPress 性能优化一般有哪些

在优化 WordPress 性能之前,首要任务是掌握网站当前的访问表现。除了用户自身的主观体验外,我们还应借助一系列工具进行客观分析。推荐使用如下工具来评估页面加载情况和资源利用效率:

其中,它们都提供了丰富的性能评分与优化建议,适合进行页面层级的综合评估。此外,也建议结合后端数据进行观察。你可以在主题的 footer.php 中插入如下代码,用以输出页面的数据库查询次数:

	</body>
<!--<?php echo get_num_queries().'次查询,耗时'.timer_stop(0).'秒。'; ?>-->
<!--将上一行目标代码作 HTML 注释并不影响其功能,实现前台页面隐藏-->
</html>

配合 Chrome 的开发者工具,操作方式如下:

  1. 按下 F12Ctrl+Shift+I 打开开发者工具;
  2. 切换至 “网络” 标签页;
  3. 勾选 “停用缓存” 选项;
  4. 刷新页面。

这样可以更准确地查看:

  • 页面加载所发起的请求总数;
  • 各类资源的加载时间;
  • 数据库的查询次数;
  • 总体页面加载耗时等关键指标。

通过前述数据分析,我们能够更有针对性地识别性能瓶颈,为后续的缓存配置和资源压缩提供坚实的依据。那么,针对 WordPress 站点的性能优化,通常应从以下几个关键方面着手:

  1. 服务器性能扩容 —— 包括升级硬件配置、提升带宽和优化数据库性能;
  2. 静态资源优化 —— 压缩图片、合并与精简 CSS/JS 文件,合理使用浏览器缓存;
  3. 内容分发网络(CDN) —— 利用全球节点加速静态资源分发,降低服务器负载;
  4. 网页延迟加载(Lazy Load) —— 延迟加载非首屏图片和资源,减少首次渲染压力;
  5. 系统代码优化 —— 精简和优化 WordPress 主题与插件代码,避免不必要的查询和请求;
  6. 缓存机制使用 —— 包括页面缓存、对象缓存和数据库查询缓存等多层次缓存策略;
  7. 服务器配置优化 —— 例如 Nginx 配置调整、PHP-FPM 参数调优等。

就 Kevin's Space 当前状况而言,静态资源优化尤为紧迫。首页首屏即加载超过 2.5MB 的内容,且尚未配置有效缓存及服务器优化,显著影响了页面加载速度和用户体验。

本文将系统介绍如何为 WordPress 配置 Nginx 的 fastcgi_cache 缓存机制,基于我个人在实际站点优化过程中的实践经验整理而成。虽然网上已有不少相关教程,但许多内容对初学者并不友好,缺乏从零讲清的完整流程。因此,我希望通过这篇文章,为真正的小白用户提供一份更清晰、可操作的参考指南。在尝试 Nginx 缓存之前,我也评估并实测过多种主流方案,包括:

根据我在个人站点上的实际测试结果,总结如下两点建议:

  1. 对象缓存方面,推荐使用 Memcached 结合 Batcache 的方案,因其轻量且性能稳定,适合中小型网站。相较之下,Redis 配置复杂且资源消耗较高,对于中小型站点而言,其性能提升有限,不建议作为首选。
  2. 页面缓存插件方面,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 注意事项

  1. add_header Cache-Control 指令用于设置缓存控制策略。若动态内容需要实时更新,应将其设置为 no-cachemax-age=0;若允许缓存,则可根据需求设置较长的缓存时间,单位默认为秒。
  2. sock 路径务必正确配置,否则可能导致 Nginx 与后端 PHP-FPM 之间通信失败,出现 502 Bad Gateway 错误。
  3. 代码中涉及的服务器公网 IP 地址请替换为您实际服务器的公网 IP,且须保留双引号。
  4. 可选缓存配置示例:若部分主题在移动端访问时出现异常,可针对移动端请求设置不启用缓存,示例如下:
    #不缓存移动端访问
    if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry|windowss(ce|phone))) {
            set $skip_cache 1;
    }
  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);
}
  1. 启用 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 缓存即已生效。可以通过以下方法验证:

  1. 按下 F12Ctrl+Shift+I 打开浏览器开发者工具;
  2. 切换到 “Network”(网络)标签页;
  3. 勾选 “Disable cache”(停用缓存)选项;
  4. 点击访问页面的文档请求,查看响应头信息。

通常,缓存命中时响应头会包含类似如下内容:

X-Cache-Status: HIT
Cache-Control: public, max-age=xxx

这表明页面内容来自缓存,访问速度得到显著提升。具体来讲,如下图所示:

检查Nginx fastcgi_cache缓存状态
检查 Nginx fastcgi_cache 缓存状态
Nginx fastcgi_cache缓存效果
最后我把缓存放在内存空间里面去了,速度确实有略微提升,没开缓存时则接近甚至超过一秒

其中有 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” 进行安装并启用,后台设置如下:

利用Nginx Helper清理fastcgi_cache缓存
利用 Nginx Helper 清理 fastcgi_cache 缓存

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;
}

「配置 Nginx FastCGI 缓存:全面提升网站加载速度」有 31 条评论
  • […] 如果 TTFB 很高,说明你的主机响应慢,建议检查后端性能或是否启用了动态页面缓存(如 FastCGI Cache)。 […]

  • […] 配置 Nginx FastCGI 缓存:全面提升网站加载速度 […]

  • […] 配置 Nginx FastCGI 缓存:全面提升网站加载速度 […]

  • […] Nginx fastcgi_cache 和 Memcached 内存缓存来提速 […]

  • […] 等等还没完,哪有这么顺利的事情呐…我本人在配置 Nginx fastcgi_cache 缓存为网站提速就提过,我本是要先安装 Memcached 对数据进行缓存,然后再安装 fastcgi 让它两相互配合使用,不幸当时安装 Memcached 失败了。那会儿我拿着那段报错提示搜刮了中文、英文、日文甚至俄文的相关资料,均没有获得正确的解决方案,错误提示如下: […]

  • 织梦岁月
    04/09/2024 at 21:27 回复

    大佬啊,我的博客总觉得慢,那个评论特别特别慢,也不知道怎么解决,以后多来你这里学习。。

    • 的头像
      Kevin
      04/10/2024 at 12:04 回复

      评论特别慢考虑函数优化(这个非科班出身不用想了),或者提高服务器性能,再或者搞对象缓存

    • Pipu
      04/14/2024 at 11:30 回复

      去 Wp 后台,设置,讨论。
      把有人发表评论时和有评论等待审核时前面的打勾去掉。立竿见影。

  • 陶小桃Blog
    04/09/2024 at 14:48 回复

    你的网站速度还是蛮不错的啊

    • 的头像
      Kevin
      04/10/2024 at 12:05 回复

      这几天瞎搞似乎又变卡了不少哎

  • 二猫
    04/06/2024 at 21:42 回复

    速度太快了,大受震撼?

  • 老麦
    04/05/2024 at 15:46 回复

    有一说一,你的Wordpress站点优化得真好,都说Wordpress慢,我一直认为,只要优化好,速度还是很快的。

    • 的头像
      Kevin
      04/06/2024 at 00:48 回复

      你那个明显更快,而且用的香港服务器~
      我最近也是瞎折腾,搞了这一阵就是明年的事儿了~~一般至少一年才折腾一回

  • wu先生
    04/04/2024 at 18:56 回复

    技术文,不日月觉历。

  • dujun
    04/03/2024 at 20:19 回复

    访问很快

  • 1900
    04/02/2024 at 22:44 回复

    WordPress折腾的东西是挺多的,以前玩的时候也成天研究这些。
    (另外我你博客里会偶发性的出现碰到带滚动条的pre标签时会出现无法向下滚动的情况,鼠标手动拖动滚动条后又会恢复正常)

    • 的头像
      Kevin
      04/07/2024 at 17:12 回复

      内嵌滚动内容不都是这样么?

  • TeacherDu
    04/02/2024 at 18:40 回复

    好详细啊,这个实用~

    • 的头像
      Kevin
      04/07/2024 at 17:11 回复

      不算教程,专门写的记录贴,就怕哪天自己又需要用了,记不住。。

  • w4j1e
    04/02/2024 at 15:16 回复

    访问确实很快,文章一点就开。
    动态网站程序使用 CDN 带来的提升可能相较于静态网站比较有限吧。

    • 的头像
      Kevin
      04/07/2024 at 17:10 回复

      跟存储服务器很有关系吧,我想如果我的服务器是2m带宽的话,不上CDN恐怕狠恼火

  • hary
    04/02/2024 at 14:08 回复

    佬,你站点好快啊,下面图文的博客也很快,都是秒开的,优化的好啊

    • 的头像
      Kevin
      04/07/2024 at 17:03 回复

      瞎折腾,最近这段时间折腾完毕就会回归博客(个人站)的本质了

  • 的头像
    obaby
    04/02/2024 at 09:44 回复

    好绿

  • 灰常记忆
    04/02/2024 at 00:26 回复

    速度很快 我现在求稳

  • 的头像
    Jeffer.Z
    04/01/2024 at 22:45 回复

    你别说啊,速度确实快了好多啊。

  • 的头像
    Jeffer.Z
    04/01/2024 at 22:44 回复

    Memcached+batcache和supercache有没有冲突啊。我之前用redis结果被攻击打的报错就不敢用了。

    • 的头像
      Kevin
      04/07/2024 at 16:54 回复

      应该是没有,一个是数据对象存储,一个是直接缓存HTML页面,我试用了下来发现效果一般就停掉了,你描述的这几个东西我认为都可以停掉,用本文中哪个 WP rocket 插件就可以了

  • S
    04/01/2024 at 21:31 回复

    马克。

发表评论

请输入关键词…