使用rsync+inotify实现nginx配置实时同步

2024-01-17 11:52:38 浏览数 (2)

源服务器

安装rsyncinotify

代码语言:bash复制
yum install rsync inotify -y

rsync推送源服务器只需要配置好访问密码就推送文件到目标服务器了。

代码语言:bash复制
nano /etc/rsync.passwd
代码语言:bash复制
Test.2023

源服务器的密码文件不用指定用户名,用户名在使用同步命令的时候才用到,目前源服务器的准备工作已经完成了。

目标服务器

创建rsync用户,并分配权限。

代码语言:bash复制
useradd -s /sbin/nologin -M rsync

配置rsyncd.conf,注意注释要独立一行,不然你就会遇到悲剧(centos的版本会把配置后面的注释都进去,不清楚其他linux版本的会不会有这个情况)。

代码语言:bash复制
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要注意只有文件所有者才有读取密码文件的权限。

代码语言:shell复制
nginx:nginx.2023
test:Test.2023

启动rsync

代码语言:bash复制
rsync --daemon

ss -antl | grep 873检查是否正常启动了

代码语言:bash复制
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

代码语言:js复制
 killall rsync

测试rsync同步功能

之前在目标服务器的配置文件中已经指定了test模块的path路径,现在我们回到源服务器,创建一个测试文件test,并填入一些内容:

代码语言:bash复制
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进程的,需要用以下命令杀掉进程:

代码语言:bash复制
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服务器的行为和同步的目录。

0 人点赞