记一次诡异的“偶发 404”排查:CDN 回源到 OSS 导致 REST API 失败

记一次诡异的"偶发 404"排查:CDN 回源到 OSS 导致 REST API 失败

现象:接口"有时成功,有时失败"

某天,我们团队突然收到告警:生产环境的一个关键接口:

复制代码
https://ewc-dev.kone.cn/contract/ser/getSerLisContractReviewDOA

出现了 偶发性 404 错误。更诡异的是:

  • curl 调用,第一次成功,第二次失败,第三次又成功......

  • 响应内容时而是 JSON 数据,时而返回一段 XML 错误:

    NoSuchKey The specified key does not exist. xxaixqy.xu.cn contract/ser/getSerLisContractReviewDOA

这看起来像是 OSS(对象存储)的错误响应 ,但我们明明是在调用一个 REST API,怎么会打到 OSS 上?


初步排查:DNS 和证书正常

我们先检查了基础配置:

复制代码
nslookup ewc-dev.kone.cn
# 返回 IP 正常,无异常 CNAME

HTTPS 证书也有效,域名匹配。网络层和 TLS 层都正常。

但问题依旧:请求随机失败


深入分析:从响应头发现线索

使用 curl -I 查看响应头:

复制代码
curl -I https://ewc-dev.kone.cn/contract/ser/getSerLisContractReviewDOA

多次请求后,发现了规律:

成功时的响应头:

复制代码
HTTP/2 200
Content-Type: application/json
X-Cache: HIT FROM CDN
Age: 120
Server: Tengine

失败时的响应头:

复制代码
HTTP/2 404
Content-Type: application/xml
Server: AliyunOSS
X-Oss-Request-Id: 6900938624FA4D30333F2DBE
X-Cache: MISS

关键线索出现了:

  • Server: AliyunOSS → 明确表示这是 OSS 返回的响应
  • X-Cache: MISS → 表示 CDN 缓存未命中,触发了回源
  • Age: 120 → 缓存已存在 120 秒

结论:这个请求本应由后端服务处理,但却被 CDN 回源到了 OSS!


根本原因:CDN 源站配置错误

我们登录阿里云控制台,查看 xxaixqy.xu.cn 的 CDN 配置:

配置项 当前值
源站类型 OSS
源站地址 ewc-dev.oss-cn-shanghai.aliyuncs.com

问题找到了!

CDN 的源站被错误地配置为了 OSS Bucket,而不是后端应用服务器。

这意味着:

  • 当 CDN 缓存命中时 → 返回之前缓存的 JSON 响应 → ✅ 成功
  • 当 CDN 缓存未命中时 → 回源到 OSS → OSS 把 /contract/ser/... 当作文件路径查找 → 找不到 → 返回 NoSuchKey → ❌ 失败

这就是"偶发性成功"的根源。


为什么会出现这种错误配置?

进一步调查发现:

  • xxaixqy.xu.cn 最初是用于部署前端静态资源的,因此 CDN 源站指向了 OSS。
  • 后来,开发团队为了方便,直接复用了这个域名作为后端 API 的入口
  • 但没有修改 CDN 源站,导致所有 API 请求都被当作静态资源处理。

解决方案

  1. 修改 CDN 源站:将源站从 OSS 改为后端服务地址(SLB 或网关)
  2. 拆分域名 (推荐):
    • 静态资源:static-dev.kone.cn → 指向 OSS
    • REST API:api-dev.kone.cn → 指向 SLB
  3. 设置合理的缓存策略:对只读接口可缓存,写操作不缓存

它提醒我们:

在微服务和 CDN 普及的今天,我们不仅要关注代码逻辑,更要理解流量背后的每一跳。

一个小小的配置错误,就可能导致"玄学故障"。只有深入底层,才能真正解决问题。

如果你也遇到过类似的"偶发故障",欢迎在评论区分享你的排查经历!

相关推荐
咩咩啃树皮6 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚6 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
Linux-18746 小时前
分布式链路追踪系统之docker-compose安装skywalking
云原生·docker-compose·skywalking·分布式链路追踪系统·应用程序性能监控
大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司8 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地9 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun3141599 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风12 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
隔窗听雨眠12 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程