作为一个刚学 Linux 没多久的新手站长,最近的几天简直是“渡劫”。
前段时间刚完成网站部署,把服务器上的 PHP 版本从旧版本升到了 8.2.31,心里正美滋滋地觉得“这下稳了”,结果转头就看到群里和各大技术论坛炸锅了——PHP 大逃杀开始了!
那个叫 PHP2Shell 的漏洞(CVE-2026-109618/19)简直让人头皮发麻。简单来说,就是黑客甚至不需要密码,只要你的 PHP 配置稍微有点“个性”,就能直接远程控制你的服务器。看着网上那些“严阵以待”的帖子,我低头看了一眼自己的 8.2.31,心想:得,白干了,赶紧升!
我查了一下,PHP 官方给出的修复版本是:
- PHP 8.2 要升级到 8.2.35
- PHP 8.3 要升级到 8.3.36
- PHP 8.4 要升级到 8.4.27
- PHP 8.5 要升级到 8.5.12
于是,我又含泪把 PHP 紧急更新到了最新的 8.2.35。升级完还不能只换二进制文件,必须重启 PHP-FPM、Apache 或者所有常驻 worker,不然旧进程还在跑旧代码,补丁等于没打。
折腾完 PHP,看着终端里跳动的代码,我突然意识到一个问题:
既然服务器这么容易“出事”,那我的数据是不是也该分散一下风险?而且,如果记录越写越多,图片视频占满了本地磁盘,每次备份都慢得像蜗牛。万一哪天服务器真被“日”了,本地数据连同系统一起完蛋,那才叫欲哭无泪。
我想给磁盘“扩存”,但囊中羞涩。
作为一名菜鸟,我的原则是:能免费绝不花钱,能自动化绝不手动。
全网免费方案大比拼
在寻找方案时,我对比了几个主流对象存储:
- AWS S3:老牌稳定,但那个计费规则复杂得像天书,而且免费额度只有 12 个月,过了就得掏钱,pass。
- Backblaze B2:便宜是真便宜,但配置起来对新手不太友好,而且没有免流量费,下载图片还要额外交钱。
- Cloudflare R2:就是它了!
- 每月 10GB 免费存储。
- 最关键的是:免流量费(Egress Free)! 这意味着网站图片被访问多少次都不扣钱。
- 兼容 AWS S3 API,以后想换别的也容易。
核心思路:不仅要存,还要“防”
虽然 R2 有 10GB 免费额度,但我这种新手最怕什么?怕手滑,怕失控。
万一我哪天不小心传了个 4K 电影上去,或者哪个插件抽风疯狂上传图片,瞬间把这 10GB 用超了,Cloudflare 可是会按量扣费的(虽然也不贵,但那是钱啊!)。
所以,我决定做一个 “双保险” 方案:
- 主存储:平时上传的图片、附件,全部走 R2,释放本地磁盘压力。
- 自动熔断(看门狗):写一个 Shell 脚本,每天检查一次 R2 用了多少。
- 如果用量 < 10GB:一切正常,继续传 R2。
- 如果用量 > 10GB:触发熔断! 脚本自动修改 WordPress 设置,把上传路径切回本地磁盘。哪怕本地磁盘慢一点,也不能让钱包流血!
下面分享我是怎么把这个“看门狗”跑起来的。
第一步:环境准备
你需要安装两个神器:
- AWS CLI:用来跟 R2 对话,查询用了多少空间。
- WP-CLI:WordPress 的命令行工具,用来在脚本里自动修改 WP 的配置(不用进后台点鼠标)。
第二步:编写“看门狗”脚本
这是我写的 check_r2.sh,逻辑很简单:
#!/bin/bash
# ======================= 配置区 =======================
R2_BUCKET="你的bucket名"
R2_ENDPOINT="https://你的endpoint.r2.cloudflarerestorage.com"
R2_ACCESS_KEY="你的AccessKey"
R2_SECRET_KEY="你的SecretKey"
LIMIT_MB=10445
WP_ROOT="/你的网站路径"
LOG="/var/log/r2_usage.log"
OFFLOAD_OPTION="advmo_offload_enabled"
# =====================================================
# 1. 计算 R2 当前已用空间(MB)
TOTAL=$(aws s3 ls "s3://${R2_BUCKET}/" \
--endpoint-url "${R2_ENDPOINT}" \
--recursive \
--region auto \
--aws-access-key-id "${R2_ACCESS_KEY}" \
--aws-secret-access-key "${R2_SECRET_KEY}" \
2>/dev/null | awk '{sum += $3} END {printf "%.0f", sum/1024/1024}')
# 2. 记录日志
NOW=$(date "+%Y-%m-%d %H:%M:%S")
echo "[${NOW}] 当前 R2 已用空间: ${TOTAL} MB" >> "${LOG}"
# 3. 判断是否超过阈值
if [ "${TOTAL}" -gt "${LIMIT_MB}" ]; then
echo "[${NOW}] ⚠️ 警告:R2 空间接近阈值,正在暂停 R2 写入!" >> "${LOG}"
# 4. 关闭 R2 写入,新文件回退到本地磁盘
cd "${WP_ROOT}" && wp option update "${OFFLOAD_OPTION}" 0 --allow-root
if [ $? -eq 0 ]; then
echo "[${NOW}] ✅ 已成功暂停 R2 写入,新文件将保存到本地磁盘。" >> "${LOG}"
else
echo "[${NOW}] ❌ 修改 WordPress 设置失败,请检查 option key 和网站路径。" >> "${LOG}"
fi
else
echo "[${NOW}] ✅ 正常:R2 空间充足(阈值约 10.2GB),继续保持自动上传。" >> "${LOG}"
fi
第三步:设置定时任务 (Crontab)
为了让它每天晚上自动跑,我在终端输入 crontab -e,加入了一行定时任务:0 2 * * * bash /root/check_r2.sh
装完后手动测试一下:
bash /root/check_r2.sh
然后看日志:
cat /var/log/r2_usage.log
如果能看到类似输出:
[2026-10-23 09:08:28] 当前 R2 已用空间: 0 MB
[2026-10-23 09:08:28] ✅ 正常:R2 空间充足(阈值约 10.2GB),继续保持自动上传。
就说明脚本已经跑通了。
成本控制与心得
这次折腾下来,我最大的感触是:安全不仅仅是打补丁,更是对资源的掌控。
- 关于 PHP 升级:不要迷信“最新版”,也不要停留在“旧版”。关注像
PHP 大逃杀这样的安全动态,保持小版本的及时更新(比如 8.2.31 -> 8.2.35)是必须的。 - 关于 R2 成本:
- 存储:控制在 10GB 以内 = 0元。
- 流量:R2 免流量费 = 0元。
- 请求数:博客访问量通常达不到 1000 万次 Class B 操作,基本也是 0元。
- 结论:只要加上了那个“熔断脚本”,这就相当于一个永久免费的无限流量图床(限 10GB)

Comments NOTHING