
如何自己动手做一个迷你CDNhttp_study之Nginx proxy_cache缓存完整实战【免费下载链接】http_studyfollow me to study http项目地址: https://gitcode.com/gh_mirrors/ht/http_studyhttp_study是《透视HTTP协议》的配套开源项目基于 OpenRestyNginx 的 Lua 版增强体带你从零搭建一个可实测的迷你 CDN用 Nginx 的proxy_cache代理缓存把回源流量挡在边缘配合共享内存统计实时缓存命中率。本文带你完整走一遍环境准备 → 配置 CDN 缓存 → 验证 HIT/MISS的全流程。什么是迷你CDN缓存原理一图看懂真实 CDN 的本质是边缘节点缓存源站内容用户就近访问缓存副本。http_study 用一台机器模拟了这套架构角色域名职责CDN 边缘节点www.chrono.com接收用户请求proxy_cache缓存命中则直接返回源站Originorigin.io生成带服务器 ID的内容只有缓存未命中时才会被打到 两个域名都解析到127.0.0.1见项目根目录hosts文件用本地回环 域名区分模拟真实的边缘 源站部署这正是理解 CDN 最快的方式。环境准备最快启动 OpenResty 环境项目内置 Docker 方案基于 ubuntu 18.04 openresty 1.17.8.2两种启动方式任选其一方式一Docker 一键启动推荐新手git clone https://gitcode.com/gh_mirrors/ht/http_study cd http_study docker pull chronolaw/http_study docker run -it --rm chronolaw/http_study bash # 容器内执行 cat ~/http_study/hosts /etc/hosts cd ~/http_study/www ./run.sh start方式二本机 OpenResty# 将项目根目录 hosts 文件中的域名追加到 /etc/hosts cd http_study/www ./run.sh start # 封装了 openresty 启动见 www/run.sh启动后访问http://www.chrono.com能看到欢迎页说明 CDN 节点就绪 ✅核心配置详解proxy_cache 三步开启缓存整个迷你 CDN 的缓存能力由三处配置协作完成配置总入口是www/conf/nginx.conf自动 includewww/conf/http/下所有 conf。第 1 步声明缓存区域cache zone文件www/conf/http/cache.conf# 缓存区域磁盘目录 cache 64k 共享内存索引10 秒未访问即清理 proxy_cache_path cache keys_zonewww_cache:64k inactive10s; proxy_cache_lock on; # 并发回源只放一个请求其余等待复用 proxy_cache_revalidate on; # 缓存过期后先条件请求验证减少无效回源 proxy_force_ranges on; # 支持 Range 分片读取大文件第 2 步CDN 节点开启缓存代理文件www/conf/http/servers/locations.inc中的/proxy_cache/段location /proxy_cache/ { internal; # 内部 location只能被 ngx.exec 跳转进来 proxy_cache www_cache; # 挂上第 1 步定义的缓存区 proxy_cache_use_stale error timeout; # 源站出错/超时时返回旧缓存保命关键 proxy_pass http://origin.io; # 未命中时回源 }对比同文件中的/proxy/段——它只有proxy_pass没有proxy_cache正好可以演示开缓存 vs 不开缓存的差异非常适合做对照实验 第 3 步源站配合发送缓存响应头源站定义在www/conf/http/servers/origin.conf响应逻辑在www/lua/origin.lua。关键行为URI 中含cache时源站返回Cache-Control: public, max-age10, s-maxage30和ETag告诉 CDN缓存我 30 秒每个域名首次回源时生成一个 ID取当前时间戳后 4 位30 秒内保持同一 ID——ID 不变即证明你命中了缓存。动手验证用 curl 亲眼看到 MISS → HIT测试入口是两个 Lua 脚本通过curl 域名/脚本名触发入口脚本行为http://www.chrono.com/21-1www/lua/21-1.lua内部跳转到/proxy/纯代理、不走缓存http://www.chrono.com/22-1www/lua/22-1.lua内部跳转到/proxy_cache/走 proxy_cache 缓存连续两次请求 22-1观察响应头curl -I http://www.chrono.com/22-1 # X-Cache: MISS ← 首次回源拿到 ID 例如 ID is 3719 curl -I http://www.chrono.com/22-1 # X-Cache: HIT ← 缓存命中ID 保持不变源站零压力响应头由www/lua/cache_filter.lua在 header_filter 阶段注入它做了三件很专业的事X-Cache输出 Nginx 原生的upstream_cache_statusHIT/MISS/STALE…X-Accel标记请求命中的是哪台 CDN 节点真实 CDN 靠它做多节点排障X-Hit利用www/conf/http/resty.conf中定义的misc共享内存字典lua_shared_dict misc 64k累加总请求数和 HIT 数实时算出缓存命中率百分比——这是生产 CDN 监控的最小实现。再看源站侧logs/origin_access.log缓存生效期间日志不再增长说明回源请求被边缘成功拦截 常见坑与调优清单❌忘了配 hostsorigin.io无法解析OpenResty 直接解析失败origin.conf顶部有醒目注释提醒❌源站不发 Cache-Control/ETagproxy_cache默认只缓存 200/204/301/302 且无缓存头的响应 0 秒等于没缓存✅命中率低调大s-maxage或按 URI 用proxy_cache_key优化缓存键✅源站宕机页面全挂保留proxy_cache_use_stale error timeout让旧缓存续命✅回源风暴proxy_cache_lock on保证同一 key 并发只回源一次。小结这套迷你CDN教会了什么用不到 30 行核心配置http_study 就把真实 CDN 的骨架完整复刻了一遍proxy_cache_path定义缓存区域内存索引 磁盘文件proxy_cache把代理 location 挂到缓存区配合use_stale做可用性兜底缓存响应头Cache-Control / ETag决定缓存多久、如何验证共享内存 响应头实现命中率观测。掌握这套流程后把proxy_pass指向你的真实源站你就拥有了第一台属于自己的 CDN 节点。想继续深挖可以结合项目wireshark/目录下的抓包文件如21-1.pcapng、22-1相关报文观察回源请求在协议层的真实流转。【免费下载链接】http_studyfollow me to study http项目地址: https://gitcode.com/gh_mirrors/ht/http_study创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考