没有不值得去解决的问题,也没有不值得去学习的技术!

EdgeOne 流量成本排查:将 WordPress uploads 静态资源迁移到 Cloudflare media 子域名

[图2,EdgeOne 昨日 L7 访问流量,显示 6.56 GB]

作者:

,

WordPress CDN 与全球加速实战

图16:浏览器访问正常,网站全球访问成功

(1) 从阿里云 DNS 到 Cloudflare 全球加速的完整迁移实战记录

这一套规则遵循 Cloudflare + WordPress 标准 CDN 架构:

(2) Cloudflare SSL/TLS 与 Cache Rules 配置实战

图12:评论实时生效

(3) WordPress + Cloudflare 推荐配置与 Cache Rules 实战优化(SSL / API / 缓存闭环完整记录)

CDN上线后的boce数据

(4) CDN 上线前后性能对比实测:WordPress 缓存误判修正与真实加速效果验证

【图9:boce 测试 cn-test,灰云直连阿里云 ECS,平均响应 0.478s】

(5) Cloudflare 免费版适合中国大陆 WordPress 主站吗?从缓存 HIT 到灰云直连阿里云 ECS 的实测复盘

【图1:腾讯云 EdgeOne 产品页,选择“立即使用”】

(6) 从 Cloudflare Free 迁移到腾讯云 EdgeOne:一次 WordPress 主站国内外加速实战

【图2:EdgeOne 上线后 boce 第二次测试,平均响应 0.354s,不可访问 2 个】

(7) Cloudflare Free 迁移到 EdgeOne 后到底快了多少?WordPress CDN 三阶段 boce 与 WebPageTest 实测对比

[图2,EdgeOne 昨日 L7 访问流量,显示 6.56 GB]

(8) EdgeOne 流量成本排查:将 WordPress uploads 静态资源迁移到 Cloudflare media 子域名

【图3,EdgeOne 301 请求的 URL Path 排行,集中在 /wp-content/uploads/ 图片路径】

(9) WordPress 图片迁移到 media 子域名后,EdgeOne 仍然出现大量 301 的排查与处理记录

最近我在腾讯云 EdgeOne 控制台里发现一个比较明显的问题:站点刚接入 EdgeOne 不久,套餐里的安全加速流量消耗速度就明显偏快。

我当前使用的是 EdgeOne 个人版套餐,套餐内安全加速流量为 50 GB。实际查看时,已经使用了 16.55 GB / 50 GB。如果按照当时的消耗速度继续下去,这个套餐很可能撑不到一个月。

所以这次没有继续盲目升级套餐,而是先做了一次流量分析,然后把 WordPress 的 /wp-content/uploads/ 静态资源迁移到一个单独的 media.shuijingwanwq.com 子域名,并通过 Cloudflare 承接这部分媒体资源流量。

这篇文章记录一下完整排查与调整过程。

[图1,EdgeOne 套餐管理页面,显示安全加速流量已使用 16.55 GB / 50 GB]
[图1,EdgeOne 套餐管理页面,显示安全加速流量已使用 16.55 GB / 50 GB]

一、先确认 EdgeOne 的流量消耗情况

我先进入 EdgeOne 的套餐管理页面查看当前套餐用量。

当时看到的数据大概是:

Plaintext
安全加速流量:16.55 GB / 50 GB
安全加速请求:33.71 万次 / 300 万次

这个数据已经让我比较警惕。因为如果一天消耗 5 GB 左右,那么 50 GB 流量很快就会用完。

接着我进入 EdgeOne 的指标分析页面,查看昨天和今天的 L7 访问流量。

昨天的数据大致如下:

Plaintext
L7 访问流量:6.56 GB
EdgeOne 响应流量:6.41 GB
客户端请求流量:145.83 MB
L7 访问请求数:18.32 万次

从国家/地区看,中国大陆和美国是主要来源:

Plaintext
中国大陆境内:3.57 GB
美国:2.22 GB
[图2,EdgeOne 昨日 L7 访问流量,显示 6.56 GB]
[图2,EdgeOne 昨日 L7 访问流量,显示 6.56 GB]

这里可以先得出一个判断:这不是一个非常明显的单 IP 攻击。因为在 IP 排行里,Top IP 的占比并不高,没有出现某个 IP 独占大量流量的情况。

二、继续看缓存状态:MISS 比例偏高

接着我切到缓存状态维度看数据。

昨天的缓存状态大致是:

Plaintext
MISS:4.31 GB
HIT:2.03 GB
dynamic:70.72 MB

今天早上的缓存状态也类似:

Plaintext
MISS:1.15 GB
HIT:514.4 MB
dynamic:10.59 MB
[图3,EdgeOne 缓存状态分析,显示 MISS 4.31 GB、HIT 2.03 GB]
[图3,EdgeOne 缓存状态分析,显示 MISS 4.31 GB、HIT 2.03 GB]

这个数据说明,EdgeOne 的缓存命中并不理想。大量流量仍然是 MISS 状态。

不过这里也要注意一个点:提高 HIT 率并不一定等于直接降低 EdgeOne 套餐流量。因为即使资源在 EdgeOne 节点 HIT,只要 EdgeOne 把资源返回给用户,仍然会消耗 EdgeOne 的安全加速流量。

所以我后面真正的优化方向不是单纯提高 EdgeOne 缓存,而是把高流量的 /wp-content/uploads/ 媒体资源迁移到 Cloudflare 的子域名上,让 EdgeOne 不再直接承接这些图片和附件的传输。

三、发现真正的大头:uploads 目录和 logo.png

在 URL Path 排行里,我发现一个非常明显的资源:

Plaintext
/wp-content/uploads/2026/05/logo.png  530.22 MB

今天早上这个文件也已经消耗了:

Plaintext
/wp-content/uploads/2026/05/logo.png  143.07 MB
[图4,URL Path 排行,显示 logo.png 昨日消耗 530.22 MB]
[图4,URL Path 排行,显示 logo.png 昨日消耗 530.22 MB]

这张 logo.png 原本同时用于 Site Logo 和站点图标,尺寸是:

Plaintext
1024 × 1024

文件大小是:

Plaintext
884 KB

由于它作为 Site Logo 会在很多页面中出现,所以文件过大时,很容易成为高频消耗资源。

于是我先在 WordPress 后台把这张图片缩放到:

Plaintext
512 × 512

压缩后大小变成:

Plaintext
173 KB

相当于从 884 KB 降到了 173 KB,单文件体积减少了大约 80%。

[图5,WordPress 站点标识页面,Site Logo 与站点图标使用同一张图片]
[图5,WordPress 站点标识页面,Site Logo 与站点图标使用同一张图片]
[图6,WordPress 图片编辑页面,将 1024×1024 缩放为 512×512]
[图6,WordPress 图片编辑页面,将 1024×1024 缩放为 512×512]

压缩 Logo 是一个必要动作,但它只能降低单个资源的体积,不能从根本上解决 EdgeOne 流量消耗的问题。

因为 /wp-content/uploads/ 目录下不只有 Logo,还有大量文章截图、图片、ZIP 附件等资源。

四、确认 uploads 目录里不只是图片,还有大附件

我在服务器上查看了 uploads 目录下体积最大的文件:

Bash
find /data/wwwroot/www.shuijingwanwq.com/wp-content/uploads -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" -o -iname "*.pdf" -o -iname "*.zip" \) -printf '%s %p\n' | sort -nr | head -n 10

结果发现 uploads 目录里有不少大文件,例如:

Plaintext
113223692 /data/wwwroot/www.shuijingwanwq.com/wp-content/uploads/2026/05/com.termux_1002.zip
49688068  /data/wwwroot/www.shuijingwanwq.com/wp-content/uploads/2026/05/FlClash-0.8.93-android-arm64-v8a.zip
7639822   /data/wwwroot/www.shuijingwanwq.com/wp-content/uploads/2026/04/com.wireguard.android-1.0.20260315.zip
6456103   /data/wwwroot/www.shuijingwanwq.com/wp-content/uploads/2025/02/3-1.jpg

这说明 /wp-content/uploads/ 不能简单理解为图片目录。它本质上是 WordPress 媒体库目录,里面可能包含图片、压缩包、PDF、附件等各种上传文件。

所以我没有使用 img.shuijingwanwq.com,而是选择了更合适的子域名:

Plaintext
media.shuijingwanwq.com

这个命名更适合承接整个 WordPress 媒体库资源。

五、创建 media 子域名,并通过 Cloudflare 承接流量

我先在 Cloudflare DNS 中添加一条记录:

Plaintext
类型:A
名称:media
IPv4 地址:源站服务器 IP
代理状态:已代理,也就是橙色云朵开启
TTL:自动
[图7,Cloudflare DNS 添加 media.shuijingwanwq.com 记录]
[图7,Cloudflare DNS 添加 media.shuijingwanwq.com 记录]

这一步的目标是让:

Plaintext
media.shuijingwanwq.com

走 Cloudflare,而不是走 EdgeOne。

六、使用 OneinStack 添加 media 虚拟主机

我的服务器是 OneinStack 环境,所以直接使用:

Bash
~/oneinstack/vhost.sh

添加虚拟主机。

关键配置如下:

Plaintext
域名:media.shuijingwanwq.com
网站目录:/data/wwwroot/www.shuijingwanwq.com/wp-content/uploads
SSL:Let's Encrypt
HTTP 自动跳转 HTTPS:开启
Rewrite:不启用
Hotlink Protection:不启用
[图8,OneinStack 添加 media.shuijingwanwq.com 虚拟主机成功]
[图8,OneinStack 添加 media.shuijingwanwq.com 虚拟主机成功]

这里有一个关键点:media.shuijingwanwq.com 的网站目录不是 WordPress 根目录,而是直接指向 uploads 目录:

Plaintext
/data/wwwroot/www.shuijingwanwq.com/wp-content/uploads

这样原来的资源:

Plaintext
https://www.shuijingwanwq.com/wp-content/uploads/2026/05/logo-e1783470913383.png

就可以通过新的 media 域名访问为:

Plaintext
https://media.shuijingwanwq.com/2026/05/logo-e1783470913383.png

URL 更短,也更符合媒体资源子域名的定位。

七、media 虚拟主机必须禁止执行 PHP

OneinStack 默认生成的 Nginx 虚拟主机配置中,可能会包含 PHP 执行规则。

但是 media.shuijingwanwq.com 的根目录是 uploads。uploads 目录只应该作为静态资源目录,不能执行 PHP。

所以我修改了:

Plaintext
/usr/local/nginx/conf/vhost/media.shuijingwanwq.com.conf

把:

Nginx
index index.html index.htm index.php;

改成:

Nginx
index index.html index.htm;

并把 PHP 处理规则改成直接返回 403:

Nginx
location ~ [^/]\.php(/|$) {
    return 403;
}

然后测试并重载 Nginx:

Bash
nginx -t && nginx -s reload
[图9,media 虚拟主机配置,禁止执行 PHP]
[图9,media 虚拟主机配置,禁止执行 PHP]

之后我测试:

Bash
curl -I https://media.shuijingwanwq.com/test.php

返回:

Plaintext
HTTP/2 403
server: cloudflare
cf-cache-status: BYPASS

说明 media 子域名不会执行 PHP,这一点很重要。

八、验证 media 资源是否能被 Cloudflare 缓存

我先测试 Logo:

Bash
curl -I https://media.shuijingwanwq.com/2026/05/logo-e1783470913383.png

第一次可能是:

Plaintext
cf-cache-status: MISS

再次请求后变成:

Plaintext
cf-cache-status: HIT

返回头里可以看到:

Plaintext
server: cloudflare
content-type: image/png
content-length: 172972
cache-control: max-age=2592000
cf-cache-status: HIT

接着我又测试一个比较大的 ZIP 文件:

Bash
curl -I https://media.shuijingwanwq.com/2026/05/com.termux_1002.zip

第二次请求后也能看到:

Plaintext
cf-cache-status: HIT
content-length: 113223692

这说明 Cloudflare 可以正常承接 media 子域名下的图片和大附件。

九、修改 WordPress 上传资源 URL

接下来需要让 WordPress 自己输出 media.shuijingwanwq.com,而不是继续输出:

Plaintext
https://www.shuijingwanwq.com/wp-content/uploads

我的服务器上没有安装 wp-cli,所以用 PHP 直接调用 WordPress 环境来检查配置:

Bash
cd /data/wwwroot/www.shuijingwanwq.com && php -r 'require "wp-load.php"; echo get_option("upload_url_path") . PHP_EOL;'

结果为空,说明之前没有单独设置上传 URL。

然后执行:

Bash
cd /data/wwwroot/www.shuijingwanwq.com && php -r 'require "wp-load.php"; update_option("upload_url_path", "https://media.shuijingwanwq.com"); echo get_option("upload_url_path") . PHP_EOL;'

输出:

Plaintext
https://media.shuijingwanwq.com
[图10,使用 PHP 设置 WordPress upload_url_path 为 media 域名]
[图10,使用 PHP 设置 WordPress upload_url_path 为 media 域名]

继续验证 WordPress 内部上传目录:

Bash
cd /data/wwwroot/www.shuijingwanwq.com && php -r 'require "wp-load.php"; $u = wp_upload_dir(); echo $u["baseurl"] . PHP_EOL;'

输出:

Plaintext
https://media.shuijingwanwq.com

说明 WordPress 内部上传 URL 已经切换成功。

十、清理 W3 Total Cache 页面缓存

设置 WordPress 上传 URL 后,前台页面不一定马上变化。因为页面 HTML 可能被 W3 Total Cache 或 EdgeOne 缓存。

我先绕过缓存测试:

Bash
curl -s 'https://www.shuijingwanwq.com/?media_test=1' | grep -oE 'https://media\.shuijingwanwq\.com/[^"]+|/wp-content/uploads/[^"]+'

这时可以看到页面里已经输出:

Plaintext
https://media.shuijingwanwq.com/2026/05/logo-150x150.png
https://media.shuijingwanwq.com/2026/07/1-20-245x300.png
https://media.shuijingwanwq.com/2026/07/2-18-300x230.png
...

说明 WordPress 动态输出已经是 media 域名。

然后在 WordPress 后台清理 W3 Total Cache:

Plaintext
Performance → Purge All Caches

再次测试首页:

Bash
curl -s https://www.shuijingwanwq.com/ | grep -oE 'https://media\.shuijingwanwq\.com/[^"]+|/wp-content/uploads/[^"]+'

结果里已经全部变成:

Plaintext
https://media.shuijingwanwq.com/...
[图11,首页源码中图片 URL 已经切换为 media.shuijingwanwq.com]
[图11,首页源码中图片 URL 已经切换为 media.shuijingwanwq.com]

十一、在 EdgeOne 中做 uploads 全量 301 跳转

虽然 WordPress 新输出已经切到 media 域名,但历史缓存页面、搜索引擎、外部引用、旧文章中仍然可能访问旧地址:

Plaintext
https://www.shuijingwanwq.com/wp-content/uploads/2026/07/1-20-245x300.png

如果不处理,这些旧地址仍然可能走 EdgeOne。

所以我在 EdgeOne 规则引擎中添加一条全量 uploads 301 规则。

规则名称:

Plaintext
全量 uploads 301

匹配条件:

Plaintext
URL path 正则匹配:
^/wp-content/uploads/(.*)$

执行动作:

Plaintext
访问 URL 重定向
目标请求协议:HTTPS
目标 Hostname:media.shuijingwanwq.com
目标路径:正则替换
正则表达式:^/wp-content/uploads/(.*)$
替换为:/$1
携带查询参数:开启
状态码:301
[图12,EdgeOne 全量 uploads 301 规则配置]
[图12,EdgeOne 全量 uploads 301 规则配置]

这个规则的作用是把:

Plaintext
https://www.shuijingwanwq.com/wp-content/uploads/2026/07/1-20-245x300.png

跳转为:

Plaintext
https://media.shuijingwanwq.com/2026/07/1-20-245x300.png

注意,静态资源长期缓存规则我暂时没有删除,而是保留作为兜底。因为 EdgeOne 规则部署比较慢,当前没有必要为了删除一条暂时无害的缓存规则,再触发一次部署。

[图13,EdgeOne 规则列表,显示“全量 uploads 301”规则已启用]
[图13,EdgeOne 规则列表,显示“全量 uploads 301”规则已启用]

十二、验证旧 URL 是否跳转到 media

最后验证旧 URL:

Bash
curl -I https://www.shuijingwanwq.com/wp-content/uploads/2026/07/1-20-245x300.png

返回:

Plaintext
HTTP/2 301
location: https://media.shuijingwanwq.com/2026/07/1-20-245x300.png
server: TencentEdgeOne
x-cache-lookup: Return Directly

继续跟随跳转验证完整链路:

Bash
curl -IL https://www.shuijingwanwq.com/wp-content/uploads/2026/07/1-20-245x300.png

结果第一段是 EdgeOne 返回 301:

Plaintext
HTTP/2 301
location: https://media.shuijingwanwq.com/2026/07/1-20-245x300.png
server: TencentEdgeOne

第二段是 Cloudflare 返回资源:

Plaintext
HTTP/2 200
server: cloudflare
content-type: image/png
content-length: 21891
cf-cache-status: HIT
cache-control: max-age=2592000
[图14,curl -IL 验证旧 uploads URL 先经过 EdgeOne 301,再由 Cloudflare 返回 200 HIT]
[图14,curl -IL 验证旧 uploads URL 先经过 EdgeOne 301,再由 Cloudflare 返回 200 HIT]

这说明完整链路已经打通:

Plaintext
旧地址:www + /wp-content/uploads/...
→ EdgeOne 301
→ media.shuijingwanwq.com
→ Cloudflare 200
→ cf-cache-status: HIT

十三、这次优化后的结构

调整前:

Plaintext
www.shuijingwanwq.com
└── /wp-content/uploads/
    └── 图片、ZIP、附件等资源全部由 EdgeOne 承接

调整后:

Plaintext
www.shuijingwanwq.com
└── HTML 页面仍然走 EdgeOne

media.shuijingwanwq.com
└── WordPress uploads 静态资源走 Cloudflare

旧地址兜底:

Plaintext
www.shuijingwanwq.com/wp-content/uploads/*
→ 301
→ media.shuijingwanwq.com/*

这样一来,EdgeOne 主要负责主站页面、规则、HTML 缓存和安全防护;而图片、截图、ZIP 附件等大体积资源,则交给 Cloudflare 的 media 子域名承接。

十四、为什么没有把整个网站重新迁回 Cloudflare

这次我只是把 WordPress 的 /wp-content/uploads/ 上传资源迁移到 Cloudflare,而不是把整个主站重新迁回 Cloudflare。

原因是:我之前已经测试过,www.shuijingwanwq.com 整站走 Cloudflare 时,中国大陆地区访问体验并不稳定,尤其是移动和联通网络下,页面打开速度会比较慢。这也是我后来从 Cloudflare 迁移到 EdgeOne 的重要原因。

所以这次的思路不是“回到 Cloudflare”,而是做一个折中拆分:

Plaintext
HTML 页面、主站访问、WordPress 动态页面:
继续走 EdgeOne

图片、截图、ZIP、PDF 等上传资源:
迁移到 media.shuijingwanwq.com,通过 Cloudflare 承接

这个方案的风险相对可控。因为我的 WordPress 站点已经启用了图片懒加载,页面打开时不会一次性加载所有图片。用户首先请求的仍然是主站 HTML 页面,而这些页面继续由 EdgeOne 提供服务。

也就是说,中国大陆用户访问文章时,首屏体验主要仍然取决于 EdgeOne 和源站缓存;只有当用户滚动到图片位置,浏览器才会去请求 media.shuijingwanwq.com 上的图片资源。

这样做的预期是:

Plaintext
主站首屏速度:尽量保持 EdgeOne 的国内访问优势
图片和附件流量:转移到 Cloudflare,降低 EdgeOne 套餐消耗

当然,这不是一个完美方案。中国大陆用户加载文章图片时,仍然可能受到 Cloudflare 在不同运营商网络下访问质量的影响。但相比整站迁回 Cloudflare,这种影响会被图片懒加载削弱很多,也更容易接受。

所以这次优化的核心并不是单纯追求最快访问速度,而是在下面三者之间做平衡:

Plaintext
EdgeOne 成本
中国大陆用户访问体验
WordPress 媒体资源流量压力

目前看,把 uploads 媒体资源拆到 Cloudflare,是一个比整站迁移更稳妥的中间方案。

十五、几个经验总结

第一,不要一看到 EdgeOne 流量上涨就马上升级套餐。
这次如果直接升级到更高套餐,成本会明显增加。但实际排查后发现,主要问题集中在 /wp-content/uploads/ 静态资源上,是可以通过架构调整优化的。

第二,Referer 不存在 占比高,不一定就是盗链。
EdgeOne 数据中,Referer 不存在的流量占比很高,但这可能来自浏览器隐私策略、直接访问、爬虫、App 内置浏览器等。如果直接封空 Referer,容易误伤正常用户。

第三,Site Logo 不应该使用过大的图片。
原来的 Logo 是 1024×1024,884 KB。它既用于 Site Logo,也用于站点图标。压缩到 512×512 后,体积降到 173 KB。虽然还不是极致优化,但已经明显降低了单资源消耗。

第四,WordPress 的 uploads 目录不只是图片。
它可能包含图片、ZIP、PDF、附件等各种媒体资源。所以子域名命名为 media.shuijingwanwq.comimg.shuijingwanwq.com 更合适。

第五,media 子域名必须禁止执行 PHP。
uploads 目录只应该提供静态资源。如果 media 虚拟主机允许 PHP 执行,一旦有异常 PHP 文件进入 uploads,会带来安全风险。

第六,EdgeOne 规则尽量少频繁调整。
EdgeOne 规则部署可能需要等待较久,所以这次后面尽量减少规则变更。全量 301 生效后,静态资源长期缓存规则暂时保留作为兜底,不急着删除。

十六、后续观察项

这次迁移完成后,接下来我会继续观察 EdgeOne 指标分析里的这些数据:

Plaintext
L7 访问流量
URL Path 排行
/wp-content/uploads/ 是否还出现在高流量排名
状态码 301 占比
EdgeOne 套餐用量增长速度

理想情况下,后续 EdgeOne 的 /wp-content/uploads/ 资源流量会显著下降。即使旧地址仍然被访问,EdgeOne 也只返回很小的 301 响应,不再直接传输图片或 ZIP 文件本体。

这次优化算是一个比较实际的折中方案:不完全迁移 CDN,也不继续升级 EdgeOne 套餐,而是把最消耗流量的 WordPress 媒体资源拆出去,让 EdgeOne 和 Cloudflare 各自承担更适合的部分。

Cloudflare Free 迁移到 EdgeOne 后到底快了多少?WordPress CDN 三阶段 boce 与 WebPageTest 实测对比 WordPress 图片迁移到 media 子域名后,EdgeOne 仍然出现大量 301 的排查与处理记录

Linux 服务器运维、部署与线上故障排查

如果你的网站或后端服务部署在 Linux 服务器上,遇到访问异常、Nginx 配置问题、MySQL / Redis 异常、Docker 服务不可用、磁盘占满、CPU / 内存过高等问题,可以联系我做一次远程排查。

适合以下场景:
✅ 网站打不开或访问不稳定
✅ Nginx / PHP-FPM 配置异常
✅ MySQL / Redis 性能或连接问题
✅ Docker 服务部署与维护
✅ 服务器迁移与环境配置
✅ CPU / 内存 / 磁盘异常排查

服务内容:
✅ Linux 环境检查
✅ 网站部署与迁移
✅ Nginx / PHP-FPM / MySQL / Redis 排查
✅ Docker 配置与维护
✅ 服务器性能分析
✅ 长期远程运维支持

如需咨询,请联系我,并注明:Linux 运维咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理