1Panel 面板为 WordPress 开启 FastCGI Cache

1Panel 默认以 OpenResty(Nginx 增强版)作为 Web 服务器,直接监听 80/443 端口处理 HTTP 请求。对于 PHP 请求,OpenResty 作为反向代理转发给 PHP-FPM 处理。本文介绍如何利用 OpenResty 的 FastCGI Cache 为 WordPress 站点提速。

一、FastCGI Cache 的原理

WordPress 是动态 PHP 应用,每次请求都需要 PHP 执行数据库查询、主题渲染、插件运算。FastCGI Cache 的作用是:

  1. 首次请求:PHP 正常处理页面,OpenResty 将渲染后的 HTML 缓存到磁盘
  2. 后续请求(缓存有效期内):OpenResty 直接从磁盘读取静态 HTML 返回,完全绕过 PHP 处理
  3. 效果:页面加载时间可从 1~3 秒降至 <100ms,服务器负载大幅降低
用户请求 → OpenResty (Web 服务器,监听 80/443)
  ├─ 静态资源(CSS/JS/图片)→ 直接返回
  ├─ PHP 请求,缓存命中 → 从磁盘返回缓存 HTML → 瞬间加载
  └─ PHP 请求,缓存未命中 → 反向代理给 PHP-FPM → 写入缓存 → 返回

关于”反向代理”:OpenResty 本身就是 Web 服务器,直接监听 80/443 端口处理 HTTP。之所以说它也是反向代理,是因为对于 PHP 这类动态请求,OpenResty 并不自己处理(它不包含 PHP 解释器),而是将请求转发给后端的 PHP-FPM 进程处理,再将 PHP-FPM 返回的结果(HTML)返回给客户端。这种将请求转发给后端服务的角色就是反向代理。

二、1Panel 的目录结构

1Panel 安装 OpenResty 后的相关路径如下:

用途 路径
OpenResty 主配置 /opt/1panel/apps/openresty/openresty/conf/nginx.conf
站点配置文件 /opt/1panel/www/conf.d/你的域名.conf
站点根目录 /opt/1panel/www/sites/你的域名/index

目录结构示意图

/opt/1panel/
├── apps/
│   └── openresty/
│       └── openresty/
│           └── conf/
│               └── nginx.conf          ← OpenResty 主配置文件(http{} 块)
└── www/
    ├── conf.d/
    │   └── lxzt.fun.conf               ← 站点独立配置文件(server{} 块)
    └── sites/
        └── lxzt.fun/
            ├── index/                   ← 网站文件根目录
            └── (WordPress 文件)

配置层次关系

nginx.conf (http {} 块)           ← 在这里定义 fastcgi_cache_path
   └── include /opt/1panel/www/conf.d/*.conf;
        └── lxzt.fun.conf (server {} 块)   ← 在这里配置 FastCGI Cache 规则

三、开启 FastCGI Cache 的详细步骤

步骤 1:在 OpenResty 主配置中定义缓存路径

编辑 /opt/1panel/apps/openresty/openresty/conf/nginx.conf,在 http{} 块中添加:

# 定义 FastCGI 缓存路径和参数
fastcgi_cache_path /dev/shm/wpcache levels=1:2 keys_zone=WORDPRESS:50m inactive=60m use_temp_path=off;

参数说明:

参数 说明
/dev/shm/wpcache 缓存目录 使用内存盘(tmpfs)速度最快,重启会丢失但可接受
levels=1:2 目录层级 缓存文件分布到两层子目录,避免单目录文件过多
keys_zone=WORDPRESS:50m 缓存 key 元数据 50MB 内存存 key 索引,约可存 50 万条
inactive=60m 过期时间 60 分钟无访问后自动清除
use_temp_path=off 临时文件 禁止临时文件路径,直接在缓存目录写入

提示:如果服务器内存充裕,缓存目录建议放内存盘(/dev/shm/),读写速度远超磁盘。想持久化可改为磁盘路径如 /var/cache/nginx/wpcache

步骤 2:在站点配置文件中添加 FastCGI Cache 规则

编辑站点配置文件,例如 /opt/1panel/www/conf.d/lxzt.fun.conf,在已有 server {} 块内添加缓存配置:

# 站点配置文件
# /opt/1panel/www/conf.d/lxzt.fun.conf

server {
    listen 80;
    listen 443 ssl;
    server_name lxzt.fun;

    # ... 其他配置(SSL 证书、root 路径等,由 1Panel 自动管理,保持不动)...

    # 缓存开关(默认打开)
    set $skip_cache 0;

    # 以下情况跳过缓存:
    # 1. POST 请求(提交表单、登录等)
    if ($request_method = POST) {
        set $skip_cache 1;
    }
    # 2. 带查询参数的 URL(如 ?s= 搜索、?page_id= 等)
    if ($query_string != "") {
        set $skip_cache 1;
    }
    # 3. 特定 cookie(登录用户和评论者)
    if ($http_cookie ~* "comment_author_|wordpress_logged_in|wp-postpass|wordpress_sec|wordpress_test_cookie") {
        set $skip_cache 1;
    }
    # 4. WordPress 后台和 API
    if ($request_uri ~* "/wp-admin/|/wp-login|/wp-json|/xmlrpc|/sitemap") {
        set $skip_cache 1;
    }

    location ~ \.php$ {
        # FastCGI 缓存配置
        fastcgi_cache WORDPRESS;
        fastcgi_cache_key "$scheme$request_method$host$request_uri";
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        # 缓存有效期(按响应码分别设置)
        fastcgi_cache_valid 200 301 302 10m;  # 正常页面和重定向缓存 10 分钟
        fastcgi_cache_valid 404 1m;           # 404 页面缓存 1 分钟

        # 添加缓存状态响应头(调试用,上线后可移除)
        add_header X-Cache-Status $upstream_cache_status;

        # 缓存锁(防止雪崩)
        fastcgi_cache_lock on;
        fastcgi_cache_lock_age 5s;
        fastcgi_cache_lock_timeout 5s;

        # 分段缓存(可选,提升并发性能)
        fastcgi_cache_use_stale updating error timeout invalid_header http_500 http_503;

        # PHP 转发配置(由 1Panel 自动生成,保持不动即可)
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-cgi-74.sock;  # 以实际版本为准
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$index;
    }
}

注意:实际文件中可能已有 1Panel 自动生成的 location ~ \.php$ {} 块,不要删除原有的 fastcgi_passfastcgi_indexfastcgi_param 等指令,只需在块内追加上述缓存配置即可。

步骤 3:刷新配置

# 测试配置文件语法
nginx -t

# 重新加载配置
nginx -s reload

# 或使用 systemd
systemctl reload openresty

四、验证缓存是否生效

方法 1:查看响应头

curl -I https://lxzt.fun/

如果看到以下响应头,说明缓存已生效:

X-Cache-Status: HIT    # 缓存命中
X-Cache-Status: MISS   # 缓存未命中(首次请求)
X-Cache-Status: BYPASS # 跳过缓存(登录状态等)

首次访问返回 MISS,二次访问返回 HIT 才说明缓存正常工作。

方法 2:对比加载时间

# 第一次访问(MISS)
curl -o /dev/null -w "耗时: %{time_total}s\n" -s https://lxzt.fun/

# 第二次访问(HIT)
curl -o /dev/null -w "耗时: %{time_total}s\n" -s https://lxzt.fun/

正常情况下,第二次访问的耗时应大幅小于第一次(通常从 1~3s 降到 <0.1s)。

方法 3:查看缓存目录

ls -la /dev/shm/wpcache/

五、高级配置

5.1 是否缓存登录用户

如果希望缓存对所有用户一致(包括登录用户也看相同版本),从 $skip_cache 规则中移除 wordpress_logged_in cookie 判断。但要注意:登录用户缓存的页面可能包含管理栏。可根据实际需求权衡。

5.2 缓存清理

# 清理全部缓存
rm -rf /dev/shm/wpcache/*

# 定时清理(crontab,每日凌晨 3 点)
0 3 * * * rm -rf /dev/shm/wpcache/*

六、常见问题 FAQ

Q1:开启缓存后,文章更新前台不变化怎么办?

这是缓存生效的正常现象。三种方案:

  1. 缩短缓存有效期:将 fastcgi_cache_valid 200 10m 改为 5m
  2. 安装 Nginx Helper 插件:发布/更新文章时自动清理缓存
  3. 设置定时清理:每 10 分钟用 crontab 清理一次缓存

Q2:配置了为什么看不到 X-Cache-Status 头?

如果 add_header 写在 location 块外部但被内部 location 覆盖了,或者响应头被后端 PHP 覆盖。确保 add_header X-Cache-Status $upstream_cache_status; 写在 location ~ \.php$ {} 块内部。

Q3:开启缓存后网站出现样式错乱?

缓存配置只应作用于 .php$ 请求,CSS/JS/图片等静态资源不经 FastCGI。检查是否有 location ~ \.php$ {} 块之外误用了 fastcgi_cache 指令。


本文基于 1Panel + OpenResty 环境编写。fastcgi_cache_path 定义在 OpenResty 主配置,缓存规则直接写在站点配置 /opt/1panel/www/conf.d/你的域名.conf 中。

© 版权声明

相关文章

暂无评论

none
暂无评论...