1Panel 默认以 OpenResty(Nginx 增强版)作为 Web 服务器,直接监听 80/443 端口处理 HTTP 请求。对于 PHP 请求,OpenResty 作为反向代理转发给 PHP-FPM 处理。本文介绍如何利用 OpenResty 的 FastCGI Cache 为 WordPress 站点提速。
一、FastCGI Cache 的原理
WordPress 是动态 PHP 应用,每次请求都需要 PHP 执行数据库查询、主题渲染、插件运算。FastCGI Cache 的作用是:
- 首次请求:PHP 正常处理页面,OpenResty 将渲染后的 HTML 缓存到磁盘
- 后续请求(缓存有效期内):OpenResty 直接从磁盘读取静态 HTML 返回,完全绕过 PHP 处理
- 效果:页面加载时间可从 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_pass、fastcgi_index、fastcgi_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:开启缓存后,文章更新前台不变化怎么办?
这是缓存生效的正常现象。三种方案:
- 缩短缓存有效期:将
fastcgi_cache_valid 200 10m改为5m - 安装 Nginx Helper 插件:发布/更新文章时自动清理缓存
- 设置定时清理:每 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中。