200cdn.xyz
源站测试站点(静态 + 动态)

CDN 联调测试清单

你可以按下面顺序验证:解析 → 接入 → 回源 → 缓存 → Header → 静态资源加速。

1) DNS 解析

确认 200cdn.xyz 已解析到 CDN 接入域名(CNAME)或节点 IP(A)。

建议:dig 200cdn.xyznslookup 200cdn.xyz

2) 回源连通

访问首页 /,确认能看到页面;再访问接口:

3) Header 注入

访问 /api/headers/api/headers/forwarded-check,观察是否存在:

  • X-Forwarded-For / X-Forwarded-Host / X-Forwarded-Proto
  • Via / X-Cache / 自定义节点标识(视你的 CDN 实现而定)
4) 缓存验证

访问 /cacheable/a 两次,对比:

  • 是否命中缓存(CDN 侧 HIT)
  • 源站日志/回源次数是否减少
  • 响应头中的 Age / X-Cache 等是否变化
5) 静态资源

打开 /gallery,检查 CSS/JS/图片资源是否能正常加载;再在 CDN 配置静态缓存规则观察加速效果。

6) FastCGI(CDN 网站设置)

本仓库提供 fastcgi_root/*.php,需在源站安装并启动 php-fpm(建议端口 9070,避免与 Flask 9000 冲突)。

在 CDN 后台 网站设置 → FastCGI 配置地址与 DOCUMENT_ROOT / SCRIPT_FILENAME 后,用 curl 访问 /fcgi/index.php(或你绑定的路径)应返回 JSON,且 fromphp-fpm-fastcgi

完整字段级验证步骤见仓库内文档:docs/FASTCGI_CDN_VERIFY.md

7) 源站超时等待上限

打开 /origin-timeout/ui,设置“最大等待时长”,再用探针模拟源站慢响应。

  • POST /origin-timeout/admin/set?wait=8s 设置等待预算
  • GET /origin-timeout/probe?originDelay=12s 当 delay > wait 时返回 504
7.1) 源站读取超时 / 并发 / 自动重试(更多设置字段)
  • GET /origin/timeout/read?ms=8000:首包延迟,用于 ReadTimeout
  • GET /origin/conn/hold?ms=15000 + /origin/conn/status:并发/空闲连接压测
  • GET /origin/flaky?key=demo&fail=2&code=502:前2次失败后成功,用于自动重试 50X/40X
  • GET /lb/tcp-udp/status:查看 connectFailPort(连接后立即断开),用于“连接失败/快速失败”验证
8) TCP/UDP 负载均衡回源验证

先访问 /lb/tcp-udp/status 获取端口(默认 TCP 10001、UDP 10002)。

  • echo 'ping' | nc -w 2 源站IP 10001(TCP)
  • echo -n 'ping' | nc -u -w 2 源站IP 10002(UDP)
9) Sticky 调度算法(三种参数)

在控制台把调度算法改为 Sticky 后,依次测试 Cookie / HTTP Header / URL 参数:

  • curl -s -c - http://200cdn.xyz/sticky/cookie
  • curl -s -H "X-Sticky-Key: user-a" http://200cdn.xyz/sticky/header
  • curl -s "http://200cdn.xyz/sticky/url?sticky_key=user-a"

同一参数值应返回同一 bucket,用于验证粘滞调度键是否稳定生效。

10) 回源跟随(Follow Origin Redirect)

用于验证“回源跟随”开关是否生效(单跳/多跳)。

  • curl -sI "http://200cdn.xyz/origin-follow/start?code=302&hops=1"
  • curl -sI "http://200cdn.xyz/origin-follow/start?code=302&hops=3"
  • curl -sL "http://200cdn.xyz/origin-follow/start?code=302&hops=3"(跟随到 final)
  • curl -sI "http://200cdn.xyz/origin-follow/compare?expected=on&hops=3"
  • curl -sI "http://200cdn.xyz/origin-follow/compare?expected=off&hops=3"

与 yuanzhan 对齐覆盖(新增)

以下路径用于一一对照 CDN 功能:缓存、图片/视频、压缩编码、重定向、CORS、流式、上传。

# Range 边界
curl -sI -H "Range: bytes=0-15" http://200cdn.xyz/range/binary
curl -sI -H "Range: bytes=0-1023" http://200cdn.xyz/media/video.mp4.range

# Range 严格边界矩阵(推荐都跑一遍)
# 1) 正常:首段 / 开区间 / 尾部区间(suffix-range)
curl -sI -H "Range: bytes=0-99" http://200cdn.xyz/range/strict
curl -sI -H "Range: bytes=100-" http://200cdn.xyz/range/strict
curl -sI -H "Range: bytes=-200" http://200cdn.xyz/range/strict

# 2) 越界 / 非法:应返回 416,并带 Content-Range: bytes */TOTAL
curl -sI -H "Range: bytes=9999999-10000000" http://200cdn.xyz/range/strict
curl -sI -H "Range: bytes=10-1" http://200cdn.xyz/range/strict
curl -sI -H "Range: items=0-10" http://200cdn.xyz/range/strict
curl -sI -H "Range: bytes=0-0,2-3" http://200cdn.xyz/range/strict

# 3) HEAD + Range:应返回 206,且包含 Content-Range/Content-Length
curl -sI -X HEAD -H "Range: bytes=0-15" http://200cdn.xyz/range/strict

# 4) If-Range(ETag 命中 -> 206;不命中 -> 忽略 Range 返回 200)
curl -sI -H 'If-Range: "200cdn-range-v1"' -H "Range: bytes=0-15" http://200cdn.xyz/range/strict
curl -sI -H 'If-Range: "not-match"' -H "Range: bytes=0-15" http://200cdn.xyz/range/strict

# 5) If-Range(HTTP-date 命中/不命中)
curl -sI -H "If-Range: Sat, 01 Jun 2024 12:00:00 GMT" -H "Range: bytes=0-15" http://200cdn.xyz/range/strict
curl -sI -H "If-Range: Sat, 01 Jun 2022 12:00:00 GMT" -H "Range: bytes=0-15" http://200cdn.xyz/range/strict

# 6) If-Match / If-None-Match + Range 组合
curl -sI -H 'If-Match: "200cdn-conditional-v1"' -H "Range: bytes=0-31" http://200cdn.xyz/range/conditional
curl -sI -H 'If-Match: "not-match"' -H "Range: bytes=0-31" http://200cdn.xyz/range/conditional
curl -sI -H 'If-None-Match: "200cdn-conditional-v1"' -H "Range: bytes=0-31" http://200cdn.xyz/range/conditional
curl -sI -H 'If-None-Match: "not-match"' -H "Range: bytes=0-31" http://200cdn.xyz/range/conditional

# 7) 301/302 + Range 继承(观察 CDN 是否透传 Range 到跳转后的请求)
curl -sI -H "Range: bytes=0-31" http://200cdn.xyz/redirect/range/301
curl -sI -L -H "Range: bytes=0-31" http://200cdn.xyz/redirect/range/301
curl -sI -L -H "Range: bytes=0-31" http://200cdn.xyz/redirect/range/302
curl -sI -L -H "Range: bytes=0-31" http://200cdn.xyz/redirect/range-hop/302

# ETag / 304
etag=$(curl -sI http://200cdn.xyz/cache/etag | tr -d "\r" | awk -F": " "/^ETag:/{print $2;exit}")
curl -sI -H "If-None-Match: $etag" http://200cdn.xyz/cache/etag

# Last-Modified / 304
curl -sI -H "If-Modified-Since: Sat, 01 Jun 2024 12:00:00 GMT" http://200cdn.xyz/cache/lastmodified

POST 回显(用于调试请求体和头)

把请求 JSON 发到 /api/echo,源站会把解析结果回显出来。

curl -s -X POST http://200cdn.xyz/api/echo \\
  -H 'Content-Type: application/json' \\
  -d '{"name":"cdn-test","n":1}' | jq