前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用rsync+inotify实现nginx配置实时同步

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

原创
作者头像
御坂妹
修改2024-01-17 11:52:38
2950
修改2024-01-17 11:52:38
举报
文章被收录于专栏:御坂网络手记

源服务器

安装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服务器的行为和同步的目录。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源服务器
  • 目标服务器
  • 测试rsync同步功能
  • 编写inotify同步脚本
  • 设置rsync开机自启
    • CentOS 7 及更高版本
      • 首先,确认rsync守护进程的服务文件是否存在:
      • 如果服务已经存在且是未激活(inactive)状态,您可以使用以下命令来启用并启动服务:
      • 要确认rsync守护程序现在已设置为开机启动,可以使用以下命令:
    • CentOS 6 或更低版本
      • 查看rsync服务的当前状态:
      • 要设置rsync在开机时启动:
      • 再次检查以确保设置正确应用:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档