源站与缓存
网站的源站池与源站组、健康检查与会话保持、回源连接与请求体上限、缓存规则、缓存键、PURGE 方法、X-Cache 与字符编码、集群的缓存区,以及刷新与预热。
概念
| 术语 | 定义 |
|---|---|
| 源站池 | 一个网站的全部源站,以及负载均衡、健康检查、超时和长连接设置。每个网站一个源站池。 |
| 主源 / 备用源 | 未打开「备用」的源站为主源,按负载均衡策略接收流量;备用源只在全部主源不可用时接收流量。 |
| 源站组 | 源站上的分组标签,空为默认组。请求默认只发往默认组;「源站覆盖」规则可把请求发往其他组。 |
| 缓存规则 | 按列表顺序匹配的规则,决定响应是否缓存及缓存多久。 |
| 缓存键 | 区分缓存对象的请求属性组合,对网站的全部缓存规则生效。 |
| 缓存代数 | 网站级计数器,属于缓存键的一部分。旧版控制台的「清除缓存」会使其加一;现在整站清除是节点任务,计数器不再变化。 |
| 缓存标签 | 源站在响应头 Cache-Tag 中给出的标签;按标签刷新只刷新带该标签的缓存对象。 |
| 缓存区 | 节点存放缓存对象的磁盘目录与其索引。每个集群一个设置,节点可单独覆盖容量。 |
配置源站
-
打开 网站,选择网站,进入「源站」页签。
-
在「源站」卡片中修改已有源站,或点击「添加源站」。
-
填写「源站地址」「端口」「回源协议」「权重」;按需填写「回源 Host」「SNI」「源站组」,按需打开「备用」「S3 签名」。
-
点击卡片底部的「保存」。控制台提示「已保存,版本 #N」。
-
验证:节点应用该版本后,经节点访问网站:
curl -sI -H 'Host: www.example.com' http://<节点 IP>/返回源站的状态码;有流量后,源站旁显示「正常」。
源站字段
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 源站地址 | 主机名或 IPv4/IPv6 字面量,不含端口和方括号,最长 253 字符 | 无 | 回源目标,受源站地址限制约束 |
| 端口 | 1–65535 | HTTP 80,HTTPS 443 | 回源端口;切换协议时,80 与 443 随之互换 |
| 回源协议 | HTTP / HTTPS | HTTP | 节点到源站的协议 |
| 权重 | 1–100 | 1 | 三种负载均衡策略共用的权重 |
| 回源 Host | 主机名或 IP,可带端口;IPv6 带端口时写成 [2001:db8::1]:8443,不带端口时不加方括号;最长 259 字节 | 空(跟随请求) | 发往源站的 Host。空:访问者请求的 Host(小写、去端口);S3 源站为源站地址,端口不是 80(HTTP)或 443(HTTPS)时带端口 |
| SNI | 主机名 | 空(跟随回源 Host) | 仅 HTTPS。空:回源 Host(去端口),再为空时用源站地址;源站地址为 IP 字面量时不发送 SNI |
| 源站组 | 1–32 个小写字母、数字、_ 或 - | 空(默认组) | 见源站组 |
| 备用 | 开 / 关 | 关 | 设为备用源 |
| S3 签名 | 开 / 关 | 关 | 用 AWS Signature V4 签名回源请求,见 S3 兼容对象存储 |
每个网站 1–32 个源站,至少一个在默认组。
源站池设置
「源站池设置」卡片单独保存,其中还有主动健康检查与会话保持。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 负载均衡 | 加权随机 / 轮询 / 一致性哈希 | 加权随机 | 主源之间的选择策略 |
| 校验源站证书 | 开 / 关 | 开 | 校验 HTTPS 源站证书,见回源 TLS |
| WebSocket | 开 / 关 | 开 | 透传 WebSocket 升级请求 |
| 回源 HTTP 版本 | HTTP/1.1 / HTTP/2 | HTTP/1.1 | 节点请求源站用的 HTTP 版本,见 HTTP/2 与 gRPC |
| gRPC | 开 / 关 | 关 | 以 HTTP/2 端到端转发 gRPC 请求;「回源 HTTP 版本」为 HTTP/2 时才能打开 |
| 失败次数 | 1–100 | 3 | 连续失败达到该值后标记源站不可用 |
| 恢复时间(秒) | 1–3600 | 30 | 标记不可用后多久再次尝试 |
| 回源重试:尝试次数 | 1–5 | 3 | 每个请求最多尝试的源站数,见负载均衡与重试 |
| 回源重试:源站返回 502 / 503 / 504 时重试 | 开 / 关 | 开 | 关闭后源站的 502/503/504 响应直接返回访问者,连接失败与超时仍重试 |
| 超时(秒):连接 | 0.1–120 | 10 | 建立连接的超时 |
| 超时(秒):发送 | 0.1–3600 | 60 | 向源站发送请求的超时 |
| 超时(秒):读取 | 0.1–3600 | 60 | 读取响应的超时;不作用于已升级的 WebSocket 连接 |
| 回源长连接:启用 | 开 / 关 | 开 | 复用到源站的连接 |
| 回源长连接:空闲时间(秒) | 1–3600 | 60 | 空闲连接保留时间 |
| 回源长连接:最大请求数 | 1–100000 | 1000 | 单个连接处理的最大请求数 |
配置阶段的规则可按请求覆盖三项超时与「WebSocket」,见覆盖设置。
负载均衡与重试
| 策略 | 行为 |
|---|---|
| 加权随机 | 按权重随机选择;重试按权重顺序选择未尝试过的源站 |
| 轮询 | 平滑加权轮询(与 nginx 相同的算法),每个 worker 独立计数 |
| 一致性哈希 | 按原始请求 URI(路径加查询)哈希,同一 URI 固定到同一源站;一个源站不可用时只有映射到它的 URI 改选其他源站 |
| 项目 | 行为 |
|---|---|
| 尝试次数 | 每个请求最多尝试「尝试次数」个源站(默认 3) |
| 触发重试 | 连接失败、超时(含 TLS 握手失败);打开「源站返回 502 / 503 / 504 时重试」时还包括源站返回 502/503/504 |
| 不重试 | POST、LOCK、PATCH 请求发出后不重试;PUT、DELETE 会重试 |
| 重试范围 | 只在当前可用的一组源站内:有健康主源时只在健康主源之间;全部主源不可用时使用备用源;不在同一请求内切换 HTTP 与 HTTPS 源站 |
| 剔除 | 域名解析失败、解析结果全部为特殊用途地址或缺少 S3 凭据的源站在尝试前剔除,实际尝试次数可能少于「尝试次数」 |
被动健康检查
不发送探测请求;健康状态只由真实流量判断。打开主动健康检查后两者合并,见合并规则。
| 项目 | 行为 |
|---|---|
| 计为失败 | 连接失败、超时、源站返回 502/503/504(关闭状态码重试时同样计入)、域名解析失败、解析结果全部为特殊用途地址、缺少 S3 凭据、校验证书时节点缺少 CA 文件 |
| 清零 | 其他任何响应清零失败计数 |
| 标记不可用 | 连续失败达到「失败次数」后,在「恢复时间」内不被选中 |
| 恢复 | 恢复时间结束后重新接收流量;一次成功即恢复健康,再失败一次立即重新标记为不可用 |
| 失败开放 | 全部源站不可用时仍按主源、备用源的顺序尝试 |
| 共享范围 | 同一节点的所有 worker 共享健康状态;各节点独立判断 |
| 上报 | 节点随心跳上报(默认每 15 秒);「源站」页签显示「{down}/{total} 个节点不可用」和最后一次错误,每个节点的结果标出来源「被动」或「主动」 |
| 错误码 | 界面显示 |
|---|---|
connect_failed | 无法连接源站 |
timeout | 源站响应超时 |
upstream_status | 源站返回 HTTP {status}(被动检查:仅源站自身返回 502/503/504;主动检查:不在期望范围内的状态码) |
dns_failed | 无法解析 {host} |
address_forbidden | {address} 是特殊用途地址,不在源站地址允许清单内 |
tls_failed | TLS 握手或证书校验失败 |
错误码需要节点 proto v0.2.1 及以上;其他错误和更早的节点显示节点上报的原文。
主动健康检查
- 在「源站」页签的「源站池设置」卡片中,打开「主动健康检查」的「启用」。
- 填写「路径」,选择「方法」,按需修改其他字段。
- 点击卡片底部的「保存」。
- 验证:令一个源站的检查路径返回期望范围以外的状态码;约「间隔 × 不健康阈值」秒后,该源站显示「{down}/{total} 个节点不可用」,节点结果标为「主动」,请求不再发往它。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 启用 | 开 / 关 | 关 | 关闭时保留填写的值 |
| 路径 | 以 / 开头,可带查询,1–1024 个可打印 ASCII 字符,不含空格 | / | 探测请求的路径 |
| 方法 | GET / HEAD | GET | 探测请求的方法 |
| 状态码下限 / 上限 | 100–599,下限不大于上限 | 200 / 399 | 范围内的状态码为成功 |
| Host | 主机名 | 空(跟随回源 Host) | 探测请求的 Host;为空时用源站的「回源 Host」,再为空时用源站地址 |
| 间隔(秒) | 5–300 | 30 | 同一源站两次探测的间隔 |
| 超时(秒) | 1–60,不超过间隔 | 5 | 单次探测的时限,超时记为失败 |
| 健康阈值 | 1–10 | 2 | 连续成功多少次后恢复健康 |
| 不健康阈值 | 1–10 | 3 | 连续失败多少次后标记不健康 |
| 项目 | 行为 |
|---|---|
| 执行者 | 每个节点的 agent 分别探测网站的每个源站;探测请求数随节点数增加,间隔不宜过短 |
| 地址策略 | 与回源相同:解析结果中特殊用途地址(不在允许清单内)被丢弃,只连接校验过的地址;没有可用地址时记为失败(dns_failed、address_forbidden) |
| 请求 | 协议和端口与源站相同;HTTPS 发送 SNI(源站的 SNI、回源 Host 或地址),「校验源站证书」打开时校验证书;「回源 HTTP 版本」为 HTTP/2 时以 HTTP/2 探测;不跟随跳转;最多读取 64 KiB 响应体 |
| 失败 | 连接失败、超时、TLS 失败、状态码不在范围内;错误码与被动检查相同 |
| 初始状态 | 健康;节点启动或配置变化后的第一次探测在一个间隔内随机开始 |
| 不探测 | S3 兼容源站(未签名的探测不代表签名请求)、地址字面量被禁止的源站 |
| 节点停止探测 | 数据面的「主动不健康」标记在最长间隔的 3 倍(至少 90 秒)后失效,回到只有被动检查 |
| 上报 | 不健康或有连续失败的源站随心跳上报,来源「主动」;「源站不可用」告警同时使用两种来源 |
| 节点要求 | 节点能力 active-health-v1;集群有活动节点不支持时无法开启(「所在集群有节点不支持,暂时无法开启」) |
合并规则
| 主动检查 | 被动检查 | 结果 |
|---|---|---|
| 未开启 | 任意 | 与没有主动检查时相同 |
| 不健康 | 任意 | 不参与选择 |
| 健康 | 标记不可用 | 不参与选择,直到被动检查的恢复时间结束 |
| 健康 | 可用 | 参与选择 |
全部源站都不可用时仍按主源、备用源的顺序尝试(失败开放)。
会话保持
- 在「源站池设置」卡片中打开「会话保持」的「启用」,按需修改「Cookie 有效期(秒)」。
- 点击「保存」。
- 验证:第一次回源的响应带
Set-Cookie: __ew_affinity=…;带着这个 Cookie 的后续请求都发往同一个源站。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 启用 | 开 / 关 | 关 | 用签名 Cookie 把访问者固定到一个源站 |
| Cookie 有效期(秒) | 60–604800 | 3600 | Cookie 的 Max-Age 与签名中的到期时间 |
| 项目 | 行为 |
|---|---|
| Cookie | __ew_affinity,Path=/; HttpOnly; SameSite=Lax,HTTPS 时加 Secure;值为源站 ID、到期时间与签名 |
| 签名 | HMAC-SHA256,使用集群的挑战密钥(与挑战的通行凭证相同),集群内任一节点都能验证;密钥轮换后上一把仍可验证 |
| 签发 | 只在回源的响应上签发(缓存命中不签发);已有有效 Cookie 且剩余有效期超过一半时不重复签发 |
| 改选 | Cookie 指向的源站不可用(主动或被动检查)、已删除,或不在当前接收流量的一层(主源健康时的备用源)时,按负载均衡改选并重新签发;篡改或过期的 Cookie 同样处理 |
| 重试 | 被固定的源站本次请求失败时仍按重试规则换源站,响应改为固定到实际应答的源站 |
| 节点要求 | 节点能力 session-affinity-v1 与 challenge-v1;集群有活动节点不支持时无法开启 |
回源 TLS
| 项目 | 行为 |
|---|---|
| 证书校验 | 「校验源站证书」打开时,节点用 CA 文件校验 HTTPS 源站证书,证书须覆盖本次尝试的 SNI;重试换源站时按新源站的 SNI 校验 |
| CA 文件 | 默认使用第一个存在的文件:/etc/ssl/certs/ca-certificates.crt、/etc/pki/tls/certs/ca-bundle.crt、/etc/ssl/ca-bundle.pem、/etc/ssl/cert.pem;节点可用 --trusted-ca <绝对路径> 指定 |
| IP 源站 | 按 IP 配置的 HTTPS 源站须填写证书覆盖的「SNI」或「回源 Host」 |
| 关闭校验 | 只影响该网站;不校验的 HTTPS 连接不进入连接池 |
| 连接池 | 按源站 IP、端口和 SNI 区分;校验过的连接不会被需要校验其他名称的请求复用 |
WebSocket
WebSocket 升级请求(Upgrade: websocket)默认透传,不经过缓存。关闭「WebSocket」后,升级请求返回 403,响应头 X-Edgeweir-Error: websocket-disabled。
升级后的连接空闲 3600 秒后关闭,网站的「发送」「读取」超时不作用于它;只有配置阶段规则的「回源发送超时」「回源读取超时」能改变它,见覆盖设置。
HTTP/2 与 gRPC
-
在「源站」页签的「源站池设置」卡片中,把「回源 HTTP 版本」改为「HTTP/2」;需要转发 gRPC 时再打开「gRPC」。
-
点击卡片底部的「保存」。
-
验证:节点应用该版本后,源站访问日志里的请求为 HTTP/2。gRPC 网站可经节点调用,例如:
grpcurl -authority grpc.example.com <节点 IP>:443 list
| 项目 | 行为 |
|---|---|
| 协商 | HTTPS 源站经 TLS ALPN 协商 h2;HTTP 源站以 HTTP/2 直连(prior knowledge,h2c)。源站不支持 HTTP/2 时回源失败,不回退到 HTTP/1.1 |
| 回源 Host | 以 host 请求头发送,不发送 :authority |
| 缓存与规则 | 与 HTTP/1.1 相同:边缘缓存、回源规则、超时与重试照常生效 |
| WebSocket | 升级请求仍以 HTTP/1.1 回源;只支持 HTTP/2 的源站不能使用 WebSocket |
| 连接池 | HTTP/1.1、HTTP/2 与 gRPC 的回源连接各自复用,互不混用 |
| 主动健康检查 | 以 HTTP/2 探测;HTTPS 源站协商不出 h2 时记为失败。gRPC 服务常对普通请求返回 415,可改用源站的 HTTP 检查路径,或把 415 放进期望状态码范围 |
| 节点要求 | 节点能力 origin-http2-v1;集群有活动节点不支持时无法开启(「所在集群有节点不支持,暂时无法开启」) |
打开「gRPC」后,Content-Type 为 application/grpc 的请求(含 +proto、+json 等后缀或参数)经 HTTP/2 端到端转发:
| 项目 | 行为 |
|---|---|
| 客户端连接 | gRPC 客户端须以 HTTP/2 连接节点:HTTPS 端口对该网站的域名启用 HTTP/2(「HTTPS」页签关闭 HTTP/2 时也是);集群有网站打开 gRPC 时,HTTP 端口也接受 h2c,未打开 gRPC 的网站的域名对 h2c 请求返回 421 |
| 流式 | 请求与响应双向逐帧转发,trailers(grpc-status、grpc-message)原样传回;客户端流与双向流可用 |
| 缓存与压缩 | 不缓存,节点不压缩 |
| 请求体 | 不限大小 |
| OWASP CRS | 不检查 gRPC 请求(卡片显示「gRPC 请求不经过 OWASP CRS」):ModSecurity 读完整个请求体后才转发,流式调用无法完成。Content-Type 由客户端决定,网站的其他接口也能以该类型绕过 CRS;源站的 gRPC 接口与其他接口不分开时,把 gRPC 放到单独的网站 |
| 规则与防护 | 封禁、规则与限速照常生效;gRPC 客户端无法完成人机验证,需要时用「允许」规则豁免 gRPC 路径 |
| 超时 | 「读取」超时是两次收到数据之间的上限;长时间没有消息的流需调大「读取」超时(最多 3600 秒),或用配置规则按路径覆盖 |
| gRPC-Web | application/grpc-web 不属于 gRPC 请求,按普通 HTTP 请求处理 |
源站组
源站的「源站组」把网站的源站分成几组,留空为默认组。没有命中「源站覆盖」规则的请求只发往默认组。
- 在「源站」卡片中为源站填写「源站组」,例如
api,点击「保存」。至少保留一个源站在默认组,否则卡片显示「至少保留一个默认组源站」,不能保存。 - 在「规则」页签的「回源」阶段点击「添加规则」,填写表达式,例如
starts_with(http.request.uri.path, "/api/");「动作」选择「源站覆盖」,「源站组」选择api,按需填写「回源 Host」「SNI」「端口」,打开「启用」(新规则默认停用),点击「保存」。字段见动作字段。 - 验证:请求
/api/下的路径,源站日志显示请求到达api组的源站;其他路径仍到达默认组。
| 项目 | 行为 |
|---|---|
| 组内选择 | 负载均衡、主源与备用源、重试、健康检查与会话保持都只在选中的组内进行;轮询状态与一致性哈希按组计算 |
| 覆盖 | 规则的「端口」作用于组内每个源站;「回源 Host」「SNI」替换源站自己的设置,「回源 Host」不影响 S3 源站;SNI 为空时照常跟随回源 Host |
| 缓存键 | 不含源站组。按缓存键以外的条件(例如请求头)选择组时,不同组的响应共用缓存对象 |
| 引用检查 | 规则只能选择网站已有的组;移除仍被规则选择的组时,保存提示「规则无效」 |
| 全局规则 | 全局规则的「源站覆盖」不能选择源站组,只覆盖回源 Host、SNI 与端口 |
| 节点要求 | rules-v2;集群有活动节点不支持时,「源站」卡片显示「所在集群有节点不支持,暂时无法开启」,不能再把源站移出默认组,已有的源站组仍可修改或清空 |
请求体上限
网站「源站」页签的「请求体上限」卡片单独保存。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 上限(MiB) | 0–10240,可带小数 | 100 | 请求体按 Content-Length 超过上限时返回 413;0 不限制 |
| 项目 | 行为 |
|---|---|
| 判断依据 | 只看 Content-Length,在规则之后判断;413 带 X-Edgeweir-Error: body-too-large,页面按 413 → 「其他 4xx」→ 内置页查找,见错误页 |
| 分块上传 | 不带 Content-Length 的分块请求不按网站上限判断,只受节点全局上限约束:集群内所有已启用网站与规则上限的最大值(任一为 0 时不限) |
| 按请求覆盖 | 配置阶段规则的「请求体上限(MiB)」覆盖网站上限,见覆盖设置 |
| gRPC | 不检查 |
| 节点要求 | 不是 100 MiB 时需要节点能力 site-content-v1 |
源站地址限制
源站不能指向特殊用途地址。
| 类别 | 地址段 |
|---|---|
| IPv4 | 0.0.0.0/8、10.0.0.0/8、100.64.0.0/10、127.0.0.0/8、169.254.0.0/16、172.16.0.0/12、192.0.0.0/24、192.0.2.0/24、192.168.0.0/16、198.18.0.0/15、198.51.100.0/24、203.0.113.0/24、224.0.0.0/4、240.0.0.0/4 |
| IPv6 | ::/128、::1/128、100::/64、2001:db8::/32、fc00::/7、fe80::/10、ff00::/8;IPv4 映射地址(::ffff:0:0/96)和 NAT64 地址(64:ff9b::/96)按内嵌的 IPv4 地址判断 |
| 主机名 | localhost 和 *.localhost 始终拒绝;127.1、2130706433、0x7f000001 这类最后一段为数字的名称不是合法地址 |
| 检查点 | 行为 |
|---|---|
| 控制台保存 | IP 字面量落在上述地址段时拒绝保存(ORIGIN_ADDRESS_FORBIDDEN) |
| 节点回源 | 对配置中的地址和每次 DNS 解析结果执行同一清单;解析结果中的特殊用途地址被丢弃,全部被丢弃时记为回源失败(address_forbidden) |
| 允许清单 | 在 系统设置 → 源站地址允许清单 放行地址段,保存后向所有集群发布,见源站地址允许清单;localhost 不能放行 |
| 回环检测 | 节点向源站发送 CDN-Loop(RFC 8586);收到带本节点标识的请求时返回 508(X-Edgeweir-Error: loop-detected) |
S3 兼容对象存储
在源站上打开「S3 签名」后填写以下字段。「预设」按服务商填入源站地址模板与区域示例,把地址中 <region> 这类尖括号部分换成自己的值;预设只填表单,不保存。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 区域 | 字母、数字、-,最长 64 字符 | 无 | SigV4 签名区域,例如 us-east-1 |
| Bucket | 3–63 字符的 bucket 名 | 空 | 填写后使用路径式地址 /<bucket>/<key>;源站地址已包含 bucket 时(如 assets.s3.us-east-1.amazonaws.com)留空 |
| Access Key ID | 最长 128 字符 | 无 | 访问密钥 ID |
| Secret Key | 最长 256 字符 | 无 | 只写;保存后显示「已保存,留空不修改」,更换 Access Key ID 时必须重新填写 |
| 项目 | 行为 |
|---|---|
| 签名 | AWS Signature V4,载荷不签名(UNSIGNED-PAYLOAD);删除访问者请求中的 x-amz-* 头 |
| 方法 | 只转发 GET 和 HEAD;没有其他非 S3 源站可接收时,其他方法返回 405(Allow: GET, HEAD) |
| 查询字符串 | 访问者的查询字符串不转发给对象存储 |
| 密钥存储 | Secret Key 用主密钥信封加密入库,只经节点通道(mTLS)下发;节点保存在状态目录的 credentials.json(0600),用于控制台不可达时重启 |
| 预设 | 源站地址 | 区域示例 | Bucket |
|---|---|---|---|
| AWS S3 | s3.<region>.amazonaws.com | us-east-1 | 填写(路径式) |
| Cloudflare R2 | <account_id>.r2.cloudflarestorage.com | auto | 填写 |
| Backblaze B2 | s3.<region>.backblazeb2.com | us-west-004 | 填写 |
| MinIO | <host>,保留当前协议与端口 | us-east-1 | 填写 |
| 阿里云 OSS | <bucket>.s3.oss-<region>.aliyuncs.com | cn-hangzhou | 留空(地址含 bucket) |
| 腾讯云 COS | <bucket>-<appid>.cos.<region>.myqcloud.com | ap-guangzhou | 留空(地址含 bucket) |
| 百度智能云 BOS | s3.<region>.bcebos.com | bj | 填写 |
| 七牛云 Kodo | s3.<region>.qiniucs.com | cn-east-1 | 填写 |
除 MinIO 外,选择预设时协议改为 HTTPS、端口改为 443。只列出官方文档写明支持 S3 兼容 AWS Signature V4 的服务;华为云 OBS 的文档只描述其自有签名,不在列表中,仍可按「自定义」填写。
配置缓存规则
-
打开 网站,选择网站,进入「缓存」页签。
-
在「缓存规则」卡片中点击「添加规则」。
-
在「构建器」中填写「路径前缀」「后缀」;或切换到「高级」,在「表达式」中填写条件,见请求条件。
-
选择「动作」,填写「缓存时间(秒)」,按需填写「浏览器 TTL(秒)」;只对静态资源关闭「遵循源站」。
-
需要更多条件时点击「更多条件」,填写「精确路径」(仅构建器)「状态码」「最小(KB)」「最大(KB)」「过期后后台更新(秒)」「回源出错时用旧缓存(秒)」,或打开「缓存带 Authorization 头的请求」。
-
拖动规则左侧的手柄调整顺序。
-
点击「保存」。
-
验证:同一 URL 请求两次,第二次命中缓存:
curl -sI -H 'Host: www.example.com' http://<节点 IP>/static/app.js | grep -i x-cache第二次输出
X-Cache: HIT。
规则字段
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 条件类型 | 构建器 / 高级 | 构建器 | 见请求条件 |
| 路径前缀 | 以 / 开头,逗号分隔,最多 32 个 | / | 构建器:请求路径以其中之一开头 |
| 后缀 | 1–16 位小写字母或数字,逗号分隔,最多 64 个 | 空 | 构建器:请求路径的扩展名为其中之一,例如 css, js, png |
| 表达式 | cache 阶段的条件表达式,最长 16384 字符 | 无 | 高级:请求条件 |
| 动作 | 缓存 / 不缓存 | 缓存 | 匹配后缓存或绕过缓存 |
| 缓存时间(秒) | 0–31536000 | 3600 | 规则的缓存时间 |
| 浏览器 TTL(秒) | 0–31536000 | 空(跟随源站) | 见浏览器 TTL;「不缓存」规则不可用 |
| 遵循源站 | 开 / 关 | 开 | 开:遵循源站 Cache-Control / Expires;关:覆盖源站缓存头 |
| 精确路径 | 以 / 开头,最多 32 个 | 空 | 构建器:请求路径等于其中之一 |
| 状态码 | 100–599,最多 16 个 | 空 | 空:只缓存默认可缓存的状态码 |
| 最小(KB)/ 最大(KB) | 不小于 0;最大不小于最小 | 空(不限) | 响应大小范围 |
| 过期后后台更新(秒) | 0–2592000 | 空(关闭) | stale-while-revalidate |
| 回源出错时用旧缓存(秒) | 0–2592000 | 空(关闭) | stale-if-error |
| 缓存带 Authorization 头的请求 | 开 / 关 | 关 | 允许缓存带 Authorization 的请求 |
| 缓存带 Set-Cookie 的响应 | 开 / 关 | 关 | 允许缓存带 Set-Cookie 的响应,见 Set-Cookie |
每个网站最多 64 条规则。没有规则时卡片显示「不缓存」,网站不缓存任何响应。
匹配
| 项目 | 行为 |
|---|---|
| 顺序 | 按列表顺序匹配,第一条适用的规则决定是否缓存、缓存时间和浏览器 TTL;没有适用规则时不缓存 |
API 中的 priority | 从小到大匹配,同一网站内不能重复(CACHE_RULE_PRIORITY_DUPLICATE);不填时按列表位置取 10、20、30…… |
| 请求条件 | 一条表达式,按客户端原始请求求值:规范化后、规则改写前的路径,与缓存键、刷新一致 |
| 响应条件 | 状态码、响应大小。请求条件满足而响应条件不满足时,继续判断后续规则 |
| 响应大小 | 按 Content-Length;206 响应按 Content-Range 中的完整大小;大小未知时不满足大小条件 |
请求条件
请求条件是一条 cache 阶段的表达式,字段、函数与 IP 名单引用同规则表达式,不能使用响应字段、regex_replace 与 wildcard_replace。true 匹配所有请求。
| 条件类型 | 行为 |
|---|---|
| 构建器 | 「路径前缀」「后缀」「精确路径」生成表达式:同一类条件中任一项满足即可,不同类条件都要满足,留空的条件不限制。例如前缀 /static/, /img/ 与后缀 css, js 生成 (starts_with(http.request.uri.path, "/static/") or starts_with(http.request.uri.path, "/img/")) and http.request.uri.path.extension in {"css" "js"} |
| 高级 | 在「表达式」中直接编写,例如 starts_with(http.request.uri.path, "/static/") and not ends_with(http.request.uri.path, ".html") |
| 切换 | 构建器形状的表达式可在两种类型间切换;其他表达式只能在「高级」中编辑 |
| 节点 | 构建器形状的条件(包括在「高级」中写成同样形状的表达式)以原来的结构化条件下发,旧节点照常执行;其他表达式需要节点能力 rules-v2 |
| 升级 | 升级前保存的缓存规则已改写为等价的构建器表达式,匹配结果不变 |
浏览器 TTL
「浏览器 TTL(秒)」大于 0 时,由该规则缓存的响应对访问者返回 Cache-Control: max-age=N。
| 项目 | 行为 |
|---|---|
| 生效条件 | 决定该响应的规则(与缓存时间相同)缓存它:覆盖模式且缓存时间大于 0,或遵循模式且源站的 Cache-Control 不含 no-store、no-cache、private |
| 作用 | 访问者收到的 Cache-Control 换成 max-age=N,缓存命中同样如此;边缘缓存的有效期仍按缓存时间 |
| 不生效时 | 访问者收到源站原来的 Cache-Control |
| 响应变换 | 响应变换规则仍可修改 Cache-Control |
| 节点要求 | rules-v2;集群有活动节点不支持时不能新设置(「所在集群有节点不支持规则扩展,暂时无法使用」),已设置的值仍可修改或清除 |
缓存时间
| 模式 | 行为 |
|---|---|
| 覆盖(「遵循源站」关) | 使用规则的缓存时间,忽略源站的 Cache-Control、Expires(含 no-store、private);未填状态码时只缓存 200、203、206、300、301、308。只用于不含用户数据的静态资源,否则登录用户的页面会返回给其他访客 |
| 遵循(「遵循源站」开) | 源站给出 Cache-Control 或 Expires 时按源站;两者都没有时使用规则的缓存时间;Cache-Control 未给出有效期时(例如只有 public)不缓存;no-store、private 生效 |
| 通用 | 带 Set-Cookie 的响应不缓存,规则打开「缓存带 Set-Cookie 的响应」时除外 |
Authorization
带 Authorization 的请求默认绕过缓存,响应也不存入缓存(RFC 9111 §3.5),源站返回 public 或规则覆盖源站缓存头时同样如此。规则打开「缓存带 Authorization 头的请求」后按该规则缓存,此时持有任意凭据的访问者共用同一份缓存,只适合与凭据无关的内容。
Set-Cookie
规则打开「缓存带 Set-Cookie 的响应」后,带 Set-Cookie 的响应按该规则缓存。
| 项目 | 行为 |
|---|---|
| 发给谁 | 只有本次回源的那个响应(X-Cache 为 MISS、EXPIRED、BYPASS)带 Set-Cookie,多行原样还原;HIT、STALE、UPDATING、REVALIDATED 的响应不带任何 Set-Cookie,其他访客收不到别人的 Cookie |
| 缓存对象 | 节点磁盘上的缓存对象保存着回源时的 Set-Cookie(只用于还原给那次请求),刷新或回收后删除 |
| 适用内容 | 源站对每个访客返回相同正文、只用 Cookie 标记会话的页面;正文因 Cookie 不同而不同时,把相关 Cookie 加入缓存键 |
| 节点要求 | site-content-v1 |
过期内容
| 字段 | 行为 |
|---|---|
| 过期后后台更新(秒) | 对象过期后的该时长内先返回旧内容,同时在后台刷新 |
| 回源出错时用旧缓存(秒) | 对象过期后的该时长内,源站连接失败、超时或返回 5xx 时返回旧内容 |
两者在缓存时间为 0 时不生效。访问者收到的 Cache-Control 是源站原来的值,源站没有发送时不添加;设置了浏览器 TTL 时除外。
缓存键与分片
「缓存键与分片」卡片单独保存,对网站的全部规则生效。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 查询参数 | 全部参与 / 全部忽略 / 仅指定参数 / 排除指定参数 | 全部参与 | 查询字符串如何进入缓存键 |
| 参数 | 参数名,逗号分隔,最多 32 个 | 空 | 「仅指定参数」时保留的参数;「排除指定参数」时去掉的参数,名称可以以 * 结尾匹配前缀(utm_*) |
| 参数排序 | 开 / 关 | 关 | 排序后 ?a=1&b=2 与 ?b=2&a=1 命中同一对象;「全部忽略」时不可用 |
| 请求头 | 头名称,逗号分隔,最多 8 个,不能是 Cookie、Host | 空 | 这些请求头的值不同则分别缓存 |
| Cookie | Cookie 名,逗号分隔,最多 8 个 | 空 | 这些 Cookie 的值不同则分别缓存。名称区分大小写;请求中同名 Cookie 出现多次、以其他大小写或百分号编码出现,或写在逗号之后时,源站可能取到另一个值,这样的请求不缓存 |
| 区分移动端与桌面端 | 开 / 关 | 关 | 按 User-Agent 区分移动端(含平板)与桌面端 |
| 包含 Host | 开 / 关 | 开 | 关闭后网站的全部域名共用缓存对象 |
| Range 分片回源 | 开 / 关 | 关 | 可缓存的 GET/HEAD 按 1 MiB 分片回源和缓存,Range 请求只需命中涉及的分片;源站须支持 Range(返回 206)。关闭时 Range 请求先回源完整对象 |
| 项目 | 行为 |
|---|---|
| 固定组成 | 协议和缓存代数始终在缓存键中;关闭「包含 Host」后 HTTP 与 HTTPS 仍分别缓存 |
| 移动端识别 | User-Agent 匹配 Mobi|Android|iPhone|iPad|iPod|Windows Phone|BlackBerry|Opera Mini|webOS |
| 排除指定参数 | 参数名区分大小写,按原样和百分号解码后各比较一次;* 只能出现在名称末尾。「仅指定参数」中 * 是普通字符。源站仍收到完整的查询字符串;URL 刷新按同样规则比较查询 |
| 修改后 | 按旧键缓存的对象不再命中,由缓存区按不活跃时间回收 |
| 节点要求 | 「排除指定参数」需要 site-content-v1 |
PURGE 方法
「缓存」页签的「PURGE 方法」卡片:打开「启用」,在「PURGE 密钥」填写 16–256 个可打印字符(不含空格),或点击「生成」得到 32 字节随机密钥(只在此处显示,保存前复制),然后保存。之后:
curl -X PURGE -H 'X-Purge-Key: <密钥>' -H 'Host: www.example.com' 'http://<节点 IP>/static/app.js?v=2'返回 202 {"task_id":"…"}:控制台为该 URL 创建一个 URL 刷新任务,下发给网站所在集群的每个节点,刷新预热 中来源显示为节点。
| 项目 | 行为 |
|---|---|
| 密钥 | 只写:保存后显示「已保存,留空不修改」;填写新密钥即轮换。用主密钥信封加密入库,经节点通道下发给 agent,不进入数据面 |
| 应答 | 202 任务已创建;403 密钥错误或缺失(purge-key-invalid);400 URL 无效(purge-url-invalid);429 超过速率(purge-rate-limited,带 Retry-After);503 节点 agent 或控制台不可用(purge-unavailable)。应答为 JSON,Cache-Control: no-store |
| 速率 | 每个节点上,每个网站每个客户端网络(IPv4 地址,IPv6 按 /64)每秒 20 次,密钥正确的请求每个网站每秒 20 次(没有密钥的客户端只用完自己的额度);控制台每个网站每分钟 120 个 PURGE 任务 |
| 范围 | 刷新请求的 URL(协议、Host、路径与查询),比较规则同 URL 刷新 |
| 未启用 | PURGE 请求照常回源 |
| 审计 | cache.purge,操作者为节点,元数据 method: PURGE |
| 节点要求 | site-content-v1 |
X-Cache
「X-Cache」卡片中关闭「向访客发送 X-Cache」后,网站的响应不带 X-Cache(缓存命中也是);缓存行为不变。需要 site-content-v1。
字符编码
「字符编码」卡片为文本响应补上 Content-Type 的 charset 参数,只改响应头,不转换正文。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 编码 | 关闭 / utf-8 / gbk / gb18030 / gb2312 / big5 / iso-8859-1 / shift_jis / euc-kr | 关闭 | 添加的编码 |
| 强制替换 | 开 / 关 | 关 | 源站已给出 charset 时替换它;关闭时保留源站的 |
| 大写 | 开 / 关 | 关 | 以大写写出编码名,如 charset=GBK |
只作用于源站返回(含缓存命中)的 text/*、application/javascript、application/json、application/xml 响应;节点自己生成的响应(错误页、人机验证页、PURGE 应答)不变。需要 site-content-v1。
缓存区
集群 页面「概览」中的「缓存区」卡片设置集群每个节点的缓存区;节点详情的「缓存」可单独覆盖本节点的容量。
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 容量(GiB) | 1–65536 | 10 | 缓存区磁盘上限,超出时按最久未用回收 |
| 不活跃回收(天) | 1–90 | 7 | 对象多久未被访问即回收 |
| 节点详情:容量(GiB) | 1–65536,留空跟随集群 | 空 | 本节点的容量 |
| 项目 | 行为 |
|---|---|
| 索引内存 | 按容量自动推算:每 160 MiB 容量 1 MiB,最少 16 MiB,最多 512 MiB(10 GiB 为 64 MiB) |
| 生效 | 节点重新加载 nginx,已有连接不中断;索引大小改变时节点从磁盘重新载入缓存索引,缓存文件保留 |
| 用量 | 节点每 10 分钟(启动 1 分钟后第一次,节点参数 --cache-usage-interval)统计缓存目录的磁盘占用,随心跳上报;节点详情显示「已用 … / …」和测量时间,尚未上报时显示「尚未上报」 |
| 审计 | cluster.cache_update、node.cache_update |
| 节点要求 | 集群设置不需要新能力;节点单独的容量与用量上报需要 cache-zone-v1 |
刷新与预热
- 打开 刷新预热。
- 选择「URL 刷新」「目录刷新」「Host 刷新」「标签刷新」「全站刷新」「URL 预热」或「站点地图预热」。
- URL 类任务:每行填写一个 URL;Host 刷新:每行一个 Host;标签刷新:选择网站,每行(或用逗号分隔)一个标签;全站刷新:勾选网站;站点地图预热:填写「站点地图 URL」与「最多 URL 数」。预热类任务按需勾选「设备」中的「桌面端」「移动端」。
- 点击「提交」。
- 验证:任务出现在「任务」列表,展开后各节点状态为「成功」;刷新后下一次请求返回
X-Cache: MISS。
任务下发到网站所在集群的每个已启用节点,逐节点显示结果。已停用的网站不能刷新或预热(「网站已停用」)。/purge?site=<网站 ID> 只列出该网站的任务(「任务」旁显示网站名,点击 × 清除),并在全站刷新与标签刷新中预选该网站;/purge?type=<类型>&urls=<URL> 打开该类型并填好 URL(多个 URL 用 JSON 数组,如 urls=["https://www.example.com/a","https://www.example.com/b"])。内容为空或只有空白行时「提交」不可用。⌘K / Ctrl+K 的「刷新 URL…」打开本页(在网站页面时只列出该网站的任务)。
访问日志、网站「统计」页签的热门 URL 与「安全」页签的 Top 路径,在行右侧的「⋯」中提供「刷新 URL」:路径展开到网站的每个非泛域名,确认列出的 URL 后创建 URL 刷新任务,提示中的「查看任务」打开该网站的任务。
在网站内刷新
网站「缓存」页签顶部的「刷新缓存」卡片:
- 选择「URL 刷新」「目录刷新」或「全站刷新」。
- URL 与目录刷新:每行填写一个以
/开头的路径或完整 URL。路径展开到网站的每个非泛域名(例如/app.js对www.example.com与example.com各一条),右上角显示展开后的 URL 数;超过 500 条或有既不是路径也不是 URL 的行时在下方提示,「提交」不可用。网站只有泛域名时填写完整 URL。全站刷新显示将要刷新的域名。 - 点击「提交」。
卡片下方列出该网站最近 5 个任务,节点执行期间每 2 秒刷新;「查看任务」打开 /purge?site=<网站 ID>。
任务类型
| 类型 | 输入 | 行为 |
|---|---|---|
| URL 刷新 | 完整 URL,可带查询 | 刷新该 URL 的设备、请求头、Cookie 和分片变体。查询和 Host 按网站的缓存键规则比较,只刷新查询规范化后相同的对象;查询按百分号解码后比较(?q=%3Cb%3E 与 ?q=<b> 相同)。路径按节点规范化后的形式比较(解码百分号编码、合并连续斜杠、处理 . 和 ..),/%73tatic/a.js 与 /static/a.js 相同 |
| 目录刷新 | 不带查询的 URL 前缀 | 刷新该 Host 下路径以该前缀开头的全部对象;前缀按同样规则规范化后按字符串前缀比较;「包含 Host」关闭时不比较 Host |
| Host 刷新 | Host 名,不带端口,不能是泛域名 | 刷新该 Host 的全部对象,等同于该 Host 的 / 目录刷新;「包含 Host」关闭的网站刷新全部域名共用的对象 |
| 标签刷新 | 一个或多个网站与最多 500 个缓存标签 | 刷新这些网站中响应带有任一标签的对象,见 Cache-Tag |
| 全站刷新 | 网站 | 刷新网站的全部缓存 |
| URL 预热 | 完整 http:// 或 https:// URL;设备 | 节点经本机专用的本地边缘监听像普通请求一样取回并缓存,按浏览器的 Accept-Encoding 请求;封禁、CC、挑战与拒绝类规则不作用于预热,预热也不计入统计。状态码小于 400 为成功;源站的跳转原样缓存、不跟随。缓存键含协议、不含端口(同一网站各监听端口共用缓存对象,带端口的刷新与预热 URL 按网站处理,端口不影响结果):有证书的网站,http:// URL 同时预热 https:// 形式;节点自身因「强制 HTTPS」返回的跳转改为预热 https:// 形式,节点自身的其他跳转记为失败。网站开启「区分移动端与桌面端」时,勾选的每种设备各请求一次(移动端使用移动端 User-Agent),否则只请求一次 |
| 站点地图预热 | 一个站点地图 URL、最多 URL 数(1–10000,默认 1000);设备 | 节点经本机边缘层取回站点地图(因此遵守源站地址策略,控制台不对外请求),预热其中本网站的 URL,见站点地图 |
URL 必须以 http:// 或 https:// 开头,不能包含账号,Host 必须是某个网站的域名(含泛域名下的子域名),不能是 *.example.com 这样的模式。https:// URL 在节点有 HTTPS 监听时经本地 TLS 监听预热(不校验本机证书);没有 HTTPS 监听时失败(「节点还没有 HTTPS 监听」)。节点另有刷新专用的拉取通道:刷新不等前面已经开始的预热或升级。
Cache-Tag
源站在响应头 Cache-Tag 中用逗号分隔列出标签,例如 Cache-Tag: product-42, category-7。
| 项目 | 行为 |
|---|---|
| 解析 | 去掉首尾空格与制表符后按小写比较;只接受可打印 ASCII(不含逗号);单个标签最长 128 字节,整个响应头最长 4096 字节(多行时合并),超出的标签丢弃,响应照常缓存 |
| 转发 | 默认不转发给访问者(缓存命中也是);在网站「缓存」页签的「Cache-Tag」卡片打开「向客户端转发 Cache-Tag」后原样转发 |
| 刷新结果 | 任务成功后,每个节点都不再返回带有已刷新标签的对象,包括过期后作为旧内容(stale)返回;分片缓存的对象全部分片一起刷新 |
| 索引 | 节点为用过 Cache-Tag 的网站记录每个缓存对象的标签,存放在共享内存(节点参数 --tag-dict-mb,默认 64 MiB),按最久未用淘汰 |
| 额外回源 | 索引中没有记录的对象(被淘汰、nginx 重启后、网站第一次返回 Cache-Tag 之前缓存的对象)在网站有标签刷新记录期间回源一次,之后正常命中 |
| 标签数量 | 每个任务最多 500 个标签;节点为每个网站保留最多 5000 个标签刷新记录(节点参数 --purge-tags-per-site),超出时合并为一次全站刷新 |
| 节点要求 | 节点能力 purge-tag-v1;集群有活动节点不支持时,Host 刷新与标签刷新被拒绝(NODE_CAPABILITY_REQUIRED) |
站点地图
| 项目 | 行为 |
|---|---|
| 站点地图 URL | 必须属于一个网站;节点从本机边缘层请求它,不跟随跳转,单个文档 30 秒、解压后最多 50 MiB,gzip 压缩的站点地图按内容识别 |
| 格式 | urlset 的 <loc>;sitemapindex 只展开一层,子站点地图也必须在该网站的域名上 |
| 筛选 | 只保留该网站域名(含泛域名)下的 http(s) URL,去重后按文档顺序截取前「最多 URL 数」个 |
| 结果 | 每个 URL 的每种设备计一次成功或失败;站点地图取不到或无法解析时失败(sitemap_failed),没有本网站的 URL 时失败(sitemap_empty) |
| 节点要求 | 节点能力 prefetch-v2(移动端预热同样需要);集群有活动节点不支持时任务被拒绝(NODE_CAPABILITY_REQUIRED) |
清除网站缓存
在网站「概览」页签点击「清除缓存」并确认(或按 ⌘K / Ctrl+K 搜索网站,选择「清除缓存:(网站)」),与 刷新预热 的「全站刷新」相同:控制台创建一个全站刷新任务,下发到网站所在集群的每个已启用节点,不发布配置版本。提示中的「查看任务」打开 /purge?site=<网站 ID>,只列出该网站的任务,表单中预选该网站。已停用的网站不能清除缓存。
任务限制
| 项目 | 限制 |
|---|---|
| 每个任务 | 最多 500 条 URL、500 个 Host 或 500 个标签,或 100 个网站;每条 URL 最长 2048 字符;站点地图预热每个任务一个站点地图 |
| 节点刷新标记 | 每个网站最多保留 1000 条 URL、目录和 Host 刷新标记(节点参数 --purge-markers-per-site)与 5000 条标签刷新标记(--purge-tags-per-site),超出时合并为一次全站刷新 |
| 执行顺序 | 节点先执行一批任务中的刷新,再执行预热 |
| 预热时间 | 一批任务(最多 10 个)共享 4 分钟预算(节点参数 --prefetch-budget),从节点拉取任务起计时;单个 URL 60 秒;并发 4;到时未完成的 URL 记为失败(prefetch_timeout) |
| 磁盘文件 | 刷新不删除磁盘文件:下一次请求使用新的缓存键回源,旧对象按缓存区的不活跃时间和容量上限回收 |
节点状态
| 状态 | 含义 |
|---|---|
| 等待中 | 节点尚未取走任务;节点离线时保持此状态 |
| 执行中 | 节点已取走任务;5 分钟内未回报结果时重新下发 |
| 成功 / 失败 | 节点回报的结果 |
| 已跳过 | 节点已停用,任务未下发(node_disabled),不计入进度;停用节点时其未完成的任务同样记为已跳过 |
| 情况 | 行为 |
|---|---|
| 7 天未执行 | 记为失败(「节点 7 天内没有执行」,task_expired) |
| 补发整站刷新 | 离线超过 7 天后重连、或停用后重新启用的节点,不再执行错过的刷新,改为对涉及的每个网站执行一次全站刷新:合并为一个任务,来源显示「系统(补发整站刷新)」,只发给该节点;已删除的网站不在其中。原任务在该节点下标记「节点重新连接时已补发整站刷新」 |
| 预热 | 错过的预热不补发 |
| 保留 | 任务保留 90 天;节点仍需补发整站刷新的刷新任务保留到补发之后 |
限制
| 项目 | 说明 |
|---|---|
| 数量 | 每个网站 1–50 个域名、1–32 个源站、最多 64 条缓存规则 |
| 缓存规则条件 | 最长 16384 字符;不能读取响应字段 |
| 源站组 | 缓存键不含源站组 |
| 缓存区 | 每个节点一个缓存区;容量与不活跃时间按集群设置,节点只能覆盖容量 |
| 最大压缩长度 | 只对长度已知的响应生效;分块(长度未知)的响应照常压缩 |
| HTTPS 预热 | 需要节点有 HTTPS 监听,即集群里至少有一个网站配置了证书;缓存键包含协议,http:// 预热只填充 HTTP 访问的缓存 |
| 设备变体 | 只区分桌面端与移动端(平板按移动端处理) |
| Authorization 开关 | 需要节点 proto v0.2.1 及以上;更早的节点忽略「缓存带 Authorization 头的请求」 |
| WebSocket | 只识别 Upgrade: websocket |
| HTTP/2 回源 | 不回退到 HTTP/1.1;不发送 :authority |
| gRPC | 主动健康检查不支持 gRPC 健康检查协议(grpc.health.v1),只发送 HTTP 请求 |
故障排查
节点自身返回的错误带响应头 X-Edgeweir-Error 和 Cache-Control: no-store。X-Cache 为 nginx 缓存状态:MISS、HIT、BYPASS、EXPIRED、STALE、UPDATING、REVALIDATED。
| 现象 | 原因 | 处理 |
|---|---|---|
| 保存提示「源站地址 … 属于特殊用途地址段 …,不在源站地址允许清单中」 | 源站 IP 字面量在特殊用途地址段 | 改用公网地址,或把地址段加入源站地址允许清单 |
| 源站显示「… 是特殊用途地址,不在源站地址允许清单内」 | 源站域名的解析结果全部为特殊用途地址 | 同上 |
| HTTPS 源站返回 502,源站显示「TLS 握手或证书校验失败」 | 源站证书自签名、不覆盖 SNI 或证书链不完整;节点缺少 CA 文件 | 换受信任证书或填写正确的「SNI」;自签名源站关闭「校验源站证书」;节点用 --trusted-ca 指定 CA 文件 |
502,X-Edgeweir-Error: no-origin | 所有源站都在尝试前被剔除(解析失败、地址被禁止、缺少 S3 凭据) | 查看「源站」页签的错误信息 |
404,X-Edgeweir-Error: unknown-host | Host 不属于节点已应用的任何网站,也不是已停用网站的域名:网站或域名已删除,或节点未应用最新版本 | 检查域名与节点「已应用版本」 |
503,X-Edgeweir-Error: site-disabled | 网站已停用 | 在网站「概览」页签启用网站 |
| HTTPS 请求在 TLS 握手时失败 | SNI 不属于节点正在服务的网站(未知域名、已停用的网站),或网站没有证书 | 用 HTTP 请求查看节点的应答;为网站配置证书,见HTTPS 与证书 |
508,X-Edgeweir-Error: loop-detected | 源站指回了本节点或其上游 CDN | 修改源站地址 |
403,X-Edgeweir-Error: websocket-disabled | 网站关闭了 WebSocket | 打开「WebSocket」 |
| 「回源 Host」下方提示格式,或保存提示「回源 Host 无效:…」 | 含空格、引号、/、\,带协议或路径,或是不带端口的方括号 IPv6 | 只填主机名或 IP,可带端口 |
| 源站显示「回源 Host 无效,节点会跳过该源站」 | 旧版本控制台保存了节点不接受的回源 Host;节点跳过该源站,网站只有这一个源站时不下发 | 修改「回源 Host」后保存 |
| 保存提示「gRPC 需要以 HTTP/2 回源」 | 「回源 HTTP 版本」不是 HTTP/2 时打开了 gRPC,或改回 HTTP/1.1 时没有关闭 gRPC | 先选择 HTTP/2,或同时关闭 gRPC |
| 改为 HTTP/2 后 502,源站显示「TLS 握手或证书校验失败」 | HTTPS 源站不支持 HTTP/2(ALPN 没有 h2) | 在源站开启 HTTP/2,或改回 HTTP/1.1 |
| 改为 HTTP/2 后 502,源站显示「连接失败」 | HTTP 源站不接受 h2c | 同上 |
| 回源 HTTP/1.1 时客户端收到无法解析的响应或 502 | 源站只接受 HTTP/2(例如以 h2c 监听的 gRPC 服务) | 把「回源 HTTP 版本」改为 HTTP/2 |
| gRPC 客户端收到 421 | 客户端以 h2c 访问了未打开 gRPC 的网站的域名 | 在该网站打开「gRPC」,或改用 HTTPS |
| gRPC 客户端报告缺少 trailers | 网站没有打开「gRPC」,请求按普通请求回源 | 打开「gRPC」 |
| 「节点尚不支持:HTTP/2 与 gRPC 回源(<节点>)」 | 服务账号或后台任务发布的配置用到了 HTTP/2 回源,而集群有活动节点缺少 origin-http2-v1 | 升级节点,见节点升级 |
405,X-Edgeweir-Error: method-not-allowed | S3 源站只接收 GET、HEAD | 为写请求增加非 S3 源站 |
带 Authorization 的请求始终 X-Cache: BYPASS | 默认绕过缓存 | 在对应规则打开「缓存带 Authorization 头的请求」 |
响应始终 X-Cache: BYPASS | 没有适用的缓存规则,或适用的都是「不缓存」规则 | 检查规则顺序与条件 |
响应始终 X-Cache: MISS | 遵循源站模式下源站未给出有效期;响应带 Set-Cookie 而规则没有打开「缓存带 Set-Cookie 的响应」;缓存时间为 0 | 检查规则和源站响应头 |
响应没有 X-Cache | 网站关闭了「向访客发送 X-Cache」 | 在「X-Cache」卡片打开 |
413,X-Edgeweir-Error: body-too-large | 请求的 Content-Length 超过网站或规则的请求体上限 | 调高「请求体上限」,或为上传路径加配置规则 |
PURGE 返回 403,purge-key-invalid | X-Purge-Key 缺失或与保存的密钥不同 | 检查密钥;忘记时生成新密钥并保存 |
PURGE 返回 429,purge-rate-limited | 同一客户端网络超过每秒 20 次、网站的有效请求超过每秒 20 次,或超过每分钟 120 个任务 | 按 Retry-After 稍后再试;批量刷新用 刷新预热 或 API |
PURGE 返回 503,purge-unavailable | 节点 agent 或控制台不可达 | 检查节点与控制台的连接 |
PURGE 请求被转发到源站 | 网站没有启用 PURGE 方法 | 在「PURGE 方法」卡片启用 |
| 源站的 502 直接返回访问者,没有换源站重试 | 关闭了「源站返回 502 / 503 / 504 时重试」,或「尝试次数」为 1 | 检查「源站池设置」 |
| 保存提示「开启 PURGE 方法需要先设置密钥」 | 启用时没有保存过密钥 | 填写或生成密钥后保存 |
| 「所在集群有节点不支持,暂时无法开启」 | 集群有活动节点缺少 site-content-v1 或 cache-zone-v1 | 升级节点,见节点升级 |
| 「源站」卡片显示「至少保留一个默认组源站」 | 所有源站都填写了「源站组」 | 清空至少一个源站的「源站组」 |
| 保存源站或缓存规则提示「规则无效」 | 移除了仍被「源站覆盖」规则选择的源站组;缓存规则条件无效 | 先修改规则,或保留该组的源站;修正条件 |
| 「节点尚不支持:规则扩展(<节点>)」 | 服务账号或后台任务发布的配置用到了源站组、高级条件或浏览器 TTL,而集群有活动节点缺少 rules-v2 | 升级节点,见节点升级 |
| 选择了不同源站组的请求返回同一个缓存对象 | 缓存键不含源站组 | 按路径选择源站组,或把选择依据加入缓存键 |
| 「没有网站使用 …」 | URL 的 Host 不是任何网站的域名 | 检查域名拼写 |
| 「网站已停用」 | 任务或「清除缓存」涉及已停用的网站 | 在网站「概览」页签启用网站后再提交 |
| 「URL 无效:…」 | 不是 http(s) URL、包含账号,或目录刷新带查询 | 修正 URL |
| 「Host 无效:…」 | 带端口、泛域名或不是合法主机名 | 每行填写一个主机名 |
| 「缓存标签无效:…」 | 标签含逗号、非 ASCII 字符或超过 128 字节 | 修正标签;源站的 Cache-Tag 使用同样的规则 |
「所在集群有节点不支持…」(NODE_CAPABILITY_REQUIRED) | 集群有活动节点缺少 purge-tag-v1 或 prefetch-v2 | 升级节点,见节点升级 |
| 预热失败,原因「节点还没有 HTTPS 监听」 | 集群里没有配置了证书的网站,节点只有 HTTP 监听 | 改用 http:// URL,或为网站配置证书 |
| 「站点地图 … 获取失败(…)」 | 站点地图返回错误状态码或跳转、超时、超过 50 MiB 或不是有效的站点地图 | 直接请求站点地图 URL 检查;跳转时填写最终地址 |
| 「站点地图 … 中没有本网站的 URL」 | 站点地图只列出了其他域名的 URL | 检查站点地图中的域名 |
| 标签刷新后仍是旧内容 | 源站没有在该对象的响应中发送对应的 Cache-Tag,或标签含不接受的字符 | 打开「向客户端转发 Cache-Tag」后查看响应头 |
| 「预热超时,已完成 …」 | 超过 4 分钟预算 | 拆分为多个任务 |
| 「节点不支持此任务类型(…),请升级 edgeweir-node」 | 节点版本过旧 | 升级节点,见节点升级 |