本文约 4,216 字,预计阅读 11 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:文章发了三天,谷歌还没来看一眼
有站长遇到这样的情况:新文章发布后主动提交,等了三天 GSC 仍显示”网址尚未被抓取”。站点不大、内容也不差,问题出在服务器——用 curl 实测 TTFB 高达 2.3 秒。Google 的抓取预算文档里明确提到:站点响应越快、错误越少,抓取速率会相应提升;反之爬虫会主动降低抓取频率,避免拖垮服务器。
TTFB(Time to First Byte,首字节时间)衡量的是”从发起请求到收到服务器第一个字节”的耗时。它不包含内容下载,纯粹反映服务器端的处理能力。对 WordPress 这类动态站点,TTFB 往往占页面总加载时间的 30%–50%,是最值得先动的一块。
原理分析:TTFB 由哪几段构成
一次 WordPress 请求的 TTFB 可以拆成:
| 阶段 | 说明 | 优化手段 |
|---|---|---|
| DNS + 连接 | 域名解析与 TLS 握手 | HTTP/2、HTTP/3、CDN |
| 重定向 | 每次跳转多一个 RTT | 压平跳转链 |
| Web 服务器 | Nginx/Apache 处理 | FastCGI 缓存 |
| PHP 执行 | WordPress 启动、查询 | OPcache、对象缓存 |
| 数据库 | MySQL 查询 | 索引、慢查询优化、Redis |
Google 在 web.dev 上给出的参考值:TTFB 控制在 0.8 秒以内对大多数站点是合理的,优秀站点能做到 0.2 秒以内。而如果超过 1.8 秒,就进入了”需要改进”的区间。
对抓取的影响是直接的:Googlebot 的抓取是按预算分配的,服务器响应慢意味着同样的时间能抓的页面更少,长期结果是新内容收录延迟、深层页面抓取频次下降。所以 TTFB 不只是用户体验问题,也是索引效率问题。
WordPress 场景下,TTFB 高的典型原因是:没有页面缓存、PHP 没开 OPcache、插件过多导致每次请求加载几百个文件、以及 wp-cron.php 在请求中同步执行定时任务。
保姆级实操
步骤 1:测量基线。 用 curl 的分阶段计时定位瓶颈在哪一段。
# 输出 DNS/连接/等待/总耗时,重点看 time_starttransfer(即 TTFB)
curl -s -o /dev/null -w \
"dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n" \
https://example.com/
# 多测几次取中位数,排除偶发抖动
for i in 1 2 3 4 5; do curl -s -o /dev/null -w "%{time_starttransfer}\n" https://example.com/; done
若 time_namelookup 和 time_connect 很小而 time_starttransfer 很大,说明瓶颈在服务端;反之先解决 DNS 与连接。
步骤 2:开启 OPcache。 这是投入产出比最高的一步,PHP 8 默认已编译但需要启用并调参。
; php.ini 或 /etc/php/8.2/fpm/conf.d/10-opcache.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=2
opcache.save_comments=1
opcache.fast_shutdown=1
max_accelerated_files 要大于站点 PHP 文件总数(含插件与主题),否则会退化;改完重启 php-fpm 生效。
步骤 3:加页面缓存。 Nginx 的 FastCGI 缓存比 PHP 层缓存插件更省资源,因为动态请求根本不会进 PHP。
# http {} 块内
fastcgi_cache_path /var/cache/nginx/wp levels=1:2 keys_zone=WPCACHE:100m
max_size=2g inactive=60m use_temp_path=off;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
# server {} 块内
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($request_uri ~* "/wp-admin/|/wp-login.php|/cart/|/checkout/") { set $skip_cache 1; }
if ($http_cookie ~* "wordpress_logged_in_|comment_author_|woocommerce_items_in_cart") {
set $skip_cache 1;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_cache WPCACHE;
fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache-Status $upstream_cache_status;
}
配置后访问页面看响应头里的 X-Cache-Status,命中时显示 HIT。登录用户、购物车、结算页必须排除,否则会出现串号。
步骤 4:把 wp-cron 交给系统 cron。 默认的 wp-cron.php 会在每次页面访问时触发检查,高峰期显著拖慢响应。
# 在 wp-config.php 中禁用请求触发的 cron
# define('DISABLE_WP_CRON', true);
# crontab -e 加入系统级定时,每 5 分钟执行一次
*/5 * * * * /usr/bin/php /var/www/example.com/wp-cron.php > /dev/null 2>&1
步骤 5:加对象缓存与数据库优化。 装 Redis 并启用 WP_REDIS_HOST 等常量配置(配合 Redis Object Cache 插件),把重复的 wp_options 查询挡在数据库之外;同时用 Query Monitor 插件定位慢查询,给高频查询的表补索引。
步骤 6:压平重定向链。 每次跳转都是一个完整的往返,http → https、www → 非 www、旧路径 → 新路径应合并成一条规则,方法见 批量 301 重定向规划。
步骤 7:复查。 再跑一次 curl 多轮测试,确认 TTFB 稳定在目标区间;同时观察 GSC 的”抓取统计(Crawl Stats)”报告中”下载时间(毫秒)”是否下降。
常见踩坑
- 案例: 某站 TTFB 长期 2 秒以上,排查发现是缓存插件与主题自带的”相关阅读”查询每次都要扫全表,且
wp_options里堆积了 40MB 的过期 transient。清理 transient、加 Redis 对象缓存后,TTFB 降到 260 毫秒,新文章收录时间从三天缩短到几小时。 - 开了页面缓存却忘了排除登录态,前台出现”串号”——访客看到了上一个用户的用户名。必须严格设置
fastcgi_cache_bypass。 - OPcache 的
max_accelerated_files保持默认 4000,站点文件数远超该值,缓存命中率极低。 - 禁用了 wp-cron 却忘记加系统 cron,定时发布、备份、邮件全部失效。两者必须配套。
- 用 CDN 缓存了 HTML 但没有设置正确的缓存键,
?utm_source=参数导致缓存碎片化,命中率接近于零。 - 把重定向链留在 PHP 层(用插件跳转),每个请求都要启动一次 WordPress,TTFB 白白多出几百毫秒,应改到服务器层,参见 301 302 307 重定向区别。
- 只看首页 TTFB,忽略
wp-admin与 REST API 的响应,后台卡顿会让编辑体验崩溃,也会拖慢发布流程。
总结
TTFB 的判断标准:稳定值控制在 0.8 秒以内为合格,0.2 秒以内为优秀,超过 1.8 秒必须处理。行动清单:先用 curl 分阶段测量定位瓶颈;开启并调优 OPcache;上 FastCGI 页面缓存并严格排除登录态与动态页;把 wp-cron 交给系统 cron;加对象缓存并清理慢查询;压平重定向链;最后用 GSC 抓取统计验证效果。TTFB 是少数”改完立刻能测出来”的 SEO 项,投入半天时间,往往能同时改善收录速度、用户体验与排名稳定性。性能整体的优化顺序可参考 站点速度与排名的真实关系。
