admin 发表于 昨天 21:17

在 Discuz 论坛中结合 腾讯云 EO (EdgeOne)、对象存储 (COS) 和 二级域名 来实现高效的“读图分离”

在 Discuz 论坛中结合 **腾讯云 EO (EdgeOne)**、**对象存储 (COS)** 和 **二级域名** 来实现高效的“读图分离”(即图片/附件通过独立的加速域名加载),是目前提升论坛性能的最佳实践。

由于腾讯云 CDN/ECDN 已全面升级为 **EO (EdgeOne)**,且 Discuz 原生对云存储的支持通常依赖插件或远程附件功能,以下是基于 2026 年最新环境的完整配置流程:

### 核心架构思路
1.**存储层**:使用 **腾讯云 COS** 存储所有论坛附件和图片。
2.**加速层**:使用 **腾讯云 EO (EdgeOne)** 绑定一个二级域名(如 `img.yourdomain.com`),回源指向 COS 存储桶。
3.**应用层**:在 **Discuz 后台** 配置远程附件,将图片上传路径指向该二级域名。

---

### 第一步:准备 COS 存储桶 (Storage)

1.**创建存储桶**:
    *   登录腾讯云控制台,搜索“对象存储 COS”。
    *   创建一个存储桶(Bucket),建议选择与你的服务器同地域(减少内网传输费,虽然后台上传走公网,但管理方便)。
    *   **权限设置**:建议设置为 **公有读私有写**(Public Read)。这样 EO 回源时不需要复杂的鉴权配置,直接读取文件即可。
    *   **记录信息**:记下 `存储桶名称` 和 `所属地域`。

2.**配置 CORS (跨域资源共享)** (重要):
    *   在 COS 控制台找到该存储桶 -> 基础配置 -> 跨域设置 (CORS)。
    *   添加规则:允许来源 `*`,允许方法 `GET, POST, PUT`,允许头部 `*`。这能防止浏览器拦截图片加载。

---

### 第二步:配置腾讯云 EO (EdgeOne) 加速

这是替代旧版 CDN 的关键步骤。

1.**接入站点**:
    *   登录 [腾讯云 EO 控制台](https://console.cloud.tencent.com/edgeone)。
    *   点击 **“添加站点”**。
    *   **输入域名**:输入你准备好的二级域名,例如 `img.yourdomain.com` 或 `cdn.yourdomain.com`。
    *   **选择套餐**:根据流量需求选择免费版或付费版(个人小站免费版通常够用)。

2.**配置回源 (Origin)**:
    *   在站点配置页面,找到 **“回源配置”**。
    *   **源站类型**:选择 **“对象存储 COS”** (如果列表中有) 或者 **“IP/域名”**。
      *   *推荐方式*:选择 **自定义源站 (域名)**。
      *   **源站地址**:填写 COS 的默认访问域名。
            *   格式通常为:`<BucketName>-<AppID>.cos.<Region>.myqcloud.com`
            *   例如:`example-1250000000.cos.ap-guangzhou.myqcloud.com`
            *   *注意*:请在 COS 控制台概览页复制该域名,不要填错。
    *   **协议跟随**:建议开启 HTTPS 回源(如果你的 COS 支持)或 HTTP 回源(COS 默认支持 HTTP)。

3.**配置缓存规则**:
    *   在 **“缓存配置”** 中,针对图片后缀设置较长的缓存时间。
    *   添加规则:文件后缀 `.jpg, .png, .gif, .webp, .bmp`,缓存过期时间建议设置为 **30 天** 或 **1 个月**。这能极大减少回源流量,提升加载速度。

4.**验证 CNAME 解析**:
    *   EO 会分配给你一个 CNAME 地址(例如 `img.yourdomain.com.edgeone.net` 或类似)。
    *   前往你的 **域名解析控制台** (DNSPod 或其他)。
    *   添加一条记录:
      *   主机记录:`img` (对应二级域名前缀)
      *   记录类型:`CNAME`
      *   记录值:填入 EO 提供的 CNAME 地址。
    *   等待生效(通常几分钟)。

5.**HTTPS 证书**:
    *   在 EO 控制台的 “SSL 证书” 选项中,申请并部署免费证书,确保 `https://img.yourdomain.com` 可以正常访问。

---

### 第三步:Discuz 后台配置 (应用层)

Discuz X3.5 及更新版本通常推荐使用插件来完美支持 COS,原生远程附件功能对 COS 的支持较为有限(主要支持 FTP/SFTP)。

#### 方案 A:使用官方/第三方 COS 插件(推荐,最稳定)
目前 Discuz 应用中心有成熟的“腾讯云 COS”插件(如由 Discuz 官方或社区大神开发)。

1.**下载安装插件**:
    *   进入 Discuz 后台 -> “插件” -> “获取更多插件”。
    *   搜索关键词 `COS` 或 `腾讯云`。
    *   安装并启用插件(例如“发帖图片附件上传 COS”)。
2.**配置插件参数**:
    *   进入插件设置页面,填入以下信息:
      *   **SecretId / SecretKey**:在腾讯云 CAM 访问管理中创建的子账号密钥(建议只给 COS 读写权限)。
      *   **Bucket**:你的存储桶名称。
      *   **Region**:存储桶地域(如 `ap-guangzhou`)。
      *   **访问域名 (URL)**:**关键步骤**,这里填入你配置好 EO 的二级域名,例如 `https://img.yourdomain.com`。
            *   *原理*:插件上传文件到 COS 后,生成链接时会自动拼接这个域名,用户访问时就会走 EO 加速。
3.**迁移旧数据 (可选)**:
    *   部分高级插件提供“一键迁移”功能,可将服务器上旧的 `attachment` 目录图片同步到 COS。如果没有,可手动使用 COS 迁移工具。

#### 方案 B:使用 Discuz 原生“远程附件”功能 (仅限 FTP 模式,不推荐直连 COS)
*注意:Discuz 原生的远程附件主要针对 FTP/SFTP 服务器。虽然可以通过挂载 COS 为本地磁盘(使用 cosfs)来“欺骗”Discuz,但这在并发高时极不稳定,**强烈不建议**用于生产环境。*
如果你坚持要用原生功能,必须配合 **cosfs** 将 COS 挂载为服务器本地目录,然后将远程附件设置为“本地”,但这失去了云存储的意义。因此,**请务必采用方案 A (插件法)**。

---

### 第四步:验证与优化

1.**测试上传**:
    *   在论坛发布一个带图的帖子。
    *   右键点击图片,选择“在新标签页打开图片”。
    *   检查 URL 是否为 `https://img.yourdomain.com/...`。
    *   检查响应头(Response Headers),看是否有 `X-Cache-Lookup` 或 `Via` 等 EO 相关的标识,确认是否命中缓存。

2.**防盗链配置 (安全)**:
    *   **在 EO 控制台**:找到 “访问控制” -> “Referer 黑白名单”。
    *   设置 **白名单**:允许 `*.yourdomain.com` 和空 Referer (部分浏览器直接打开图片时为空)。
    *   这样可以防止别人直接在他们的网站引用你的图片消耗你的 EO 流量。

3.**混合内容检查**:
    *   确保你的 Discuz 全站开启了 HTTPS。
    *   如果论坛是 HTTPS,而图片域名配置的是 HTTP,浏览器会报“混合内容”错误并不显示图片。务必保证 EO 绑定的二级域名也启用了 HTTPS。

### 常见问题排查

*   **图片无法显示 (403 Forbidden)**:
    *   检查 COS 存储桶权限是否为“公有读”。
    *   检查 EO 的回源域名是否正确。
    *   检查 EO 或 COS 是否开启了防盗链,而你的请求没有带正确的 Referer。
*   **上传图片慢**:
    *   上传过程是 `用户 -> 服务器 -> COS`。EO 只加速下载(读),不加速上传(写)。
    *   若要加速上传,需要服务器与 COS 在同一地域(走内网),或者在插件中开启“客户端直传 COS”功能(部分高级插件支持,可绕过服务器带宽)。
*   **旧图片链接未变**:
    *   数据库中存储的旧图片链接仍然是老域名。你需要运行 SQL 语句批量替换,或使用插件自带的“历史数据迁移/链接替换”功能。
    *   SQL 示例 (请备份数据库后操作):
      ```sql
      UPDATE pre_forum_attachment SET attachurl = REPLACE(attachurl, 'http://old-domain.com/', 'https://img.yourdomain.com/');
      -- 注意:Discuz 图片路径可能分散在 pre_forum_attachment, pre_forum_post 等表中,具体需根据插件逻辑处理,通常插件会自动处理新帖,旧帖需专用工具。
      ```

通过以上步骤,你的 Discuz 论坛即可实现静态资源与动态内容的彻底分离,利用腾讯云 EO 的全球节点加速图片加载,显著提升用户体验。

穿过黑夜 发表于 昨天 21:18

这个技巧简单但很有效,推荐!
页: [1]
查看完整版本: 在 Discuz 论坛中结合 腾讯云 EO (EdgeOne)、对象存储 (COS) 和 二级域名 来实现高效的“读图分离”