在一个服务器(我们称之为“源服务器”)上对网站内容进行修改(如发布文章、上传图片、更新模型等),然后通过某种机制,自动将这些修改同步到另一个或多个服务器(我们称之为“目标服务器”)上。

下面我将从实现原理、具体步骤、推荐方案三个方面进行详细说明。
实现原理
织梦本身没有内置一个完美的“一键式”远程同步功能,所以我们需要借助其他工具或脚本来实现,其核心原理可以分解为以下几个步骤:
- 触发同步:在源服务器上,当有内容变更时(如发布文章),需要有一个“钩子”(Hook)来触发同步脚本,织梦的
index.php文件提供了这样的钩子。 - 传输文件:通过某种方式(如
rsync、FTP、SFTP)将源服务器上变更的文件(如HTML页面、上传的图片)传输到目标服务器。 - 执行命令:如果目标服务器上的内容需要重新生成(织梦的“生成HTML”功能),还需要在目标服务器上执行相应的命令,这通常需要通过SSH密钥认证来实现免密码登录和远程命令执行。
关键文件/目录需要同步:
/data/目录:这是核心!包含了所有文章、栏目、模型、会员等数据,同步这个目录就同步了网站的所有内容数据。/uploads/目录:所有用户上传的附件、图片、视频等。- 生成的HTML文件:位于
/html/目录,如果目标服务器不开启动态浏览,必须同步这些文件。 - 配置文件:
/include/config_base.php等,但通常这些文件在部署后很少改动。
具体实现步骤(以最推荐的 rsync + SSH 方案为例)
rsync 是一个强大的文件同步工具,它可以通过SSH协议进行安全传输,并且只传输变更的文件,效率极高,这是业界最标准、最可靠的方案。

准备工作:在源服务器和目标服务器上配置SSH免密登录
这是实现自动化的关键一步。
-
在源服务器上生成SSH密钥对(如果还没有的话):
ssh-keygen -t rsa
一路按回车即可,默认会在
/root/.ssh/目录下生成id_rsa(私钥) 和id_rsa.pub(公钥)。 -
将公钥复制到目标服务器: 假设目标服务器的IP是
168.1.100,用户名是root。ssh-copy-id root@192.168.1.100
这条命令会提示你输入目标服务器的
root用户密码,执行成功后,你再从源服务器SSH登录到目标服务器,就不需要密码了。
步骤1:在源服务器上安装和配置 rsync
大多数Linux系统默认已安装 rsync,如果没有,可以安装:
# CentOS/RHEL yum install rsync # Debian/Ubuntu apt-get install rsync
步骤2:在源服务器上创建同步脚本
在源服务器上创建一个脚本,/home/sync_dede.sh。
#!/bin/bash
# --- 配置信息 ---
# 源服务器织梦网站根目录
SOURCE_DIR="/www/wwwroot/your_dede_site"
# 目标服务器信息
TARGET_USER="root"
TARGET_HOST="192.168.1.100"
TARGET_DIR="/www/wwwroot/your_dede_site"
# 要同步的目录列表
SYNC_DIRS=("data" "uploads" "html")
# --- 同步逻辑 ---
echo "开始同步织梦网站到 $TARGET_HOST ..."
for DIR in "${SYNC_DIRS[@]}"; do
FULL_SOURCE_DIR="$SOURCE_DIR/$DIR"
FULL_TARGET_DIR="$TARGET_USER@$TARGET_HOST:$TARGET_DIR/$DIR"
if [ -d "$FULL_SOURCE_DIR" ]; then
echo "正在同步目录: $DIR ..."
# rsync命令
# -avz : 归档模式,显示详细过程,压缩传输
# --delete : 删除目标服务器上源服务器没有的文件(保持完全一致)
# --exclude : 排除不需要同步的文件或目录
rsync -avz --delete --exclude='*.log' --exclude='cache' "$FULL_SOURCE_DIR/" "$FULL_TARGET_DIR/"
echo "目录 $DIR 同步完成。"
else
echo "警告: 源目录 $FULL_SOURCE_DIR 不存在,跳过。"
fi
done
echo "所有文件同步完成!"
# (可选) 如果需要在目标服务器上执行命令,可以使用 ssh
# 重新生成首页
# echo "正在在目标服务器上重新生成首页..."
# ssh $TARGET_USER@$TARGET_HOST "cd $TARGET_DIR && php /www/server/panel/plugin/dede/dedetag.php"
给脚本执行权限:
chmod +x /home/sync_dede.sh
你可以手动测试一下这个脚本:
/home/sync_dede.sh
步骤3:修改织梦,在内容更新后触发同步脚本
这是最核心的一步,我们需要修改织梦的核心文件,让它在执行完某个操作后自动调用我们的同步脚本。
场景1:发布/编辑文章后同步
修改文件:/www/wwwroot/your_dede_site/dede/archives_edit.php (或 article_add.php)
在这两个文件的最后,找到类似 ShowMsg('发布成功', ...) 的地方,在它后面加上调用脚本的代码。
示例 (在 archives_edit.php 中):
找到大约第580行左右的代码:
// 原来的代码
ShowMsg('成功更新一篇文档内容!', $backurl);
修改为:
// 原来的代码
ShowMsg('成功更新一篇文档内容!', $backurl);
// --- 新增的同步代码 ---
echo "<script>console.log('开始触发远程同步...');</script>";
// 使用exec()异步执行脚本,避免阻塞用户
exec("/home/sync_dede.sh > /dev/null 2>&1 &");
echo "<script>console.log('远程同步任务已提交。');</script>";
解释:
exec()函数会执行系统命令。> /dev/null 2>&1 &是一个Linux技巧,意思是将标准输出和错误输出都丢弃,并且后台运行(&),这样用户就不会等待同步完成,体验更好。
场景2:上传图片/附件后同步
修改文件:/www/wwwroot/your_dede_site/dede/media_add.php
同样,在成功上传后,添加调用脚本的代码。
场景3:更新栏目后同步
修改文件:/www/wwwroot/your_dede_site/dede/catalog_add.php 和 /www/wwwroot/your_dede_site/dede/catalog_edit.php
注意:
- 备份! 在修改核心文件之前,务必备份原文件!
- 测试! 每次修改后,都要充分测试,确保功能正常。
- 安全性:确保
sync_dede.sh脚本只有所有者有执行权限,避免安全风险。
其他同步方案
除了 rsync + SSH,还有其他一些方案,各有优劣。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
rsync + SSH (推荐) |
高效、安全、可靠、只传增量文件 | 需要配置SSH免密,有一定技术门槛 | 生产环境、多服务器部署、追求性能和稳定性的场景 |
| FTP/SFTP 脚本 | 普遍支持,几乎所有虚拟主机都支持 | 效率低,需要传输所有文件(增量支持差),脚本编写复杂 | 目标服务器是虚拟主机,无法SSH连接时 |
| Git + Webhook | 版本控制,可以追踪变更,适合开发协作 | 配置复杂,不适合频繁的文件内容变更(如上传图片) | 需要版本控制、团队协作开发的项目 |
| 商业CDN/WAF同步 | 配置简单,功能强大,有专业支持 | 成本高,通常按流量或带宽计费 | 大型商业网站,已经在使用CDN服务 |
总结与最佳实践
- 首选方案:对于有服务器管理权限的用户,
rsync + SSH是最佳选择,它免费、高效、稳定。 - 自动化是关键:通过修改织梦核心文件,将同步脚本集成到工作流中,实现“无感知”的自动同步。
- 增量同步:
rsync的核心优势是只同步变更的文件,这大大节省了带宽和时间,尤其是在文件量大的情况下。 - 排除不必要文件:在
rsync命令中使用--exclude参数,排除日志文件、缓存文件等,可以减少同步内容,提高效率。 - 考虑负载:如果目标服务器有多个,可以修改脚本,依次同步到所有目标服务器。
通过以上步骤,你就可以为你的织梦网站建立一个健壮的远程服务器同步系统了。
