千里达票务系统 × 阿里云 OSS/CDN:景区证件照与静态资源存储加速实践
节假日期间,景区票务系统的压力不只来自订单接口,还有海量的静态资源访问:证件照上传与读取、电子票二维码图片、景区图集与宣传物料,每一个游客动作都会触发图片请求。本文以千里达票务系统为例,分享如何用阿里云 OSS + CDN 解决存储成本、访问延迟与带宽占用问题。
一、业务场景与问题
千里达票务系统覆盖实名购票、闸机验票等场景,实践中遇到三类典型问题:
- 证件照读写频繁:实名制购票要求上传证件照,购票高峰每秒数百次上传/读取,应用服务器直存本地磁盘导致磁盘 IO 与带宽双高;
- 图片访问跨地域:游客来自全国各地,单地域存储的图片在高峰期加载慢,影响购票体验;
- 安全合规要求:证件照属于敏感数据,不能公开可读,需要私有访问控制。
二、方案设计:OSS 分层 + CDN 加速
采用"私有 Bucket 存敏感数据 + 公有 Bucket 存静态资源"的两层方案:
| 数据类别 | Bucket 权限 | 访问方式 |
|---|---|---|
| 证件照、实名信息 | 私有读写 | STS 临时凭证 + 签名 URL |
| 电子票二维码、景区图集 | 公有读 | CDN 加速域名 |
| 前端静态资源(JS/CSS/图片) | 公有读 | CDN 加速域名 |
关键配置要点:
- 签名 URL 时效:证件照的读取 URL 有效期设为 5 分钟,防止链接被扩散;
- CDN 缓存规则:图片缓存 30 天、页面 HTML 缓存 5 分钟、动态接口不缓存;
- 防盗链:开启 Referer 白名单,防止图片被外部站点盗用;
- 生命周期管理:3 年前的验票流水图片自动转入低频访问存储(IA),进一步降低成本。
三、关键实现
3.1 生成签名 URL(Python SDK 示例)
import oss2
auth = oss2.StsAuth(access_key_id, access_key_secret, security_token)
bucket = oss2.Bucket(auth, endpoint, "private-bucket")
# 生成5分钟有效的证件照访问URL
url = bucket.sign_url("GET", "cert/20261001/xxxx.jpg", 300)
3.2 CDN 回源配置
在 CDN 加速域名下配置 OSS 为源站,回源协议 HTTPS,并开启缓存预热(节假日前将热门景区图集预热到全国节点)。
四、踩坑复盘
- 缓存命中率低:最初 HTML 页面也被设了 30 天缓存,导致购票页面更新后游客看到旧版本。解决:区分文件类型设置缓存时间;
- 跨域问题:H5 端上传图片直接请求 OSS 报 CORS 错误。解决:在 OSS 控制台配置跨域规则,允许指定域名;
- 大图上传超时:闸机端上传的现场照片过大,直传 OSS 经常超时。解决:前端压缩 + 分片上传(multipart upload);
- 敏感数据泄露风险:曾出现签名 URL 过期时间设置过长被分享的情况。解决:统一收紧到 5 分钟并增加访问日志审计。
五、效果与总结
接入 OSS + CDN 后,图片类请求不再经过应用服务器,带宽成本下降约 60%,全国平均加载时间从 1.2 秒降到 200 毫秒以内。这套"私有 Bucket + 公有 Bucket + CDN 加速"的存储方案,是千里达票务系统在阿里云上稳定支撑多景区业务的基础能力,同样适用于其他涉及图片存储与分发的行业系统。