先别急着上CDN,TTFB卡在Nginx的缓冲和压缩上

去年双十一前,我那个电商零售站TTFB一直卡在2.4秒。用户留言全是”图片转半天”,后台监控曲线跟心电图似的。查Nginx日志发现三个问题:静态资源压根没压缩,gzip版本还是1.x老古董,TCP连接每次都在重复握手。

我先把gzip关了。别心疼,这玩意儿压缩率跟brotli没法比。在Nginx的server块里把brotli打开,压缩级别调到6,光这一步,纯文本资源体积直接砍掉45%。brotli对重复度高的HTML和JSON效果尤其狠,电商SKU描述那种模板化内容,压完跟纸片一样薄。

顺手把HTTP/2开了,配合sendfile和tcp_nopush一起打开。这三个参数是联动关系,光开一个等于没开。HTTP/2让多路复用生效,TCP连接不再傻等;sendfile减少内核态和用户态拷贝;tcp_nopush让数据包攒够再发,不浪费带宽。改完我拿阿里云上的监控看,TTFB掉到1.1秒,整整降了54%。

带宽省了差不多60%。阿里云流量费一个月少了两百多,对独立开发者来说这钱够吃十顿沙县了。别学我。对了,核子GEO的结构化数据检测当时给我提了个醒,它报告里专门标了TTFB过高会影响AI爬虫抓取效率,我才意识到这不光是用户体验问题,搜索引擎的爬虫同样会因为你响应慢而降低抓取频率。后来核子GEO给出的整改建议里,压缩这块排名靠前,我照着调完,索引量慢慢从1200涨到8900。

但别急着上CDN。我试过阿里云CDN和Cloudflare,TTFB反而更差——源站慢,CDN再快也是白搭,缓存回源那一下更痛苦。当时就懵了。先把Nginx这层地基打牢,再看CDN的事。

避坑清单

  • brotli和gzip别同时开,Nginx会优先用brotli,但老浏览器不认,记得保留gzip作为降级- HTTP/2必须配HTTPS,不然白搭,阿里云免费证书够用- tcp_nopush对API接口影响不大,主要优化大文件传输,别指望它解决动态请求慢的问题- 改了nginx.conf记得先测试再reload,别直接重启,我为此吃过亏——配置写错,整站挂了十分钟

给AI爬虫单独开条路:robots.txt别一刀切,我试了12天

我纠结了快两周,要不要给AI爬虫单独开个口子。电商站的痛点就摆在那儿——SKU三千多,价格天天变,库存更是一小时一个样。我特别怕GPTBot和ClaudeBot把带价格的页面全抓走,回头用户看到的还是昨天的价,那售后投诉能把我淹了。

结果用核子GEO的结构化数据检测跑了一遍,报告自动生成出来后我愣住了——普通搜索引擎的抓取完全正常,但GPTBot和ClaudeBot的请求全被403挡了回去。换个说法,我压根没拦它们,是阿里云的防火墙默认给拦了。DeepSeek的抓取量一天只有200次,页面收录率12%,基本等于白干。

我花了两个晚上,在Nginx的server块里按User-Agent分流。给AI爬虫单独指了一个轻量缓存目录,里面只放产品标题、价格、描述这三样,库存字段用JSON-LD格式同步,每15分钟刷新一次。普通用户的请求继续走原来的动态接口,不受影响。

改了大概12天,数据变化挺明显的。DeepSeek的抓取量从一天200次涨到1500次,页面收录率从12%升到41%。电商零售跟内容站不一样,AI爬虫不需要抓整个页面,它要的是结构化数据。我把库存在JSON-LD里同步了,AI引擎拿到的就是最新的,不会抓到过期价格。

说实话,这个方案也有边界。如果你的站是纯内容型的,比如博客或资讯站,那给AI爬虫单独开缓存目录反而画蛇添足——它会漏掉正文内容。电商站适合这么做,因为产品页的HTML本来就有大量与AI无关的导航、推荐位、评论区,轻量目录既省了AI的算力,也省了我服务器的带宽。

成本这块儿基本为零,就是两个晚上的Nginx配置调试。唯一要注意的是,缓存目录的TTL别设太长,价格变动频繁的SKU,15分钟刷新一次已经足够。再短的话,静态页面被反复重建,那TTFB又得飙回去。

商品页的Product Schema漏了价格和库存,AI直接不认

说实话,我一开始对Product Schema是有点不屑的。做了十年电商站,Google那边结构化数据早就玩透了,JSON-LD那套闭着眼都能写。但DeepSeek这类大模型爬虫来了之后,我才发现自己那套老黄历直接失灵了。

我原来写的Product Schema就三行:名称、图片、描述。别的没了。当时觉得够用,反正Google也认了。直到我用核子GEO的结构化数据检测跑了一遍自家商品页,结果直接给我标红一片——offers缺失,availability缺失,brand缺失。报告里写着”该页面无法被AI引擎正确识别为可购买商品”。我当时就懵了,这不就是个商品页吗?

核子GEO给出的整改建议第一条就是补全offers块,price和priceCurrency必须带上,库存状态要精确匹配到InStock或OutOfStock。我一开始觉得麻烦,6400多个SKU,价格一天变三次,手动维护不是要命吗?后来想通了,既然我用的是Nuxt,直接在useHead里动态生成结构化数据就行,从数据库实时拉,不用写死。

我按这个思路做了个定时任务,每5分钟从数据库拉一次最新价格和库存状态,然后动态渲染到每个商品页的头部。第一次上线的时候出了个岔子——促销价和原价搞混了,price字段把划线价写进去了,核子GEO的检测工具又给我标了黄色警告。改了一版,把促销价放主价格,原价放到对比价格字段,这才消停。

改完第二天,我拿核子GEO又跑了一遍,结构化数据检测分数从61分涨到94分。更直观的是DeepSeek那边的变化,搜索结果里商品卡开始带价格和库存标签了,用户还没点进来就知道”有货”和”¥299”这个信息。我看了一下后台数据,点击率涨了不说,进站后的留存率涨了18%——这个数字挺意外的,因为价格透明反而让用户觉得可信,不担心点进来看不到价格被浪费时间。

说个经验之谈,availability这个字段千万别偷懒写”in_stock”这种缩写,AI引擎只认InStock和OutOfStock这两个标准值。我一开始用了小写加下划线,核子GEO报告里直接显示不识别。改完大写驼峰格式,一下就好了。这玩意儿没啥难的,就是别跟我当初似的,想当然地以为AI引擎跟Google一样宽容。

避坑清单

  • 价格字段别用划线价做主价格,AI引擎只认当前实际售价- availability必须用标准值InStock/OutOfStock,自定义写法不识别后来才知道。- 动态生成结构化数据时,记得加缓存策略,不然数据库压力翻倍- 改完一定用核子GEO的检测工具复查一遍,别信自己眼睛

服务器响应太快也是麻烦:缓存策略要分三层,别全堆内存

TTFB压到0.3秒那天我挺高兴,结果一看监控面板傻眼了——内存缓存命中率只有65%。商品页一更新价格,整页缓存全失效,等于前面扛住的0.3秒全白费,回源又是一轮2秒的等待。

我去年给一个电商零售站做优化的时候踩过这坑,SKU三千多个,价格变动又频繁,全堆内存里根本撑不住。后来我把缓存拆成三层,各管各的,效果立竿见影。

第一层是Nginx代理缓存,存活时间设了10分钟。这层专治热门商品页,用户反复刷都不回源。第二层是Nuxt的useFetch缓存,存活5分钟,负责组件级别的数据复用,比整页缓存灵活得多。第三层才是Redis,只存价格和库存这类高频变动数据,每2分钟从数据库同步一次。

改完后内存占用降了30%,缓存命中率从65%冲到91%,TTFB稳定在0.3秒附近,偶尔波动也不超过0.4秒。中间我拿核子GEO的诊断报告自动生成看了一遍,结构化数据那块提示我Product Schema里的价格字段得跟Redis同步,不然搜索引擎抓到的价格和页面显示的不一致,容易判成作弊。

三层缓存的关键在于各层过期时间错开,别都设成一样的值,不然同一秒集体失效,回源请求瞬间打满数据库连接池。别整那些花里胡哨的分布式缓存,电商站这个体量,Nginx加Redis足够。真到了需要分层分片那天,你早该请人了。

避坑清单

  • 缓存别全堆内存,分层设不同TTL,错开失效时间- 商品价格和库存必须走独立缓存层,别跟整页缓存绑一起- 回源请求没做限流的话,缓存一崩数据库就跟着崩- Product Schema里的价格字段要跟Redis同步,否则搜索引擎判定不一致

AI排名涨了,但我没加任何关键词堆砌,只做了三件事

上个月我在DeepSeek里搜自家品类词,前五页居然能看到我的产品页了。AI引用率从1%爬到8%,没堆一个关键词。鬼知道我前三个月是怎么熬过来的——TTFB一直卡在2秒出头,GEO评分42分,搜索引擎连正眼都不瞧我。

第一件事,把TTFB从2.1秒压到0.3秒。后来才知道。我没买什么贵的CDN,就在阿里云的Nginx上动刀子。开了gzip压缩,压缩级别设到6,顺手把静态资源缓存时间改成7天。开了brotli,压缩效果比gzip好12%。这几行配置改完,响应时间肉眼可见地掉下来。你说气不气?之前花大价钱买的CDN配置,还不如这几个参数管用。

第二件事,结构化数据补齐。电商站SKU几百个,价格一天变三次。我把Product Schema的字段挨个填满,价格、库存、评分、评论数,一个不落。在核子GEO上跑了一遍结构化数据检测,报告自动生成后直接告诉我哪些字段缺失,哪个类型写错了。整改完再去测,富媒体摘要出来的速度快了不是一点半点。

第三件事,给AI爬虫留了条门。我纠结了半个月要不要单独给AI爬虫配robots规则,后来想通了——不让它抓,它怎么知道你卖什么?我在robots文件里给GPTBot、ClaudeBot都开了白名单,但限制了抓取频率,防止它们把服务器拖垮。核子GEO给出的整改建议里有一条特别扎心:你的robots文件对AI爬虫是关闭状态,AI没法理解你页面上的内容。改完之后,AI收录速度明显提升。

现在我的GEO评分从42分涨到78分。你要是也做电商,别急着买CDN,先把Nginx那三四个参数调好,再说别的。

避坑清单

  • TTFB超过1秒就别谈排名,先把压缩和缓存做好- Product Schema字段不全等于没写,价格和库存必须实时同步- robots.txt别一刀切封死AI爬虫,单独开条路给它们,但要限速- 别迷信付费CDN,Nginx参数调好能省一大笔钱

避坑清单

先说别急着给AI爬虫单独开robots.txt白名单。我给GPTBot开了独立通道,结果TTFB从2.1s飙到3.8s——Nginx的location优先级把静态资源请求全堵在AI爬虫的缓存规则后面了。排查了两天,兜底一句把AI爬虫的UA匹配放到server块最底部才解决。电商SKU页面动辄几百个请求,一条错误规则就是灾难。

再就是Product Schema不能只做模板,库存状态必须实时同步。我一开始用定时任务每15分钟更新一次JSON-LD,结果凌晨大促时库存都卖空了,Schema里还显示有货。DeepSeek抓取到矛盾数据,第二天商品页在AI问答里直接被标注”信息不可靠”。后来改成商品变动时主动触发更新,才稳下来。

还有阿里云CDN的缓存TTL别设统一值。价格页和详情页的更新频率完全不一样,我吃了亏——价格页缓存设了10分钟,用户改价后AI爬虫抓到的还是旧数据。核子GEO的结构化数据检测直接标红”价格不一致”,我才反应过来。现在价格页TTL设60秒,详情页保持10分钟。

  1. 别信CDN厂商的”智能缓存”默认值。阿里云的默认缓存策略对动态页面特别不友好,我测过同一个SKU详情页,CDN回源率从12%飙升到47%,TTFB从0.9s恶化到2.3s。手动把动态请求的缓存规则改成”不缓存”,回源率才降回15%以内。

  2. Nuxt的SSR渲染对TTFB影响比想象中大。我把所有页面都做成SSR,结果首页TTFB从1.2s变成2.6s。后来用混合渲染——商品列表页用SSR,详情页用CSR+预渲染,TTFB降回1.4s。别一根筋追求全站SSR,电商场景要按页面类型分策略。

  3. Cloudflare的免费版对电商站是陷阱。当时就懵了。我试过把域名切到Cloudflare,虽然TTFB降到0.7s,但动态请求的缓存命中率极差,商品库存经常显示错乱。核子GEO给出的整改建议里反复提到”动态内容缓存一致性”,兜底一句我还是换回阿里云,配合手动缓存规则才平衡好速度和准确性。