CyberCDN 使用指南

CyberCDN 是自研的内容分发与边缘缓存平台,给自己的站和业务用。本书讲它是什么、怎么管节点和缓存。对外的公共前端资源加速请看 adminCDN。

wpcy 字体 CORS(双 ACAO)

运维真源:桶 wenpai-wpsss-wpcy → wpcy.m.wptea.com → CyberCDN wpcy_media → 前台 https://wpcy.com 引用 /wpfonts/。 现行策略:A′(边缘停写)。方案 B(清空 OSS CORS)已回滚,不是站立策略。

日期:2026-11-01(Asia/Shanghai)
范围:桶 wenpai-wpsss-wpcy → 自定义域 wpcy.m.wptea.com → CyberCDN OpenResty wpcy_media → 前台 https://wpcy.com 引用 /wpfonts/(local.css / woff2)
状态:现行策略为 A′(边缘停写)。反模式 B(清空 OSS CORS)曾短暂落地并已回滚,不是站立策略。


1. 现象

浏览器控制台报 CORS,拒载例如:

响应头里出现 两条 同值(或同 Origin)的:

Access-Control-Allow-Origin: https://wpcy.com
Access-Control-Allow-Origin: https://wpcy.com

浏览器规范不允许重复的 Access-Control-Allow-Origin,字体会加载失败。

典型页面 Origin:https://wpcy.com(亦可能是 https://www.wpcy.com)。


2. 根因

同一请求上 两层都在写 ACAO:

层 来源 常见伴随头
上游 OSS 桶 CORS 规则 x-oss-*、Access-Control-Allow-Credentials、Access-Control-Expose-Headers: ETag、Access-Control-Max-Age
边缘 CyberCDN wpcy_media 的 cors_origin(OpenResty) server: openresty、x-cybercdn-node、x-cache-status、Timing-Allow-Origin 等

边缘 HIT 时若缓存了「已带双头」的对象,purge 前会继续双 ACAO。

原则(跨 CDN 通用):对同一路径,只让一层负责写出 ACAO。


3. 现行策略 A′(站立)

Feng 批示卡片:t674s3394(留 OSS 完整 CORS;边缘侧停掉重复写入)。

3.1 OSS(保留,不要清)

桶:wenpai-wpsss-wpcy(杭州)

站立 CORS(与备份一致,示例):

现网响应里还可见 Access-Control-Allow-Credentials: true(随 OSS 规则 / 实现透出)。不要为了「只留边缘」而清空桶 CORS。

改桶 CORS 用 devops 管理 profile(现网对象级 AK 通常无桶 CORS 权限):

# 只读示例;改写前先备份
aliyun --profile wenpai oss cors --method get oss://wenpai-wpsss-wpcy

3.2 边缘(推荐实现:只停写)

站点 / 上游名:wpcy_media(OpenResty / CyberCDN)。

推荐 A′ 落地(赑屃现网选择):

  1. 去掉 wpcy_media 上的 cors_origin(边缘不再写入 Access-Control-Allow-Origin 等)。
  2. 不要对上游做 proxy_hide_header Access-Control-*。
    理由:与「留 OSS 完整 CORS」一致;hide 会剥掉 credentials / Expose ETag 等上游头,前台与缓存语义变差。

发边后 purge 各机 wpcy_media 缓存中 KEY 含 /wpfonts/ 的对象(含 dual 缓存路径,若有)。

3.3 验收后期望

带 Origin: https://wpcy.com 的 GET(MISS 与 HIT):


4. 禁止与备选

4.1 禁止当作站立策略:方案 B

B = 清空 OSS 桶 CORS,只靠边缘注入 ACAO。

2026-11-01 曾按旧批示短暂执行 B(备份见 Mac ~/office/wenpai/reports/2026-11-01-wpcy-oss-cors-backup-*.xml),验收曾过;随后按改口 已从备份恢复 OSS CORS,边缘 conf 未按 B 改。

B 不是现行策略。 勿再清桶 CORS,除非 Feng 书面改口并同步本真源。

4.2 备选:边缘拥有 ACAO 时才 hide 上游

仅当产品要求 边缘必须写 ACAO(例如边缘要统一多源、或 OSS 故意无 CORS),才会:

  1. 边缘 cors_origin(或等价)写入单条 ACAO;
  2. 同时 proxy_hide_header 藏上游全部 Access-Control-*,避免双头。

对照历史:admincdn-wpstatic / windfonts 一类「边缘拥有 + hide 上游」。
对当前 wpcy /wpfonts/ 路径,优先 §3.2 停写,而不是 hide。


5. 验收 curl

对象示例(可换成现网任一包路径):

https://wpcy.m.wptea.com/wpfonts/packages/<pack-id>/<file>.woff2
https://wpcy.m.wptea.com/wpfonts/packages/<pack-id>/local.css
# 应恰好 1 行 Access-Control-Allow-Origin
curl -sI -H 'Origin: https://wpcy.com' \
  'https://wpcy.m.wptea.com/wpfonts/packages/wenfeng-syhtcjk/6.woff2' \
  | grep -iE 'HTTP/|access-control-|x-cache-status|x-oss-|server:'

# HIT 复查(按节点 --resolve 或连续两次)
# 期望:ACAO 仍为 1;x-cache-status: HIT

统计 ACAO 行数应为 1(MISS、HIT 都过)。
前台:wenfeng-xxzt/local.css 与样本 woff2 等抽检同理。

OPTIONS:字体主路径走 GET;OPTIONS 行为以现网 OSS/边缘为准,不作为「必须与 GET 同构」的硬门槛,但若改 CORS 后 OPTIONS 异常需记入回执。


6. 责任人

角色 职责
赑屃 边缘 ansible / OpenResty:去掉 wpcy_media 的 cors_origin;发边;按需 purge /wpfonts/
Ops / 白泽 curl 验收(单条 ACAO、MISS/HIT、前台抽检);OSS CORS 只读核对与备份;事故时回滚协调
Foundry 产品文档与站长侧说明;协调批示;不直接改生产 OSS/CDN

生产红线:边缘/OSS 变更需 Feng 原话 + 消息/卡片 id(如 t674s3394);转述不足以 unlock 发边。


7. 相关路径与备份

项 位置
桶 wenpai-wpsss-wpcy
自定义域 / CDN 宿主 wpcy.m.wptea.com
边缘 upstream / 站点 wpcy_media
对象前缀 /wpfonts/(packages、local.css、woff2)
边缘缓存 /var/cache/openresty/wpcy_media(及 dual /opt/openresty-edge/cache/wpcy_media,若存在)
OSS CORS 备份(B 前回滚源) Mac ~/office/wenpai/reports/2026-11-01-wpcy-oss-cors-backup-20261101-105511.xml
双头定位稿 Mac ~/office/wenpai/reports/2026-11-01-wpcy-font-cors-dup.md
B 执行回执(已作废为站立) Mac ~/office/wenpai/reports/2026-11-01-wpcy-oss-cors-clear-B.md

8. 变更记录(摘要)

时间(Asia/Shanghai) 事件
2026-11-01 上午 发现双 ACAO;定位 OSS + wpcy_media cors_origin
同日 曾执行 B(清 OSS CORS + purge);curl 单条 ACAO PASS
同日稍后 改口 A′;OSS 从备份恢复;边缘 conf 未按 B 改
同日 赑屃 A′ 落地选择:仅去 cors_origin,不 hide 上游;发边后 purge /wpfonts/;白泽 curl 验收