在Linux环境下实现网页自动同步,核心思路是通过文件监控工具捕捉网页目录的变化,再调用同步工具将变更内容推送到目标服务器,整个过程无需人工干预,适合网站频繁更新的场景。

核心组件说明
实现该功能需要用到三个核心组件:
- inotify-tools:Linux内核提供的文件系统监控工具,可以实时监听目录下的文件创建、修改、删除等操作。
- rsync:高效的文件同步工具,支持本地与远程、远程与远程之间的文件传输,只会传输变更的内容,节省带宽。
- shell脚本:将监控和同步逻辑组合起来,实现自动触发同步流程。
环境准备与工具安装
首先确保两台服务器(源服务器存放本地网页文件,目标服务器是网页实际运行的服务器)都已经安装rsync,源服务器额外需要安装inotify-tools。
安装rsync
大部分Linux发行版默认已经安装rsync,若未安装可以通过包管理器安装:
# CentOS/RHEL系统 yum install -y rsync # Ubuntu/Debian系统 apt-get install -y rsync
安装inotify-tools
仅在源服务器安装即可:
# CentOS/RHEL系统 yum install -y inotify-tools # Ubuntu/Debian系统 apt-get install -y inotify-tools
配置SSH免密登录
rsync通过SSH协议同步文件时,需要源服务器能免密登录目标服务器,避免同步时手动输入密码。
在源服务器执行以下命令生成SSH密钥:
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
将生成的公钥复制到目标服务器:
ssh-copy-id root@192.168.0.1
执行后输入一次目标服务器密码,之后源服务器就可以免密登录目标服务器了。
编写自动同步脚本
在源服务器创建同步脚本,比如命名为web_sync.sh,脚本内容如下:
#!/bin/bash
# 源网页目录,即本地存放网页文件的路径
SRC_DIR="/var/www/html/"
# 目标服务器信息,格式为 用户@IP:目标目录
DEST_SERVER="root@192.168.0.1:/var/www/html/"
# inotify监控的事件类型,包含创建、修改、删除、移动等操作
MONITOR_EVENTS="create,modify,delete,move"
# 日志文件路径
LOG_FILE="/var/log/web_sync.log"
# 启动inotify监控,当目录发生变化时触发rsync同步
inotifywait -mrq --format '%Xe %w%f' -e $MONITOR_EVENTS $SRC_DIR | while read event file
do
echo "$(date '+%Y-%m-%d %H:%M:%S') 检测到文件变化:$event $file" >> $LOG_FILE
# 执行rsync同步,参数说明:
# -avz:归档模式、显示详情、压缩传输
# --delete:删除目标服务器中源服务器不存在的文件,保持两边完全一致
rsync -avz --delete $SRC_DIR $DEST_SERVER >> $LOG_FILE 2>&1
echo "$(date '+%Y-%m-%d %H:%M:%S') 同步完成" >> $LOG_FILE
done
给脚本添加可执行权限:
chmod +x /var/www/web_sync.sh
后台运行同步脚本
为了让脚本在后台持续运行,不会因为终端关闭而停止,可以使用nohup或者systemd服务的方式运行。
方式一:使用nohup临时运行
nohup /var/www/web_sync.sh > /dev/null 2>&1 &
可以通过ps -ef | grep web_sync.sh查看脚本是否正在运行。
方式二:配置systemd服务(推荐)
创建服务文件/etc/systemd/system/web-sync.service:
[Unit] Description=Web File Auto Sync Service After=network.target [Service] Type=simple ExecStart=/var/www/web_sync.sh Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
启动并设置开机自启:
systemctl daemon-reload systemctl start web-sync systemctl enable web-sync
常见问题排查
- 同步没有触发:检查inotifywait是否正常运行,查看日志文件
/var/log/web_sync.log是否有报错信息。 - 同步失败:检查SSH免密登录是否配置成功,手动执行
rsync -avz /var/www/html/ root@192.168.0.1:/var/www/html/测试是否能正常同步。 - 目录权限问题:确保源目录和目标目录的读写权限正确,rsync执行用户有权限访问对应目录。