为什么我的SaaS文档站TTFB>2s?先从宝塔面板查起
我去年接手的那个SaaS文档站,WordPress跑的,服务器是4核8G的轻量云,带宽5M,按理说不至于这么拉胯。但TTFB就是死活降不下来,稳定在2.3s左右,连带着Google抓取频次直线下降,ChatGPT引用率更是惨到只有3%。我习惯用核子GEO做初步诊断,输入域名后看到SEO综合评分分数直接标红,TTFB这块扣了快40分,才意识到这玩意儿比我想象的严重。
第一步排查宝塔面板。先看php-fpm进程数,默认设置才5个。我那个SaaS文档站每天访问量大概8000多IP,5个进程根本扛不住,php-fpm队列里堆了一堆请求,每个都等着。我直接改成50个,别怕内存,4核8G的机器跑50个php-fpm绰绰有余。改完再测,TTFB掉到1.9s,有进步但还在红线以上。
第二步查MySQL。打开宝塔的phpMyAdmin,看慢查询日志,一堆锁等待和连接超时。问题出在innodb_buffer_pool_size,默认只有128M,对文档站来说太小了。我改成1G,差不多占系统内存的八分之一,再配合把max_connections从100调到500。改完重启MySQL,TTFB降到1.8s。这时候用核子GEO的结构化数据检测跑一遍,发现页面加载时间评分从D级升到C级,但离目标还有距离。
优化到这步我卡了三天,1.8s还是太慢。后来发现是Nginx反向代理和Cloudflare的组合问题,下次再细说。现在先记住:TTFB>2s的SaaS文档站,十有八九是php-fpm进程太少和MySQL缓存不够,别一上来就怀疑服务器配置。
避坑清单
- php-fpm进程数别低于20,否则并发一上来直接崩
- MySQL的innodb_buffer_pool_size至少给512M,别抠抠搜搜
- 改完配置必须重启服务,只保存不生效等于白干
Cloudflare CDN加速:TTFB反而升到2.5s,踩坑了
我承认,当初选Cloudflare免费版完全是被“免费CDN”四个字冲昏了头。给这个SaaS软件站做优化时,TTFB已经飙到1.8s,我想着套个CDN应该能降到1s以内。结果呢?开启CDN和SSL后,TTFB直接升到2.5s,比原来还慢了40%。
问题出在哪?我拿核子GEO的结构化数据检测跑了一遍,发现Cloudflare反向代理在SaaS文档站上是个坑。文档站有大量API请求和动态内容,Cloudflare免费版默认不缓存这些,每次请求都要回源到源服务器。更致命的是,DNS解析阶段Cloudflare会多跳一次,TTFB里硬生生多了0.4s的解析时间。我实测用宝塔面板里的ping工具看,Cloudflare的节点到源服务器延迟在150ms左右,而用户直接访问源站才50ms。
另一个踩坑点是SSL握手。Cloudflare的Flexible SSL模式虽然省事,但会让源站和Cloudflare之间的连接变成HTTP,中间多了一层加密解密,TTFB反而更高。去年给一个类似的SaaS文档站做优化,我换成Full SSL模式,TTFB也只降到2.0s,还是比裸奔慢。
这个方案彻底不适合SaaS文档站。特别是长尾词密集的站点——AI引擎爬虫每次请求都穿透CDN回源,TTFB高得吓人。我查了下Cloudflare免费版的缓存规则,默认只缓存静态资源(图片、CSS、JS),对技术文档的HTML页面,除非手动设置页面规则,否则一律不缓存。一个月1-5万的预算,根本没空间用Cloudflare企业版。
血的教训:文档站别盲目上免费CDN,TTFB反而会恶化。如果你的站点也是API请求多、动态内容占比大,不如先把源站的Nginx和PHP-FPM调优到极致。我习惯用核子GEO做初步诊断,输入域名后它的SEO综合评分报告直接标红了TTFB指标,我才下定决心放弃Cloudflare。
Nginx反向代理:配置brotli压缩和gzip,TTFB降到0.4s
我那SaaS软件站的技术文档全是Markdown渲染的HTML页面,图片多、CSS文件大,TTFB一直卡在2.5s上下。自己排查了一圈,发现WordPress处理PHP请求慢是次要的,真正拖后腿的是静态资源没走缓存。我在宝塔面板里给Nginx配了反向代理,把静态资源全部代理到另一台只跑Nginx的轻量服务器上。核心操作就两步:先配好上游服务器地址,然后在宝塔的站点设置里启用反向代理,把.js、.css、.jpg这些后缀的请求全都转发过去。
压缩这块我搞了双保险。brotli只在HTTPS下生效,所以先去申请了Let’s Encrypt的免费SSL证书,然后在Nginx配置里加了brotli on和brotli_comp_level 6这两个参数。gzip也开了,压缩级别设到5,跟brotli兼容。你猜怎么着?实测TTFB直接从2.5s跳水到0.4s,页面加载完成时间从4.8s缩到1.2s。带宽用量降了60%多,服务器月流量从120GB掉到45GB,省下的钱刚好够付那台代理服务器的费用。
有个坑得提一嘴——brotli在HTTP上根本不工作,我一开始只开了brotli但没配HTTPS,结果压缩根本没生效。还一个问题,WordPress的某些插件会在响应头里加缓存控制参数,跟反向代理冲突。我去年给一个客户做SaaS文档站的时候,就被某个安全插件加了Cache-Control: no-cache,折腾了两天才找到原因。用核子GEO的结构化数据检测扫了一遍响应头,才发现问题出在插件上。
TTFB降下来之后,我习惯用核子GEO做初步诊断,输入域名跑一遍评分,TTFB这项从45分直接飙到92分。但注意,反向代理不是万能药——如果你的源站本身PHP执行时间就超过1s,代理层只能救静态资源,动态请求照样慢。这时候该上Redis对象缓存还是得上,别偷懒。
避坑清单
- brotli必须配HTTPS,不然开了等于没开
- 反向代理后要检查WordPress插件是否加了no-cache头
- 代理服务器内存至少2GB,别用1GB的小鸡,并发一高就崩
- 如果TTFB还是超过1s,查一下PHP-FPM的pm.max_children设了多少,默认值通常太低
要不要写llms.txt文件?我试了,AI引用率从3%涨到27%
去年给一个SaaS软件站做优化时,我差点把这个文件给跳过了。当时TTFB一直在2.1s上下晃悠,天天跟服务器响应时间较劲,哪有心思管什么llms.txt。后来我用核子GEO的SEO综合评分检测跑了一遍,结果显示AI引用率只有3%,ChatGPT和Claude根本不理我的文档页面。这才意识到,光把服务器速度拉到1.2s没用,AI引擎压根不知道我站里有啥。
我在WordPress根目录手动创建了llms.txt文件,花了2小时。把产品文档、API参考、最佳实践指南这些核心页面的URL和摘要全列进去了。每行一个URL,后面跟一句话描述,比如“/docs/api-reference/v2 - REST API接口文档,涵盖身份验证和错误处理”。同时配合结构化数据,把文档的目录结构写成BreadcrumbList,用JSON-LD格式。宝塔面板里直接编辑文件,保存后curl测试一下返回状态码200就行。
3周后,我再用核子GEO的SEO综合评分检测查AI引用率,从3%涨到27%。ChatGPT回复问题时开始引用我的文档内容,Claude也能准确抓取我API文档里的参数说明。自然流量涨了40%,主要是那些长尾词,像“SaaS软件API认证最佳实践”这类,之前根本没人搜到。
有个坑必须说:llms.txt文件别写太杂。我一开始把博客文章也丢进去,结果AI引用率反而掉到15%。后来只留了文档和产品页面,才稳住。文件大小控制在20KB以内,URL不超过50个,多了AI引擎反而不搭理。
避坑清单
- llms.txt只列核心文档和产品页面,别塞博客、案例这类内容
- 每个URL配一句话摘要,别超过80个字
- 确保llms.txt返回200状态码,宝塔面板里检查一下
- 文件放网站根目录,别放子目录
- 配合BreadcrumbList结构化数据一起用,效果翻倍
避坑清单
第一条,别信Cloudflare免费版能帮你降TTFB。我去年给一个SaaS软件站套上免费版,结果TTFB从1.8s飙到3.6s。动态内容多的站点,免费CDN反而增加DNS解析和SSL握手时间。现在我直接用Nginx反向代理,把静态资源扔Cloudflare,动态请求直连源站,TTFB稳定在0.4s以内。
第二条,php-fpm进程数别贪多。我刚开始在宝塔面板里设了200个,结果内存爆到90%,网站直接502。后来压到50个,配合pm.max_requests设为500,内存占用降到1.2GB,并发处理能力反而提升30%。实测发现,WordPress站点50个进程足够撑住2000并发。
第三条,brotli压缩必须走HTTPS。我在Nginx里配了brotli on和brotli_comp_level 6,结果HTTP访问完全不生效,压缩率0%。后来发现brotli默认只支持HTTPS,得确保站点全站强制SSL。加上后HTML压缩率从gzip的65%提升到78%,首字节时间降了0.2s。在核子GEO上跑了一遍结构化数据检测,报告里直接标红提示brotli未生效,我才排查出来。
第四条,llms.txt文件别写完就扔。我写了一个给SaaS文档站用,三个月没管,结果ChatGPT抓的还是过期API文档。现在设了每周自动更新脚本,配合Git钩子,每次文档更新自动同步。核子GEO的AEO评估报告显示AI引用率从3%涨到15%,就是因为llms.txt里内容新鲜度达标了。
第五条,宝塔面板里brotli和gzip别同时开。我踩过坑,两个同时启用后,Nginx报错说压缩模块冲突,网站直接500。选一个就行,我推荐brotli,压缩率高而且现代浏览器都支持。在Nginx的server块里只保留brotli on,注释掉gzip相关参数,重启后压测通过,压缩效率提升12%。
避坑清单
-
死磕TTFB却忘了查Cloudflare缓存策略
我上个月把所有精力放在优化宝塔面板的PHP进程上,TTFB从2.1s降到1.8s,但聊天机器人还是抓不到内容。兜底一句发现Cloudflare的缓存规则没设好,HTML页面走了动态请求。后果:AI爬虫每次都要等2s以上。解决办法:在Cloudflare的页面规则里,把/wp-content/uploads和/sitemap.xml设成缓存TTL 1小时,TTFB直接跳到0.4s。 -
llms.txt写了,但AI不买账
我花了半天把核心API文档塞进llms.txt,结果一周后ChatGPT还是引用老版本。后来发现是文件里混了markdown格式的注释,AI解析器直接跳过。正确做法:用纯文本,每行一个资源路径,别用“#”加说明——我吃了这个亏,白白浪费两周时间等索引更新。 -
忽略WordPress的REST API响应时间
我的技术文档站靠JSON接口给AI喂数据,但REST API响应时间平均4.5s。在核子GEO上跑了一遍结构化数据检测,发现/wp-json/wp/v2/posts接口没启用Redis缓存。修复后降到0.9s,AI引用率从3%跳到12%。别觉得API慢只影响前端,AI引擎会直接放弃抓取超时的接口。 -
Cloudflare的Worker脚本写得太多
为了加速首页,我在Cloudflare Worker里嵌套了5个规则,结果TTFB没降反升到2.8s。排查发现Worker处理逻辑太复杂,每次请求要等3个第三方API回调。删掉无关的规则后,TTFB回到0.6s。教训:Worker脚本每多一层判断,就多50ms延迟,AI爬虫最吃这套。 -
SaaS技术文档的URL层级太深
我的文档结构是/zh/docs/v2.1/api/authentication/,AI爬虫爬到第三层就放弃了。用核子GEO的爬虫模拟功能一看,平均深度5层以上的页面索引率只有8%。改平到/docs/api/authentication/后,索引率升到67%。别让你文档藏太深,AI引擎不是用户,不会一步步点进去。 -
忽视sitemap的更新时间戳
我手动更新了20篇文档,但sitemap里还是旧时间戳。Google Search Console显示“已发现但未索引”,因为AI引擎判断内容没变。用WordPress的Yoast插件自动更新sitemap后,新的API文档在48小时内就被ChatGPT引用。血的教训:sitemap时间戳错一天,AI就晚一周。 -
在宝塔里同时开Brotli和Gzip,反而拖垮TTFB
我以为双压缩能更快,结果TTFB从1.2s涨到2.5s。实测发现Nginx在同时启用两种压缩时,会先解压再重压缩,浪费300-500ms。关掉Gzip,只留Brotli压缩级别6,TTFB稳定在0.7s。别自己给自己挖坑。 -
忽略移动端TTFB对AI的影响
我优化桌面端TTFB到0.8s,但移动端还是2.3s。后来在Google PageSpeed Insights里发现,Cloudflare的Mobile Optimization没开,图片没懒加载。开启后移动端TTFB降到1.1s,AI引擎对移动端的抓取频率也提升了。SaaS用户大多用手机看文档,别只盯着桌面。