Nginx 反向代理缓存配置实战:给 WordPress 网站提速 10 倍

前言

作为个人站长,最头疼的问题之一就是网站访问速度。尤其是使用 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.confhttp 块中定义缓存路径和参数:

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 插件,它可以自动在文章发布/更新时清理对应的缓存页面,开箱即用,配置简单。

四、缓存命中率优化技巧

  1. 区分匿名用户和登录用户:登录用户和管理员不缓存,通过 Cookie 判断即可
  2. 合理设置过期时间:文章页缓存时间可以设置更长(如 2-4 小时),首页可以短一些(15-30 分钟)
  3. 排除动态内容:购物车、搜索结果等页面不适合缓存,务必排除
  4. 启用 Brotli 压缩:在 Nginx 层面启用 Brotli 压缩,进一步减小传输体积
  5. 配合 CDN:Nginx 缓存配合 Cloudflare 等 CDN,可以构建多层缓存体系

五、常见问题排查

Q:缓存没有生效,X-Cache 始终是 MISS?

检查 fastcgi_cache_key 是否正确,特别是 HTTPS 站点是否包含了 ssl 协议。另外检查 WordPress 是否开启了强制 HTTPS。

Q:页面更新后缓存没有自动清理?

确认 purge 模块已安装,且 WordPress 插件或主题中正确调用了清理接口。

Q:缓存文件占用磁盘过大?

调整 inactivemax_size 参数。对于内容更新不频繁的个人博客,60 分钟 inactive 可以调整为 30 分钟。

六、总结

Nginx 反向代理缓存是提升 WordPress 网站性能性价比最高的方案之一。配置本身并不复杂,只需要理解核心的几个参数和规则,一个晚上就能部署完成。对于一台 1 核 1G 的低配服务器,开启缓存后足以支撑几千的日 PV,效果立竿见影。

个人站长在做技术选型时,不要一上来就上各种重型缓存方案,从 Nginx FastCGI Cache 入手,逐步优化,才是务实的做法。

Last modification:July 31st, 2026 at 08:15 am

Leave a Comment