公司網站資料量 30GB+,傳統 FTP 全量備份耗時數小時、佔用大量頻寬與磁碟 IO,且無法滿足「保留 3 天歷史版本」的儲存需求。引入 rsync 增量備份:僅傳輸變更塊、保留權限屬性、支援 SSH 加密傳輸、配合 cwRsync 在 Windows 端拉取,單次備份從小時級縮減至分鐘級,磁碟佔用大幅下降。本文記錄完整部署流程。
| 角色 | OS | IP | 軟體 | 方向 |
|---|---|---|---|---|
| 來源端 (Web Server) | Linux (CentOS 7) | 10.0.0.10 | rsync (daemon 模式) | 推送/被拉取 |
| 目的端 (Backup Server) | Windows Server 2016 | 10.0.0.20 | cwRsync (客戶端) | 拉取 |
# 1. 安裝 rsync (CentOS/RHEL)
yum -y install rsync
# 2. 建立配置檔 /etc/rsyncd.conf
cat > /etc/rsyncd.conf <<'EOF'
uid = root
gid = root
use chroot = no
max connections = 5
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
timeout = 300
[webroot]
path = /home/wwwroot
comment = Web Root Backup
read only = true
list = false
hosts allow = 10.0.0.20 # 僅允許備份伺服器 IP
hosts deny = *
# auth users = backupuser # 若需密碼驗證,取消註解並建立密碼檔
# secrets file = /etc/rsyncd.secrets
EOF
# 3. 若啟用密碼驗證
# echo "backupuser:StrongPassword123" > /etc/rsyncd.secrets
# chmod 600 /etc/rsyncd.secrets # 必須 600,否則 rsync 拒絕啟動
# 4. 建立日誌目錄並啟動
mkdir -p /var/log
systemctl start rsyncd
systemctl enable rsyncd
# 5. 防火牆開放 873 埠
firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --reload
rsync.exe, ssh.exe, cygwin1.dll 等)。C:\Program Files\cwRsync)。PATH,或在腳本中使用完整路徑。backup_rsync.bat)@echo off
setlocal enabledelayedexpansion
:: ========== 配置區 ==========
set RSYNC="C:\Program Files\cwRsync\bin\rsync.exe"
set SRC_MODULE=webroot
set SRC_SERVER=10.0.0.10
set DEST_ROOT=F:\Backup\WebServer
set LOG_FILE=F:\Backup\Logs\rsync_%date:~,4%%date:~5,2%%date:~8,2%.log
:: =============================
mkdir "%DEST_ROOT%" 2>nul
mkdir "%DEST_ROOT%\..\Logs" 2>nul
echo [%date% %time%] Starting rsync pull from %SRC_SERVER%::%SRC_MODULE% >> "%LOG_FILE%"
:: -a: 保留權限、時間、符號連結等 (archive)
:: -v: 詳細輸出
:: -z: 壓縮傳輸
:: -h: 人類可讀進度
:: --progress: 顯示進度
:: --delete: 刪除目的端已不存在於來源的檔案 (鏡像模式)
:: --bwlimit=10000: 限制頻寬 10MB/s (避免佔滿業務頻寬,視需求調整)
:: --exclude: 排除快取/日誌/暫存目錄
%RSYNC% -avzh --progress --delete --bwlimit=10000 ^
--exclude="runtime/" ^
--exclude="cache/" ^
--exclude="logs/" ^
--exclude="*.log" ^
--exclude="tmp/" ^
"%SRC_SERVER%::%SRC_MODULE%/" "%DEST_ROOT%/" >> "%LOG_FILE%" 2>&1
SET RSYNC_EXIT=%ERRORLEVEL%
echo [%date% %time%] Rsync finished with exit code %RSYNC_EXIT% >> "%LOG_FILE%"
:: 簡單保留最近 30 天日誌
forfiles /p "%DEST_ROOT%\..\Logs" /m rsync_*.log /d -30 /c "cmd /c del @path" 2>nul
exit %RSYNC_EXIT%
backup_rsync.bat,起始位置設為腳本所在目錄。| 問題 | 原因與解決 |
|---|---|
| 權限拒絕 / Permission denied | Linux 端 path 目錄權限不足,確保 rsync daemon 運行身分 (uid/gid) 可讀取;Windows 端執行排程的帳號需有目的目錄寫入權限。 |
| 密碼檔權限錯誤 | /etc/rsyncd.secrets 必須 chmod 600,且擁有者為 rsync daemon 運行用戶。 |
| 連線逾時 | 檢查防火牆 (Linux: 873/tcp, Windows: 輸出 873)、雲廠商安全群組、VPN/專線連通性。 |
| 增量備份未生效 (每次全量傳輸) | 確認使用 -a (含 -t 保留修改時間);檢查來源/目的端檔案系統時間是否同步 (NTP);避免掛載參數導致 mtime 異常。 |
| 符號連結/硬連結備份異常 | 加上 -H (保留硬連結) -A (保留 ACL) -X (保留擴充屬性) 視需求決定。 |
rsync 本身不提供版本保留,但可結合 --link-dest 實現硬連結快照:
# 每次備份前建立新目錄名 (日期時間)
NEW_DEST="F:\Backup\Snapshots\web_%date:~,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
LATEST_LINK="F:\Backup\Snapshots\latest"
%RSYNC% -avzh --delete --link-dest="%LATEST_LINK%" ^
"%SRC_SERVER%::%SRC_MODULE%/" "%NEW_DEST%/" >> "%LOG_FILE%" 2>&1
:: 更新 latest 連結 (需支援符號連結的檔案系統/工具)
:: Windows 原生不支援 link-dest 硬連結,建議在 Linux 端推送或使用專用備份軟體 (BorgBackup, Restic, Duplicacy)
注意: Windows NTFS 支援硬連結,但 cwRsync 的 --link-dest 相容性不穩。企業級版本保留建議:Linux 端推送至備份儲存 (同為 Linux/NAS),或使用 Restic/BorgBackup/Duplicacy 等現代備份工具原生支援加密、去重、版本保留、跨平台。
rsync + cwRsync 是「低成本、快速落地」的跨平台增量備份經典組合。核心優勢:**只傳差異、保留屬性、支援 SSH/daemon 兩種模式、腳本化易自動化**。配合頻寬限制、排除規則、日誌輪轉、監控告警,即可構建穩定可靠的異地備份體系。對於版本保留、加密、去重等進階需求,建議遷移至 Restic/BorgBackup 等現代工具。
IIS 6.0 架站常見問題完整排查手冊 (含 ASP、權限、MIME、IWAM 同步)
Apache 與 IIS 80 埠衝突解決:修改監聽埠完整指南
Windows Server 2003 內建郵件伺服器 (POP3/SMTP) 完整部署指南
WebService 非同步回調導致資料繫結失敗觸發 w3wp 頻繁回收:線程模型衝突根因分析與修正
Nginx 504 Gateway Time-out 徹底解決方案:fastcgi 參數調優與 php-fpm 核心配置實戰
Active Directory 將電腦加入網域所需權限完整解析與授權方法