使用 rsync 部署静态网站——从手动到自动化
作者: CaoZH日期: 2024-12-15本文为原创教程
部署静态网站有很多方式:FTP、scp、GitHub Actions、rsync……其中最经典、最可靠的方式莫过于 rsync 。
rsync 增量同步、断点续传、权限保留,是运维老手最常用的部署工具。本文将从头到尾教你用 rsync 部署静态网站。
一、rsync 是什么? rsync(remote sync)是一个远程文件同步工具,它的核心优势是:
特性
说明
增量传输
只传输差异部分,不是全量
断点续传
传输中断后继续,不从头来
压缩传输
传输过程中压缩数据
权限保留
保留文件权限、所有者、时间戳
安全可靠
通过 SSH 加密传输
rsync vs 其他方案
方案
速度
增量
安全性
复杂度
FTP
慢
❌
❌
低
scp
中
❌
✅
低
rsync
快
✅
✅
中
GitHub Actions
中
✅
✅
高
二、安装 rsync 1 2 3 4 5 6 rsync --version sudo apt install -y rsync sudo yum install -y rsync
三、基本用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 rsync [选项] 源路径 目标路径 rsync -av source / backup/ rsync -avz ./public/ user@server:/var/www/html/ rsync -avz user@server:/var/www/html/ ./backup/ rsync -avz -e ssh ./dist/ user@server:/var/www/html/ rsync -avz -e "ssh -p 2222" ./dist/ user@server:/var/www/html/
四、实战:部署 Hexo 博客 这是我自己的博客部署方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash BLOG_DIR="/home/hermes/blog-site" REMOTE_USER="blog" REMOTE_HOST="43.143.72.145" REMOTE_PATH="::blog" PASSWORD_FILE="/home/hermes/rsync.passwd" echo "📦 构建博客..." cd $BLOG_DIR npx hexo generate echo "🚀 部署到服务器..." rsync -avz --delete \ --password-file=$PASSWORD_FILE \ $BLOG_DIR /public/ \ ${REMOTE_USER} @${REMOTE_HOST} ${REMOTE_PATH} echo "✅ 部署完成!"
五、rsync daemon 模式 除了通过 SSH,rsync 还可以以 daemon(守护进程)模式运行,部署更高效。
服务端配置 1 2 sudo vim /etc/rsyncd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 uid = www-datagid = www-datause chroot = yes max connections = 10 pid file = /var/run/rsyncd.pid log file = /var/log/rsync.log timeout = 300 [blog] path = /var/www/blog comment = My Blogread only = no list = yes auth users = blog secrets file = /etc/rsyncd.secrets
1 2 3 4 5 6 7 echo "blog:yourpassword" | sudo tee /etc/rsyncd.secretssudo chmod 600 /etc/rsyncd.secrets sudo systemctl start rsync sudo systemctl enable rsync
客户端配置 1 2 3 4 5 6 7 8 9 echo "yourpassword" > ~/rsync.passwdchmod 600 ~/rsync.passwd rsync -avz --delete \ --password-file=~/rsync.passwd \ ./public/ \ blog@server-ip::blog
六、自动化部署脚本 基础版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash set -eSITE_DIR="dist" REMOTE_USER="deploy" REMOTE_HOST="your-server.com" REMOTE_PATH="/var/www/my-site" SSH_KEY="~/.ssh/deploy_key" echo "🔨 构建项目..." npm run build echo "🚀 部署到 $REMOTE_HOST ..." rsync -avz --delete \ -e "ssh -i $SSH_KEY " \ $SITE_DIR / \ $REMOTE_USER @$REMOTE_HOST :$REMOTE_PATH / echo "✅ 部署完成!访问 https://$REMOTE_HOST "
带备份的版本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/bin/bash set -eSITE_DIR="dist" REMOTE_USER="deploy" REMOTE_HOST="your-server.com" REMOTE_PATH="/var/www/my-site" BACKUP_PATH="/var/www/backups/$(date +%Y%m%d_%H%M%S) " echo "🔨 构建..." npm run build echo "📦 备份当前版本..." ssh $REMOTE_USER @$REMOTE_HOST "cp -r $REMOTE_PATH $BACKUP_PATH " echo "🚀 部署新版本..." rsync -avz --delete $SITE_DIR / $REMOTE_USER @$REMOTE_HOST :$REMOTE_PATH / echo "✅ 完成"
七、rsync 常用选项 1 2 3 4 5 6 7 8 9 10 11 12 13 rsync -avzP source / dest/ rsync --delete rsync --exclude="*.log" rsync --exclude-from="exclude.txt" rsync --dry-run rsync --bwlimit=1000
八、结合 GitHub Actions 自动化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 name: Deploy via rsync on: push: branches: [main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci && npm run build - name: rsync deploy uses: burnett01/rsync-deployments@7.0 with: switches: -avz --delete path: dist/ remote_path: /var/www/my-site remote_host: ${{ secrets.DEPLOY_HOST }} remote_user: ${{ secrets.DEPLOY_USER }} remote_key: ${{ secrets.DEPLOY_KEY }}
九、排错 1 2 3 4 5 6 7 8 9 10 11 12 13 14 rsync -avz --dry-run source / user@host:dest/ rsync user@host:: rsync user@host::module ssh user@host ssh user@host "tail -f /var/log/rsync.log"
十、总结 rsync 是最可靠的文件同步工具之一:
场景
推荐方式
✅ 小项目手动部署
rsync -avz ./dist/ user@host:/path/
✅ 自动化部署
Shell 脚本
✅ 团队协作
GitHub Actions + rsync
✅ 多服务器
rsync daemon 模式
核心口诀: -avz --delete 一套参数走天下。
首发于 CaoZH 的笔记