为什么需要启用附件服务器?
在理解如何配置之前,我们先明白它的好处:

(图片来源网络,侵删)
- 减轻主服务器负载:将大量的图片、下载文件等静态资源存放在另一台服务器(通常是专门的对象存储或云存储),主服务器只需处理PHP和数据库请求,负载大大降低。
- 提高网站访问速度:附件服务器可以配置在离用户更近的CDN节点,用户访问附件时速度更快,主服务器响应速度也会因为负载减轻而提升。
- 数据隔离与安全:附件服务器与主站分离,即使附件服务器出现问题,也不会直接影响主站的数据库和程序,提高了安全性。
- 成本优化:通常云存储(如阿里云OSS、腾讯云COS)的成本比购买同等带宽和存储的云服务器要低,性价比更高。
- 易于扩展:当网站流量激增时,只需扩展附件服务器的存储和带宽,而无需改动主站架构。
准备工作
在开始配置之前,你需要准备好以下东西:
- 一台附件服务器:这台服务器可以是:
- 独立的云服务器:你可以在上面配置Nginx或Apache来提供文件服务。
- 对象存储服务:这是目前最推荐的方式,如阿里云OSS、腾讯云COS、七牛云等,它们提供了稳定、高可用且易于集成的API。
- 附件服务器的信息:
- 服务器域名/IP地址:
img.yourdomain.com。 - FTP/SFTP信息:如果你使用的是云服务器,你需要FTP/SFTP账号密码来上传文件。
- API密钥:如果你使用的是对象存储,你需要AccessKey ID和Secret AccessKey。
- 存储空间名称(Bucket):对象存储特有。
- 服务器域名/IP地址:
- 主站的DedeCMS程序:确保你有修改核心文件和数据库的权限。
配置步骤
我们将分为主站配置和附件服务器配置两大部分。
第一部分:主站DedeCMS配置
这是核心步骤,主要在DedeCMS的后台完成。
步骤1:开启附件分离功能
-
登录你的DedeCMS后台。
-
进入 【系统】 -> 【基本参数设置】。
-
在左侧菜单中找到 【附件设置】。
-
找到以下关键选项并进行设置:
是否启用远程站点:选择“是”,这是启用附件服务器的总开关。远程站点URL:填写你的附件服务器的访问域名。https://img.yourdomain.com。请确保这个域名可以正常访问。远程站点登录帐号:填写附件服务器的FTP/SFTP登录用户名。远程站点密码:填写对应的密码。远程站点上传目录:指定一个在附件服务器上的上传目录,uploads/或d/,DedeCMS会自动在这个目录下创建年月日文件夹(如uploads/2025/10/)。远程站点是否使用被动模式:如果你的附件服务器是云服务器,并且防火墙配置严格,可以尝试开启“是”,对于大多数情况,保持默认“否”即可,对于对象存储,此项无效。远程站点是否启用水印:根据你的需求选择,如果水印功能由附件服务器(如对象存储)处理,这里可以选“否”。远程站点是否生成缩略图:同上,如果缩略图处理在附件服务器进行,这里可以选“否”。
-
点击 【保存】。
步骤2:修改 config_updatebody.php 文件(重要!)
这个文件的作用是当你在后台编辑文章时,如果文章内容中的图片路径是旧的本地路径,系统会自动将其替换为新的远程路径。
- 使用FTP或文件管理器,登录你的网站服务器。
- 找到并打开
/include/helpers/目录下的config_updatebody.php文件。 - 找到
$cfg_uploaddir这个变量,它的值通常是../uploads。请确保这个值指向你网站本地的上传目录,并且与config_base.php中的设置保持一致。 - (可选但推荐) 检查
$remote_uploaddir变量,它应该指向你设置的远程上传目录,通常保持默认即可。
步骤3:修改 dede/archives_do.php 文件(解决缩略图问题)
默认情况下,DedeCMS只对文章正文中的图片进行远程替换,而不会处理文章缩略图,我们需要手动修改代码来解决这个问题。
- 使用FTP或文件管理器,打开
/dede/archives_do.php文件。 - 找到
UploadAdmin函数(大约在文件的第300行左右)。 - 在这个函数内部,找到处理缩略图的代码段,通常是一个
if语句,判断$litpic是否为空。 - 在这个
if语句内部,找到执行上传的代码if($mtag=='upload'){...},并在其中添加与正文图片上传相同的远程上传逻辑。
这是一个关键的代码修改示例(请根据你的DedeCMS版本微调):
// 在 UploadAdmin 函数中,找到处理缩略图的 if 语句内
if($litpic!='' && is_uploaded_file($litpic))
{
// ... 原有的文件类型、大小检查代码 ...
// 将下面的上传代码替换为支持远程上传的版本
$litpic_up = $attDir.'/'.$filename;
// 上传到本地(为了后续处理)
move_uploaded_file($litpic, $cfg_basedir.'/'.$litpic_up);
// --- 关键修改:添加远程上传逻辑 ---
if($cfg_updomain=='Y' && $ftp->connect())
{
// 远程上传
$remote_success = $ftp->upload($cfg_basedir.'/'.$litpic_up, $cfg_updir.'/'.$litpic_up);
if($remote_success)
{
// 如果远程上传成功,则删除本地文件,并更新数据库中的路径为远程路径
@unlink($cfg_basedir.'/'.$litpic_up);
$litpic_up = $cfg_updir.'/'.$litpic_up; // 更新路径为远程路径
}
$ftp->close();
}
// --- 修改结束 ---
// ... 后续的入库操作 ...
}
注意:这个修改有一定技术难度,如果你不熟悉代码操作,可以寻找一个现成的补丁文件,或者咨询专业的技术人员。
步骤4:上传附件测试
- 进入 【核心】 -> 【文件管理器】。
- 尝试上传一个文件(图片、文档等)。
- 上传成功后,检查文件管理器中的文件路径,你会发现,文件的路径已经变成了你在
远程站点URL中设置的域名,而不是本地的/uploads路径。 - 前台访问该文件,确认可以正常打开。
第二部分:附件服务器配置
附件服务器的配置取决于你选择的是哪种类型。
场景A:使用对象存储(阿里云OSS / 腾讯云COS 等)
这是最简单的方式,因为DedeCMS有现成的插件支持。
- 下载插件:
- 阿里云OSS插件:在DedeCMS官方论坛或插件市场搜索 "DedeCMS 阿里云OSS"。
- 腾讯云COS插件:同理搜索 "DedeCMS 腾讯云COS"。
- 安装插件:将插件上传到
/dede/plugin/目录下,然后在后台 【插件】 -> 【插件管理】** 中安装并启用。 - 配置插件:启用插件后,通常会在 【系统】 -> 【附件设置】** 中出现一个新的配置项(如“阿里云OSS配置”),填入你的AccessKey ID、Secret AccessKey、Endpoint(地域节点)、Bucket名称等信息。
- 选择上传模式:在插件设置中,选择“覆盖”或“同步”模式,通常选择“覆盖”模式,即文件只存在于OSS上,本地不保留。
场景B:使用独立的云服务器
这种方式需要你在附件服务器上手动配置。
- 安装Web服务器:在附件服务器上安装 Nginx 或 Apache。
- 配置网站:
- 创建一个网站,域名指向
img.yourdomain.com。 - 将网站根目录指向一个专门用于存放附件的文件夹,
/home/wwwroot/uploads。 - 配置Nginx/Apache,使其可以列出和下载文件,但通常不执行PHP脚本,以提高安全性。
- 创建一个网站,域名指向
- 创建FTP/SFTP用户:
- 为DedeCMS创建一个专用的FTP/SFTP用户。
- 设置其主目录为
/home/wwwroot/uploads,并给予读写权限。
- 配置防火墙:确保附件服务器的21端口(FTP)或22端口(SFTP)是开放的,并且只允许你的主站服务器的IP访问。
常见问题与注意事项
- 图片无法显示,显示为 broken link:
- 检查
远程站点URL:是否填写正确,且该域名可以访问。 - 检查附件服务器:附件服务器上的文件是否存在?Web服务是否正常?
- 检查路径:数据库中存储的路径是否正确。
- 检查
- 后台编辑文章时,图片路径没有自动更新:
- 检查
config_updatebody.php:确保$cfg_uploaddir的路径正确。 - 检查文件权限:确保DedeCMS有权限读取和修改这个文件。
- 检查
- 缩略图没有上传到远程服务器:
- 这是最常见的问题,请务必按照 步骤3 修改
archives_do.php文件。
- 这是最常见的问题,请务必按照 步骤3 修改
- 使用对象存储时,图片显示的是下载链接而不是直接预览:
这通常是因为你的Bucket权限设置成了“私有读写”,你需要将其修改为“公共读”,或者在对象存储的控制台配置“静态网站托管”或“防盗链”白名单,将你的主站域名加入白名单。
- 数据迁移:如果你想让之前已经上传到本地的附件也迁移到远程服务器,可以编写一个脚本,遍历本地的
/uploads目录,通过FTP或API将文件逐个上传到远程服务器,并同时更新数据库中的路径,这个过程比较复杂,请谨慎操作。
启用DedeCMS附件服务器是一个“牵一发而动全身”的操作,虽然配置过程略显繁琐,但带来的性能和安全提升是巨大的。强烈建议使用对象存储服务,因为它比自建FTP服务器更稳定、更安全、也更易于管理。
按照以上步骤,一步步来,大部分问题都能得到解决,如果在操作中遇到具体问题,可以随时提出,我会尽力为你解答。
