当前位置: 首页 > news >正文

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

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

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

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

https://ewc-dev.kone.cn/contract/ser/getSerLisContractReviewDOA

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

  • curl 调用,第一次成功,第二次失败,第三次又成功……
  • 响应内容时而是 JSON 数据,时而返回一段 XML 错误:
<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><HostId>xxaixqy.xu.cn</HostId><Key>contract/ser/getSerLisContractReviewDOA</Key>
</Error>

这看起来像是 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 普及的今天,我们不仅要关注代码逻辑,更要理解流量背后的每一跳。

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

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

http://www.dtcms.com/a/540712.html

相关文章:

  • C++笔记(面向对象)类模板
  • Selenium IDE下载和安装教程(附安装包)
  • Quartz框架实现根据设置的cron表达式进行定时任务执行
  • linux20 线程同步--信号量
  • 内核的文件预取逻辑及blockdev的相关配置
  • [特殊字符] Web 字体裁剪优化实践:把 42MB 字体包瘦到 1.6MB
  • 平滑过渡,破解多库并存:浙人医基于金仓KFS的医疗信创实战解析
  • 做经营性的网站需要注册什么条件网站构思
  • Answer企业社区实战:零成本搭建技术问答平台,远程协作效率提升300%!
  • “听书”比“看书”更省力?
  • 大连 手机网站案例网站定位方案
  • window安装MYSQL5.5出错:a windows service with the name MYSQL alreadyexists....
  • 珠海做网站报价影响网站排名的因素
  • 6.1.2.2 大数据方法论与实践指南-离线任务SQL 任务开发规范
  • Java 大视界 -- Java 大数据在智能交通高速公路收费系统优化与通行效率提升实战(429)
  • 网站可以做怀孕单吗平面设计图数字标识
  • 图神经网络入门:手写一个 VanillaGNN-从邻接矩阵理解图神经网络的消息传递
  • 网站模版带后台酒类招商网站大全
  • 营销型网站创建网页制作三剑客通常指
  • 【笔试真题】- 电信-2025.10.11
  • 云渲染与传统渲染:核心差异与适用场景分析
  • 什么是流程监控?如何构建跨系统BPM的实时监控体系?
  • 直通滤波....
  • eclipse做网站代码惠州市
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十五)Redis模块-Redis主从复制
  • 视频网站自己怎么做的正规的大宗商品交易平台
  • vue3 实现贪吃蛇手机版01
  • 胶州网站建设dch100室内装修设计师工资一般多少钱
  • 计算机视觉、医学图像处理、深度学习、多模态融合方向分析
  • 小白入门:基于k8s搭建训练集群,实战CIFAR-10图像分类