从 PHP 漏洞惊魂到 R2 自动化熔断:一个 Linux 菜鸟的服务器自救指南

Rubick 发布于 7 天前 45 次阅读


作为一个刚学 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 可是会按量扣费的(虽然也不贵,但那是钱啊!)。

所以,我决定做一个 “双保险” 方案:

  1. 主存储:平时上传的图片、附件,全部走 R2,释放本地磁盘压力。
  2. 自动熔断(看门狗):写一个 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),继续保持自动上传。

就说明脚本已经跑通了。

成本控制与心得

这次折腾下来,我最大的感触是:安全不仅仅是打补丁,更是对资源的掌控。

  1. 关于 PHP 升级:不要迷信“最新版”,也不要停留在“旧版”。关注像 PHP 大逃杀 这样的安全动态,保持小版本的及时更新(比如 8.2.31 -> 8.2.35)是必须的。
  2. 关于 R2 成本:
    • 存储:控制在 10GB 以内 = 0元。
    • 流量:R2 免流量费 = 0元。
    • 请求数:博客访问量通常达不到 1000 万次 Class B 操作,基本也是 0元。
    • 结论:只要加上了那个“熔断脚本”,这就相当于一个永久免费的无限流量图床(限 10GB)

  • reward_image1
此作者没有提供个人介绍。
最后更新于 2026-10-23