源服务器
安装rsync
与 inotify
yum install rsync inotify -y
rsync推送源服务器只需要配置好访问密码就推送文件到目标服务器了。
代码语言:bash复制nano /etc/rsync.passwd
代码语言:bash复制Test.2023
源服务器的密码文件不用指定用户名,用户名在使用同步命令的时候才用到,目前源服务器的准备工作已经完成了。
目标服务器
创建rsync
用户,并分配权限。
useradd -s /sbin/nologin -M rsync
配置rsyncd.conf
,注意注释要独立一行,不然你就会遇到悲剧(centos的版本会把配置后面的注释都进去,不清楚其他linux版本的会不会有这个情况)。
nano /etc/rsyncd.conf
代码语言:bash复制# /etc/rsyncd: configuration file for rsync daemon mode
#Global Settings 全局配置
#运行rsync的用户
uid = rsync
#运行rsync的用户组
gid = rsync
use chroot = no
#指定rsync的pid存放路径
pid file = /var/run/rsyncd.pid
#指定rsync的锁文件存放路径
lockfile = /var/run/rsyncd.lock
#指定rsync的日志存放路径
log file = /var/log/rsyncd.log
#模块配置
[test]
#是否让进程离开工作目录
use chroot = no
#最大并发连接数,0为不限制
max connections = 5
#超时时间
timeout = 600
#认证的模块名,在client端需要指定
path = /home/jsb/test
#忽略一些无关的I/O错误
ignore errors = yes
#写入权限
read only = no
#读取权限
write only = yes
#客户端请求是否可以列出模块列表
list = no
#认证此模块的用户名
auth users = test
#指定存放“用户名:密码”格式的文件
secrets file = /etc/web.passwd
创建密码认证文件
代码语言:bash复制nano /etc/web.passwd
格式为user:password
要注意只有文件所有者才有读取密码文件的权限。
nginx:nginx.2023
test:Test.2023
启动rsync
rsync --daemon
用ss -antl | grep 873
检查是否正常启动了
ss -antl | grep 873
LISTEN 0 5 *:873 *:*
LISTEN 0 5 [::]:873 [::]:*
防火墙开放端口
代码语言:bash复制sudo firewall-cmd --add-port=873/tcp --permanent
success
sudo firewall-cmd --reload
success
停止rsync
killall rsync
测试rsync同步功能
之前在目标服务器的配置文件中已经指定了test
模块的path
路径,现在我们回到源服务器,创建一个测试文件test,并填入一些内容:
nano test
代码语言:js复制这是一个测试文本内容!
然后在源服务器使用如下命令进行同步:
代码语言:bash复制rsync -vzrtopg --delete --password-file=/etc/rsync.passwd /home/test/test test@192.168.1.1::test
-v
表示详细模式输出,显示传输过程。-z
表示对传输的文件进行压缩处理,减少网络带宽占用。-r
表示递归处理,传输子目录中的文件。-t
表示保持文件时间信息。-o
表示保持文件属主信息。-p
表示保持文件权限。-g
表示保持文件属组信息。--delete
表示删除目标目录中源目录没有的文件,使目标目录成为源目录的镜像。--password-file=/etc/rsync.passwd
表示指定密码文件的路径,用于通过 rsync 守护进程进行认证。
更rsync
命令参数的解释,请参考:rsync(1)-Linux man page
配置正确的话,会得到类似下面的输出:
代码语言:bash复制sending incremental file list
test
sent 112 bytes received 43 bytes 310.00 bytes/sec
total size is 7 speedup is 0.05
在目标服务器查看,可以看到目录下多了一个test文件,其内容正是之前源服务器的。
代码语言:bash复制ll && cat test
总用量 4.0K
-rw-r--r--. 1 jsb jsb 7 6月 27 10:04 test
这是一个测试文本内容!
编写inotify同步脚本
代码语言:bash复制#!/bin/bash
# 要监视的文件和目录及其对应的行为
# 用tarp命令保障脚本停止时后台的子进程也退出
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
paths=("/etc/nginx/nginx.conf" "/etc/nginx/conf.d/" "/home/user/cert/")
# 创建日志文件
logfile="rsync.log"
if [ ! -e "$logfile" ]; then
touch "$logfile"
fi
# 使用多个实例监控不同路径
for path in "${paths[@]}"; do
inotifywait -m -r --exclude '.swp$' "$path" -e create,modify,delete |
while read -r directory event file; do
echo "$date Change detected in $directory: $event $file" >> $logfile
# 根据不同目录做不同操作
case "$directory" in
"${paths[0]}")
# 同步nginx.conf
/usr/bin/rsync -vzrtopg --delete --password-file=/etc/rsync.passwd "${paths[0]}" nginx@soft-main.zhlib.local::nginx >> $logfile
;;
"${paths[1]}")
# 同步conf.d
/usr/bin/rsync -vzrtopg --delete --password-file=/etc/rsync.passwd "${paths[1]}" nginx@soft-main.zhlib.local::nginx/conf.d/ >> $logfile
;;
"${paths[2]}")
# 同步cert目录
/usr/bin/rsync -vzrtopg --delete --password-file=/etc/rsync.passwd "${paths[2]}" cert@soft-main.zhlib.local::cert >> $logfile
;;
# 默认处理
*)
;;
esac
# 使用&后台运行每一个inotifywait实例
done &
done
wait
停止inotifywait
相关进程
直接ctrl c
退出脚本是不会杀死inotifywait
进程的,需要用以下命令杀掉进程:
kill $(pgrep inotifywait)
设置rsync
开机自启
要在CentOS系统中设置rsync
作为守护进程在开机时自动启动,可以使用systemctl
命令和chkconfig
工具(取决于您的CentOS版本)。这里提供了适用于CentOS 7及以上版本的指导,因为这些版本使用systemd
系统管理器。
CentOS 7 及更高版本
首先,确认rsync
守护进程的服务文件是否存在:
代码语言:bash复制sudo systemctl status rsyncd.service
如果服务不存在,您可能需要创建一个服务文件/etc/systemd/system/rsyncd.service
。
如果服务已经存在且是未激活(inactive)状态,您可以使用以下命令来启用并启动服务:
代码语言:bash复制sudo systemctl enable rsyncd.service
sudo systemctl start rsyncd.service
要确认rsync
守护程序现在已设置为开机启动,可以使用以下命令:
代码语言:bash复制sudo systemctl is-enabled rsyncd.service
如果输出显示enabled
,那么rsync
守护进程将在开机时自动启动。
CentOS 6 或更低版本
CentOS 6 使用传统的SysV init脚本而不是systemd
。在这种情况下,您可以通过chkconfig
工具来管理服务的开机启动。
查看rsync
服务的当前状态:
代码语言:bash复制chkconfig --list | grep rsync
要设置rsync
在开机时启动:
代码语言:bash复制sudo chkconfig rsync on
再次检查以确保设置正确应用:
代码语言:bash复制chkconfig --list | grep rsync
如果看到rsync
服务旁边的运行级别(runlevels)标记为on
,则表示它已成功设置为开机启动。
请注意,如果正在使用的CentOS版本是6或以下,并且rsync
服务不在chkconfig
列出的服务中,你可能需要安装它或者创建相应的init脚本。
确保在进行任何更改之前,您已经正确配置了rsyncd.conf
文件,它位于/etc/
目录下,因为这将定义rsync
服务器的行为和同步的目录。