rawgithack域名架构设计分析6个子域与Dev/CDN双URL体系背后的工程智慧【免费下载链接】rawgithackServes files from github, bitbucket and gitlab, but with the correct content types项目地址: https://gitcode.com/gh_mirrors/ra/rawgithackrawgithackrawgit.hack是一个用 nginx 构建的多平台源码文件 CDN 服务它把 GitHub、GitLab、Bitbucket 等仓库里的原始文件代理出来自动补上正确的 Content-Type 头并叠加了本地缓存 全球 CDN 两级缓存。全文将带你拆解它的域名架构设计——6 个子域如何覆盖 5 大平台、Dev/CDN 双 URL 体系如何通过一个正则变量实现差异化缓存策略对想理解 CDN 架构与 nginx 工程实践的初学者非常友好 。一张图看懂6个子域 × Dev/CDN 12 条访问入口rawgithack 的核心思路是一个平台一对子域每个源码平台对应一个「开发子域」Dev短缓存和一个「CDN 子域」CDN永久缓存。子域前缀Dev 子域CDN 子域对应平台回源目标rawraw.githack.comrawcdn.githack.comGitHubraw.githubusercontent.comgistgist.githack.comgistcdn.githack.comGitHub Gistgist.githubusercontent.comglgl.githack.comglcdn.githack.comGitLabgitlab.combbbb.githack.combbcdn.githack.comBitbucketbitbucket.orggtgt.githack.comgtcnd... 即 gtcnd 写作gtcdnGiteagitea.comcbcb.githack.comcbcdn.githack.comCodebergcodeberg.org 平台支持清单详见 README.md为什么按平台拆子域因为不同平台的回源域名、URL 结构、API 差异很大。拆成子域后nginx 只需根据$host就能确定回源目标互不干扰将来要下线或调整某个平台也只动一条规则。一条正则搞定双域名$origin映射的精妙之处打开核心配置文件 rawgithack.conf你会看到一个只有 6 行的map块map $host $origin { ~*^gl(?:cdn)?\.githack\.com$ gitlab.com; ... }亮点在(?:cdn)?这个可选分组Dev 和 CDN 两个子域共用一条正则。12 个子域只写了 6 条规则零重复。同样地判断请求是否来自 CDN 子域也只需一条正则rawgithack.conf 中它被存进变量$is_cdn后续所有缓存策略都基于这个 0/1 开关展开——这就是「双 URL 体系」的配置基石。Dev/CDN 双 URL 体系同一个文件两套缓存哲学这是整个项目最有教学价值的部分。同一个文件路径用户可以选择两种 URL 访问背后的缓存策略完全不同开发 URLDev分钟级生效快速迭代适用于本地调试、Demo 演示推送到分支的改动几分钟内就能反映出来默认缓存仅 60 秒HTML 页面 1 分钟且不共享private如果某个 Dev URL 突然流量暴涨缓存时间会被自动延长到 1 小时——既是保护也是暗示你该换 CDN URL 了CDN URLCDN永久缓存生产可用要求 URL 里使用 tag 或 commit hash 而非分支名URL 本身即版本内容永不变非 HTML 文件直接缓存1 年并带immutable标记浏览器跳过一切协商由于 URL 含精确版本「缓存失效」这个难题被彻底消解了具体策略集中体现在 rawgithack.conf 的$cache_control映射中它是一个「状态 → 缓存策略」的决策表状态组合Cache-Control 策略410 Gone永久缓存Gone 状态永远为 GoneCDN 非 HTML 的 2xx/3xxmax-age31536000, immutableCDN HTMLmax-age86400, privateDev HTMLmax-age60, privateDev 高频命中限流信号max-age3600并允许 stale 续命 1 周隐藏彩蛋用「限流」当「热点探测器」多数人会以为限流是用来挡攻击的但 rawgithack 把它用成了缓存调度信号。看 rawgithack.conflimit_req_zone $origin$uri zonehotfile:10m rate10r/m;再配合主代理块里的limit_req_dry_run on;rawgithack.conf——注意是dry-run 模式限流判定照常执行但绝不真正拒绝请求。限流器只负责把「这个文件最近 10 分钟请求过多」写入$limit_req_status变量而该变量正是上面缓存决策表的输入之一。 这是一招非常聪明的「监控复用」不新增任何探测组件仅靠 nginx 内置的限流状态机就实现了「热点文件自动延长缓存 stale-if-error 兜底 7 天」在高流量下既保护了上游平台又保证了服务快速可靠。缓存一致性三件套锁、后台更新、Purge 接口本地代理缓存proxy_cache之外rawgithack 还叠加了 Cloudflare 全球 CDN。围绕缓存一致性它配了三件套proxy_cache_lockproxy_cache_lock_timeout 35s同一 key 的并发请求只回源一次其余排队避免缓存击穿proxy_cache_background_updateuse_stale updating缓存过期时先返回旧内容后台异步刷新用户无感Purge 接口首页提供的「purge cache」按钮本质是一个仅限DELETE方法的/purge端点rawgithack.conf由内置 Lua 脚本调用 Cloudflare 的按文件清缓存 API且限流为 5 次/分钟防止被滥用对 CDN URL 来说「更新版本」的正确姿势不是清缓存而是把 URL 里的 tag/commit 换成新值——URL 即版本是比任何 Purge 机制都彻底的方案。安全设计防钓鱼确认页与黑名单免费代理服务最大的风险是被拿去托管钓鱼页面。rawgithack 的对策藏在 nginx 变量里rawgithack.conf只拦截浏览器直接打开的 HTML 文档依据Sec-Fetch-Dest: document请求头判定curl、自动化测试、非 HTML 文件完全不受影响首次打开 HTML 会返回 460跳转到一张确认页 web/internal/phishing-notice.html展示真实回源地址用户点「打开」后写入__Http-phishCookie同一仓库 24 小时内不再提示服务端还通过include rawgithack/blacklist*挂接黑名单文件可按仓库封禁另外响应统一携带X-Robots-Tag: none主动让搜索引擎不索引代理内容把「代理」与「托管」的边界划得很清。首页也是架构的一部分URL 转换器打开 web/index.html 的源码会发现首页本身就是一个 URL 工具粘贴任意 GitHub / Bitbucket / GitLab / Gitea / Codeberg 链接前端用一组正则模板即时生成 Dev 和 CDN 两条 githack URL还能一键生成 SRI 哈希。模板表与 nginx 里$origin映射的平台划分严格一致——用户侧的前端转换逻辑和服务器侧的路由映射共用同一套平台心智模型这降低了用户理解成本也让前后端行为永远对齐。写在最后从 rawgithack 域名架构能学到什么 这个项目用一个 nginx 配置文件外加若干 SSI 页面撑起了一个运行十余年的全球 CDN 服务几乎没有传统意义上的「应用代码」。它给架构初学者的启示可以浓缩为四条命名即架构6 个子域 cdn后缀的双域命名把「平台 × 环境」两个维度直接编码进 URL路由只需查表用 map 决策表代替 if-else 堆叠$is_cdn、$origin、$cache_control三张映射表覆盖了绝大多数分支逻辑把监控信号变成调度输入限流 dry-run 状态驱动缓存时长一个变量串起「检测」与「响应」让 URL 承载版本CDN 永久缓存之所以成立靠的是 commit/tag 进 URL而不是复杂的失效协议如果你想深入源码建议从 rawgithack.conf 的主代理块L165-L245读起再对照 README.md 的平台清单一天之内就能吃透这套架构的全部脉络。【免费下载链接】rawgithackServes files from github, bitbucket and gitlab, but with the correct content types项目地址: https://gitcode.com/gh_mirrors/ra/rawgithack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考