前言
此前我一直在寻找一种好的方式,能够将本地写好的博客文件传输到服务器,要求速度快,操作简单。先前使用 Vercel 托管就没有这个烦恼,我使用的 windows 撰写博文,完事以后一键编译再上传到 GitHub 就可以了。虽然 Git 时不时抽风,也可以使用 GitHub Desktop 来解决传输的速度问题。
但是换到服务器后,难免又多了个 git pull 的命令,而且速度还很慢,虽说有 crontab 可以定时执行任务,但是绕不开始终是难题的 Github,如果要多次提交就很麻烦。方式也不够优雅,总的来说就是挺折磨的。
最近突然想起来以前看见一篇文章,可以使用 Rsync 实现文件同步,试了一下之后直接抛弃 Github.
Linux 端
我使用的系统是 Debian11,Debian 系基本可以通用.
安装 rsync
sudo apt-get install rsync
配置文件是需要我们自行创建的,放在/etc目录下,但是官方给了我们一份参考,我们直接拷贝过去就行
sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc
编辑配置文件
sudo vim /etc/rsyncd.conf
示例如下
# sample rsyncd.conf configuration file
# GLOBAL OPTIONS
# motd file=/etc/motd
# 日志文件
# log file=/var/log/rsyncd
# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
# The init.d script does its own pid file handling,
# so omit the "pid file" line completely in that case.
# pid file=/var/run/rsyncd.pid
# syslog facility=daemon
# socket options=
# MODULE OPTIONS
# 进行通信的端口,如果防火墙打开的话,需要将对应的端口添加进去
# 我没写这个,因为嫌麻烦开放了全部TCP端口,也不知道默认端口是哪个来着
# 如果指定端口那么在Windows的命令中必须要加上端口号
# port=8999
# 表示要传入的模块名,没特殊需求不需要改动
[ftp]
comment = public archive
# 传输文件路径 需要自己创建好 文件会传到这个目录下
path = /home/lovir/public
use chroot = yes
# 最大连接数
# max connections=10
lock file = /var/lock/rsyncd
# the default for read only is yes...
# 是否把只读文件同步到服务器 yes表示不同步只读文件
read only = no
list = yes
# 这里要改成自己的用户和用户组!
uid = root
gid = root
# exclude =
# exclude from =
# include =
# include from =
# 用户名 不知道自己是谁就写root
auth users = root
# 密码文件存放位置
secrets file = /etc/rsyncd.secrets
strict modes = yes
# 允许传入的主机,这一条很重要!
hosts allow =*
# hosts deny =
ignore errors = no
ignore nonreadable = yes
transfer logging = no
# log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
timeout = 600
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
创建好同步文件夹
mkdir /home/lovir/public
创建并编辑密码文件(这个文件也是没有的,需要自己创建)
sudo vim /etc/rsyncd.secrets
写入这一行文字,用户名对应配置文件中的用户名,千万别写错了
root:123456
完事以后要修改权限
sudo chmod 600 /etc/rsyncd.secrets
配置文件搞好了才能启动程序,不然会报错
可以通过 systemctl list-unit-files --type=service
来查看有哪些service在运行
sudo systemctl start rsync
至此Linux端配置完成
Windows 端
🔗下载链接
下载好文件,这里我放到网盘里方便大家下载(快说谢谢😎✌️)
解压完成以后配置好环境变量:把 E:\cwrsync\bin
加到环境变量里
在 cwrsync/bin
目录下分别新建两个文件 passwd.txt 和 exlcude.txt
passwd.txt 写入Linux端的密码,就是一串数字,其他啥都不要加
exlcude.txt 参考gitingore文件的写法
到此完成配置,接下来详解一下指令(不要复制这段代码,我为了演示加了回车换行)
rsync -avuz
--progress
--delete
--password-file=/cygdrive/E/cwrsync/bin/passwd.txt
--exclude-from=/cygdrive/E/cwrsync/bin/exclude.txt
/public
root@127.0.0.1::ftp/
参数意义:
-a: 归档模式,使用递归传输并保持文件的属性 -v: 显示传输过程中的详细信息 -p: 显示文件传输的进度信息 -z: 传输中进行压缩,提高传输速度
--port
指定端口,之前有指定的话就写上,没有的话就忽略
--progress
显示传输过程
--password-file
登录时用到的密码文件,该文件直接把密码包含就可以,如果不加这条需要手动输密码
--exclude-from
指定不需要进行传输的文件和文件夹,没需求可忽略
--delete
在 exclude/include 规则生效后执行,假如服务器中文件比传入的文件多,则删除,少的话,则添加。
public/
表示博客目录下的public文件夹内所有内容
root@127.0.0.1
这里换成服务器的ip,用户名改成与刚才配置 Linux 端对应的用户名
::ftp/
默认的,不需要改动,但是要对应服务器上的模块名
💡需要注意的是,绝对路径前面要加上/cygdrive/
比如我的密码文件路径是
E/cwrsync/bin/passwd.txt
那么需要改成
/cygdrive/E/cwrsync/bin/passwd.txt
如果实在找不到文件路径就先用以下代码测试一下
rsync -avuz public/ 用户名@ip地址::ftp/
可直接复制的代码如下,用户名和ip地址记得换掉
rsync -avuz --progress --delete --password-file=/cygdrive/E/cwrsync/bin/passwd.txt --exclude-from=/cygdrive/E/cwrsync/bin/exclude.txt public/ 用户名@ip地址::ftp/
保存上面命令为bat脚本,再加上一个hugo自动编译的命令,写完博客以后双击就可以同步啦~
这样绕开了GitHub同步的方法,再也不用为恼人的下载速度而烦恼了,尤其是随着时间增长博客体积越来越庞大的情况下,而只传public文件夹则缩小了文件体积,从而加快传输速度。
💡还有一个关键点!
传输过去的文件是没有权限的,nginx 无法读取文件,这也就是为什么页面加载不出来的原因😇
修改nginx运行身份:
sudo vim /etc/nginx/nginx.conf
把第一行改成
user root
并重启 nginx。这样 nginx 就可以以 root 身份访问文件夹,完美!
其他参数
# -v, --verbose 详细模式输出
# -q, --quiet 精简输出模式
# -c, --checksum 打开校验开关,强制对文件传输进行校验
# -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
# -r, --recursive 对子目录以递归模式处理
# -R, --relative 使用相对路径信息
# -b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
# --backup-dir 将备份文件(如~filename)存放在在目录下。
# -suffix=SUFFIX 定义备份文件前缀
# -u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
# -l, --links 保留软链结
# -L, --copy-links 像对待常规文件一样处理软链接
# --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链接
# --safe-links 忽略指向SRC路径目录树以外的链接
# -H, --hard-links 保留硬链接
# -p, --perms 保持文件权限
# -o, --owner 保持文件属主信息
# -g, --group 保持文件属组信息
# -D, --devices 保持设备文件信息
# -t, --times 保持文件时间信息
# -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
# -n, --dry-run 显示哪些文件将被传输
# -W, --whole-file 拷贝文件,不进行增量检测
# -x, --one-file-system 不要跨越文件系统边界
# -B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
# -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
# --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
# -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
# --existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
# --delete 删除那些DST中SRC没有的文件
# --delete-excluded 同样删除接收端那些被该选项指定排除的文件
# --delete-after 传输结束以后再删除
# --ignore-errors 即使出现IO错误也进行删除
# --max-delete=NUM 最多删除NUM个文件
# --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
# --force 强制删除目录,即使不为空
# --numeric-ids 不将数字的用户和组ID匹配为用户名和组名
# --timeout=TIME IP超时时间,单位为秒
# -I, --ignore-times 不跳过那些有同样的时间和长度的文件
# --size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
# --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
# -T --temp-dir=DIR 在DIR中创建临时文件
# --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
# -P 等同于 --partial
# --progress 显示备份过程
# -z, --compress 对备份的文件在传输时进行压缩处理
# --exclude=PATTERN 指定排除不需要传输的文件模式
# --include=PATTERN 指定不排除而需要传输的文件模式
# --exclude-from=FILE 排除FILE中指定模式的文件
# --include-from=FILE 不排除FILE指定模式匹配的文件
# --version 打印版本信息
# --address 绑定到特定的地址
# --config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
# --port=PORT 指定其他的rsync服务端口
# --blocking-io 对远程bash使用阻塞IO
# -stats 给出某些文件的传输状态
# --progress 在传输时显示传输过程
# --log-format=formAT 指定日志文件格式
# --password-file=FILE 从FILE中得到密码
# --bwlimit=KBPS 限制I/O带宽,KBytes per second
# -h, --help 显示帮助信息