CDN核心原理完整揭秘:5分钟用 http_study 搭建反向代理,追踪 X-Forwarded-For 头链条

发布时间:2026/8/22 14:04:07
CDN核心原理完整揭秘:5分钟用 http_study 搭建反向代理,追踪 X-Forwarded-For 头链条 CDN核心原理完整揭秘5分钟用 http_study 搭建反向代理追踪 X-Forwarded-For 头链条【免费下载链接】http_studyfollow me to study http项目地址: https://gitcode.com/gh_mirrors/ht/http_studyCDN内容分发网络的本质就是反向代理 缓存而它记录客户端真实信息的秘密武器正是 X-Forwarded-For 请求头。本文用 http_study 这个 OpenResty 实战环境帮你在本地 5 分钟搭起一套「模拟 CDN → 源站」的反向代理亲眼追踪 X-Forwarded 头链条是如何一层层传递的彻底搞懂 CDN 转发原理。一、CDN 为什么离不开反向代理想象你访问一个网站客户端浏览器 ──► 边缘节点CDN反向代理──► 源站服务器边缘节点离用户更近收到请求后有两种选择命中缓存就直接返回未命中就转发给源站转发时源站看到的 IP 是 CDN 节点的 IP用户的真实 IP 丢失了。为了解决这个问题CDN 在转发请求时会主动加上几个请求头把我是谁、我经过了哪里写进去这就是X-Forwarded 头链条。搞清楚这条链CDN 的原理就理解了一大半。 http_study 就是一个为《透视HTTP协议》配套的 HTTP 学习沙箱用 OpenResty 在本地模拟出「接入层 缓存代理 源站」三层结构非常适合新手动手实验。二、环境准备快速拉起 http_study 实验环境克隆仓库后有两种启动方式方式 1Docker最省事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方式 2本地 OpenResty在www/目录下执行./run.sh start即可支持 start / stop / reload / list 四个命令见 run.sh。⚠️ 关键一步把 hosts 文件内容追加到系统的 /etc/hosts否则 OpenResty 会解析失败。hosts 文件将三个域名都指向 127.0.0.1www.chrono.com接入层、www.metroid.net、origin.io源站。三、3 步看懂反向代理是如何配置的第 1 步接入层接收请求接入层配置在www/conf/http/servers/http.conf监听 80/8080 端口server_name 为www.chrono.com并 include 了核心路由文件 locations.inc。第 2 步/proxy/ 路由负责转发 加头这是全文最核心的配置位于www/conf/http/servers/locations.inc的/proxy/locationlocation /proxy/ { internal; add_header Via $host:$server_port; proxy_set_header X-Real-IP $remote_addr:$remote_port; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://origin.io; }注意最后一行proxy_pass http://origin.io;——这就是反向代理的灵魂把请求原样转发给源站同时用proxy_set_header把客户端信息打包进请求头。第 3 步源站把收到的头原样回显源站配置在www/conf/http/servers/origin.conf只监听 80 端口、只允许 127.0.0.1 访问并拒绝其他来源模拟真实源站只信任 CDN 内网的做法。其响应内容由www/lua/origin.lua生成逻辑非常简单——读取请求里的 4 个 X 头并打印出来相当于给新手装了一台透视镜。四、动手实验一条 curl 命令追踪头链条启动环境后在浏览器或终端访问http://www.chrono.com/proxy/源站会回显类似这样的内容HTTP Original Server ID is 6521 X-Real-IP 127.0.0.1:51234 X-Forwarded-For 127.0.0.1 X-Forwarded-Host www.chrono.com X-Forwarded-Proto http 恭喜你已经完成了一次完整的CDN 转发实验。来拆解一下每个头的含义请求头含义上面的值说明X-Real-IP直连客户端的真实 IP本机 curl所以是 127.0.0.1X-Forwarded-For经过的代理链核心中的核心只有 1 跳所以只有 1 个 IPX-Forwarded-Host客户端请求的 Hostwww.chrono.comX-Forwarded-Proto客户端使用的协议http/https本机是 http什么是头链条假设请求经过了 2 级 CDNX-Forwarded-For 的值就会变成客户端IP, 一级CDN的IP, 二级CDN的IP——每级代理都往末尾追加一个 IP。这就是为什么proxy_set_header里用的是$proxy_add_x_forwarded_for追加而不是直接赋值。 实际排查中源站取第一个 IP通常是真实用户取最后一个则是最靠近源站的那级代理。这个细节在很多 CDN 厂商的文档里都会反复出现。五、进阶玩法一键开启代理缓存体验真正的 CDNhttp_study 还准备了/proxy_cache/路由只需 3 行配置就变身缓存型 CDN同样在 locations.inc 中location /proxy_cache/ { internal; proxy_cache www_cache; proxy_pass http://origin.io; header_filter_by_lua_file lua/cache_filter.lua; }其中www_cache缓存区定义在www/conf/http/cache.conf。访问http://www.chrono.com/proxy_cache/时lua/cache_filter.lua会在响应里额外加上 3 个头X-CacheHIT命中缓存或MISS回源取回X-Accel请求经过的节点名X-Hit实时缓存命中率用共享内存统计。连续访问两次第一次 MISS、第二次 HIT——这就是 CDN就近命中缓存、减少回源的全部秘密。六、新手常见问题 FAQQ1为什么不直接用 X-Forwarded-For 取用户 IP因为它可以被客户端伪造你 curl 时手动加上就会被追加。所以生产环境会用ngx_http_realip_module或信任链机制只信任最后一跳代理写入的值。Q2Via 头和 X-Forwarded 头什么关系Via 记录请求经过的代理服务器响应头里也能看到X-Forwarded 记录客户端的上下文信息两者是互补的。Q3X- 前缀的头不正规吗确实RFC 6648 已建议弃用 X- 前缀但出于兼容性考虑业界至今仍在用标准组织也计划将其正式标准化。Q4日志里怎么利用 X-Forwarded-For看www/conf/http/common.conf中的 log_format$http_x_forwarded_for已被写进访问日志方便按真实用户 IP 统计与排障。七、总结5 行话回顾 CDN 核心原理CDN 边缘节点 反向代理 本地缓存/proxy/与/proxy_cache/两套路由转发时通过proxy_set_header注入X-Real-IP / X-Forwarded-For / Host / ProtoX-Forwarded-For 每经过一级代理追加一个 IP形成头链条缓存命中HIT直接返回未命中MISS回源cache_filter.lua可实时观测命中率http_study 把这三层拆得清清楚楚是理解 CDN/反向代理的最佳入门沙箱。本文涉及的核心文件清单相对仓库根目录www/conf/http/servers/locations.inc—— 反向代理与代理缓存路由全文核心www/conf/http/servers/origin.conf—— 源站配置www/lua/origin.lua—— 源站回显 X-Forwarded 头的透视镜www/conf/http/cache.conf—— 代理缓存区定义www/lua/cache_filter.lua—— X-Cache / X-Hit 命中率统计www/conf/http/common.conf—— 日志格式含 x_forwarded_forhosts—— 本地域名映射文件www/run.sh—— 一键启动脚本【免费下载链接】http_studyfollow me to study http项目地址: https://gitcode.com/gh_mirrors/ht/http_study创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考