DedeCMS 本身不提供独立的图片服务器管理后台,它主要通过修改配置和代码,将上传的图片资源(附件)分发到指定的服务器上。
核心原理
DedeCMS 的图片服务器方案主要有两种实现思路:
-
独立服务器 + 域名 (最常用、最推荐)
- 原理:准备一台独立的服务器(可以是云服务器,如阿里云、腾讯云),专门用于存放图片,在这台服务器上搭建一个简单的 Web 服务(如 Nginx),并绑定一个独立的域名(如
img.yourdomain.com),然后修改 DedeCMS 的上传和显示逻辑,将图片上传到这台新服务器,并在前台页面中以新域名的形式进行引用。 - 优点:真正实现了物理分离,可以为主服务器分担大量带宽和 I/O 压力,并且可以为图片服务器配置不同的缓存策略,性能提升非常明显。
- 缺点:需要额外购买服务器和域名,配置相对复杂一些。
- 原理:准备一台独立的服务器(可以是云服务器,如阿里云、腾讯云),专门用于存放图片,在这台服务器上搭建一个简单的 Web 服务(如 Nginx),并绑定一个独立的域名(如
-
CDN (Content Delivery Network) 加速
- 原理:将 DedeCMS 主站上传的图片作为源站,然后接入 CDN 服务(如阿里云 CDN、腾讯云 CDN、Cloudflare 等),用户访问图片时,会从离他最近的 CDN 节点获取,而不是从你的主服务器。
- 优点:全球加速,访问速度最快,能极大减轻源站(主服务器)的压力,服务商提供完善的控制台和管理功能。
- 缺点:通常是付费服务(有免费额度),配置需要一定的网络知识。
下面,我们将重点讲解第一种方案(独立服务器 + 域名)的具体操作步骤,因为它更具通用性和代表性。
详细实施步骤(独立服务器 + 域名方案)
假设我们有以下信息:
- 主站域名:
www.yourdomain.com - 图片服务器域名:
img.yourdomain.com - 主站服务器:IP
A.A.A.A - 图片服务器:IP
B.B.B.B
第一步:配置图片服务器 (B.B.B.B)
-
安装 Web 服务:在图片服务器上安装 Nginx 或 Apache,这里以 Nginx 为例。
# CentOS/RHEL yum install nginx -y # Ubuntu/Debian apt-get install nginx -y
-
创建网站目录:创建一个用于存放图片的目录。
mkdir -p /data/images # 设置目录权限,确保 Web 服务器用户有读写权限 chown -R nginx:nginx /data/images chmod -R 755 /data/images
-
配置 Nginx:编辑 Nginx 配置文件,
/etc/nginx/conf.d/img.yourdomain.com.conf。server { listen 80; server_name img.yourdomain.com; # 设置网站根目录 root /data/images; index index.html index.htm; # 图片缓存策略,建议设置长缓存时间 location ~* \.(jpg|jpeg|png|gif|bmp|swf)$ { expires 30d; # 缓存30天 add_header Cache-Control public; } # 其他文件类型(如JS、CSS)也可以设置缓存 location ~* \.(js|css)$ { expires 7d; add_header Cache-Control public; } # 记录访问日志 access_log /var/log/nginx/img.yourdomain.com.access.log; error_log /var/log/nginx/img.yourdomain.com.error.log; } -
启动并测试 Nginx:
nginx -t # 检查配置文件语法 systemctl start nginx # 启动服务 systemctl enable nginx # 设置开机自启
直接在浏览器访问
http://img.yourdomain.com,应该能看到 Nginx 的欢迎页面或目录列表(如果目录为空)。注意:DNS 需要解析正确。
第二步:配置域名解析
在你的域名解析服务商(如阿里云、腾讯云DNSPod)后台,为 img.yourdomain.com 添加一个 A 记录,指向图片服务器的 IP 地址 B.B.B.B。
第三步:修改 DedeCMS 主站配置 (A.A.A.A)
这是最关键的一步,需要修改 DedeCMS 的核心文件来实现上传和显示的分离。
-
修改
dede/config.php文件找到
config.php文件,修改以下配置项:// ... 其他配置 ... /** * 附件服务器配置 * 如果配置了此项,则上传的附件会保存到该服务器 * 格式: 'ftp://用户名:密码@IP地址:端口/网站目录/' * 注意:这里我们先用 FTP 方式来演示,因为它最通用。 */ $cfg_ftp_host = 'ftp://img.yourdomain.com'; // 图片服务器域名 $cfg_ftp_port = 21; // FTP端口 $cfg_ftp_user = 'your_ftp_user'; // 图片服务器上创建的FTP用户 $cfg_ftp_pass = 'your_ftp_password'; // FTP密码 $cfg_ftp_root = '/'; // FTP根目录,对应图片服务器的 /data/images /** * 附件目录配置 * 上传的附件保存在哪个目录下 */ $cfg_medias_dir = '/uploads/allimg/'; // 保持默认即可 // ... 其他配置 ...
注意:你需要在图片服务器上为 Nginx 用户(如
nginx)创建一个 FTP 账户,并确保该账户有对/data/images目录的读写权限。 -
修改
/include/dedeproject.class.php文件 (可选,用于直接上传)如果你的图片服务器支持 FTP,DedeCMS 版本较新,
config.php的配置可能已经足够,但如果遇到问题,可以手动修改此文件来确保上传逻辑正确,搜索UploadFile相关方法,检查是否使用了$cfg_ftp_host等配置。 -
修改前台模板文件,替换图片域名
这是最直接的方法,适用于所有 DedeCMS 版本。
- 找到你的前台模板文件(通常是
/templets/default/目录下的.htm文件)。 - 使用
str_replace函数或修改标签,将原来的图片路径(/uploads/...)替换为新的图片域名。
示例: 在需要显示文章内容的地方,通常使用
{dede:field.body/}标签,你可以创建一个自定义函数或使用插件来处理这个标签。方法A:直接修改模板(不推荐,内容多时麻烦)
<!-- 原始写法 --> <img src="{dede:field.litpic/}" alt="{dede:field.title/}" /> <!-- 修改后 --> <img src="http://img.yourdomain.com{dede:field.litpic/}" alt="{dede:field.title/}" />方法B:修改
arclist.lib.php标签文件(推荐,一劳永逸)-
打开
/include/taglib/arclist.lib.php文件。 -
找到处理
litpic(缩略图)的代码段,通常在GetArcList函数内。 -
在返回
$litpic之前,添加一行代码进行替换:// ... 原始代码 ... $litpic = $arc->Fields['litpic']; // 在这里添加替换逻辑 if (strpos($litpic, '/uploads/') !== false) { $litpic = str_replace('/uploads/', 'http://img.yourdomain.com/uploads/', $litpic); } return $litpic; -
对
listimg.lib.php做同样操作,因为列表页的缩略图也用到了这个逻辑。
方法C:使用正则表达式全局替换(最彻底) 如果你的网站已经上线,内容很多,可以使用数据库工具或编写一个简单的 PHP 脚本,对
#@__uploads或#@__addonarticle等表中的body、litpic等字段进行全局替换,将/uploads/替换为http://img.yourdomain.com/uploads/。 - 找到你的前台模板文件(通常是
第四步:测试
- 上传测试:登录 DedeCMS 后台,发布一篇新文章,上传几张图片,检查图片服务器的
/data/images/uploads/目录下是否成功生成了文件。 - 访问测试:在前台页面查看这篇文章,检查图片是否能正常显示,浏览器开发者工具中的网络请求,图片的 URL 应该是
http://img.yourdomain.com/...的形式。
进阶方案:使用 Nginx 反向代理
如果你不想配置 FTP,并且图片服务器和主站服务器在同一内网,可以使用 Nginx 的 proxy_pass 功能。
-
图片服务器 Nginx 配置:
server { listen 192.168.1.100:8080; # 监听内网端口,不对外 root /data/images; } -
主站服务器 Nginx 配置:
location /uploads/ { # 将所有对 /uploads/ 的请求,反向代理到图片服务器 proxy_pass http://192.168.1.100:8080/; # 可以设置一些代理头 proxy_set_header Host $host; }这种方式更高效,但需要服务器在同一内网。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 独立服务器 + 域名 | 真正分离,性能提升明显,可控性强 | 需要额外成本和配置,运维稍复杂 | 中大型网站,图片站,对性能有较高要求的站点 |
| CDN 加速 | 速度最快,全球覆盖,减轻源站压力 | 通常是付费服务,配置有门槛 | 访问用户遍布全球,追求极致加载速度的网站 |
| Nginx 反向代理 | 配置简单,无需 FTP,内网传输快 | 服务器需在同一内网,灵活性稍差 | 多台服务器在同一内网的私有部署环境 |
对于大多数用户来说,“独立服务器 + 域名” 是最平衡、最实用的选择,请根据你的实际需求和资源选择合适的方案。
