php自动同步服务器文件,rsync+inotify实现对web服务器上的文件自动同步

rsync:

rsync是一个远程同步工具,非常强大的一款工具,在同步时可以保持文件的权限,属性,硬链接等,通过“rsync算法”来实现本地和远程主机的数据同步,并且是扫描两个主机之间不同的文件来进行传输,而不是整份的传输,因此速度相当快。但是随着系统规模的越来越大,rsync暴露出很多不足。

首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。

inotify:

inotify是一种强大的、细粒度的、异步的文件系统事件控制机制。linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施监控的软件。

rsync和inotify结合实现的逻辑图:

4244dd2aff2ce52f44bb9e6fa55db182.png

准备实验环境:

1、服务器   172.18.250.78   inotify-slave        安装nginx

2、服务器   172.18.250.77   inotify-master     安装php、mariadb

php服务器提供动态页面,nginx提供静态页面,当客户端对php服务器进行写操作后,需要和nginx上的页面进行一次同步。

一、inotify-slave的部署

1、在250.78上面配置rsync,rsync daemon工作模式,接收250.77的文件同步]# useradd -M -s /sbin/nologin rsync     //创建rsync用户

]# mkdir -p /var/www/html                //创建rsync同步的目录,也是nginx的root目录

编译配置文件:

]# vim /etc/rsyncd.conf

# configuration example:

uid = rsync

gid = rsync

use chroot = no

max connections = 50

pid file = /var/run/rsyncd.pid

timeout = 200

read only = no                  //是否只对文件只读,不加同步的时候可能会报错

[rsync]                         //同步的路径别名

path = /var/www/html/    //同步的路径

auth users = vrsync      //虚拟用户

ignore errors            //忽略报错

secrets file = /etc/rsync.password  //同步时用到的密码文件

2、运行rsync服务:]# rsync --daemon --config=/etc/rsyncd.conf

]# ps -ef |grep rsync

root      8962     1  0 21:17 ?        00:00:00 rsync --daemon --config=/etc/rsyncd.conf

root      9040  8929  0 22:12 pts/1    00:00:00 grep --color=auto rsync

l]# ss -tan

State       Recv-Q Send-Q            Local Address:Port          Peer Address:Port

LISTEN      0      5                       *:873                      *:*

LISTEN      0      5                       :::873                     :::*

3、创建同步时需要验证的账号密码文件:]# vim /etc/rsync.password

vrsync:123456

]# chmod 600 /etc/rsync.password           //为了文件的安全性

]# ll -d /etc/rsync.password

-rw------- 1 root root 14 May 11 21:06 /etc/rsync.password

4、在inotify-master 250.77上也创建相同的密码文件:]# vim /etc/rsync.password

123456                                     //注意,这只需要写上密码就行

]# chmod 600 /etc/rsync.password           //为了文件的安全性,也给予600权限

]# ll -d /etc/rsync.password

-rw------- 1 root root 14 May 11 21:06 /etc/rsync.password

5、在250.77上测试能否推送成功]# rsync -avz -P /etc/fstab vrsync@172.18.250.78::rsync --password-file=/etc/rsync.password

sending incremental file list              //推送成功

fstab

二、在250.77上部署inotify工具

1、源码安装inotify工具]# tar -xf inotify-tools-3.13.tar.gz

]# cd inotify-tools-3.13

]# ./configure --prefix=/usr/local/inotify

]# make && make install

2、查看当前系统是否支持inotify[root@localhost ~]# ll /proc/sys/fs/inotify/

total 0

-rw-r--r-- 1 root root 0 May 11 22:24 max_queued_events

-rw-r--r-- 1 root root 0 May 11 22:24 max_user_instances

-rw-r--r-- 1 root root 0 May 11 22:24 max_user_watches

//有这三个文件就表示支持

3、inotify支持的常用选项:]# ./bin/inotifywait --help

-r|--recursive       //递归查询目录

-q|--quiet           //打印出监控的事件

-m|--monitor         //一直保持事件监听状态

--excludei           //排除文件或目录时,不区分大小写

--timefmt            //指定输出时间格式

--format             //使用指定的输出类似格式字符串

-e|--event           //指定事件

Events:

access  //文件或目录被读取

modify  //文件或目录内容被修改

attrib  //文件或目录属性被改变

close  //文件或目录封闭,无论读/写模式

open  //文件或目录被打开

moved_to  //文件或目录被移动至另外一个目录

moved_from  //文件或目录移动至当前目录

move  //文件或目录被移动另一个目录或从另一个目录移动至当前目录

create  //文件或目录被创建在当前目录

delete  //文件或目录被删除

4、编写脚本让inotify监控目录#!/bin/bash

host=172.18.250.78    //需要推送的服务器

src=/var/www/html/    //监控的目录

dst=rsync             //推送到slave下的目录

user=vrsync           //虚拟用户

inotify_home=/usr/local/inotify   //inotifyd的安装目录

passfile=/etc/rsync.password      //认证密码文件

if [ ! -e "$src" ] || [ ! -e "${inotify_home}/bin/inotifywait" ] || [ ! -e "/usr/bin/rsync" ] || [ ! -e "/etc/rsync.password" ]; then

echo "Check File and Folder"

exit 1

fi

${inotify_home}/bin/inotifywait -mrq -e close_write,delete,create,attrib $src | while read file

do

cd $src && rsync -arvz -P ./ --timeout=100 $user@$host::$dst --password-file=$passfile &>/dev/null

done

exit 0

5、测试下能否正常检测到新文件并推送]# ./inotify.sh &       //让脚本运行于后台

]# touch a

]# touch a.a

]# ls /var/www/html/    //在slave服务器上查看

a  a.a   fstab

三、搭建一个lnmp并安装Discuz论坛

1、在slave服务器上安装nginx]# yum -y install nginx

2、配置nginx文件]#  server {

listen       80 default_server;

listen       [::]:80 default_server;

root         /var/www/html;

include /etc/nginx/default.d/*.conf;

location / {

index index.php index.html index.htm;

}

location ~ \.php$ {

fastcgi_pass   172.18.250.77:9000;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;

include        fastcgi_params;

}

}

3、测试静态页面是否能正常读取

4e13d8af175187e792e57c2b630ff5d5.png

4、在master服务器上安装php-fpm  php-mysql   mariadb-server服务

具体配置可以看我的博客LAMP的搭建,有详细说明]# yum -y install php-fpm php-mysql mariadb-server

]# service php-fpm start

]# vim /var/www/html/index.php

phpinfo();

?>

5、测试能否读取动态页面

b29e4214f1ef2a95e88864505dff9088.png

6、安装论坛Discuz]# unzip Discuz_X3.2_SC_UTF8.zip    //250.78上

]# unzip Discuz_X3.2_SC_UTF8.zip    //250.77上

MariaDB [(none)]> grant all on *.* to 'admin'@'localhost' identified by 'admin';

mysql授权一个能登录的账号

927c97af39f185a6195a417965d48ec3.png

按步骤装完之后登陆论坛:

a2b336521ebf0e7a6d4fc878b29e6a7b.png

动态页面显示不出来,是因为250.77上的文件发生了改变,而250.78上面的文件还是以前的导致的,这时可以用到rsync和inotify

组合,只要250.77上的文件发生改变,就同步文件到250.78上]# bash -x inotify.sh

+ host=172.18.250.78

+ src=/var/www/html/upload/

+ dst=rsync

+ user=vrsync

+ inotify_home=/usr/local/inotify

+ passfile=/etc/rsync.password

。。。。。。

在250.77上启用inotify工具,只要upload目录下的文件发生改变,就推送文件到250.78上,推送完后再次刷新。。。

a9cfa09db21833ed1cff1445de79b966.png

能正常显示了。。。。。

在upload目录下在新建一个文件,测试下能否正常推送:upload]# touch a.txt   //250.77上

upload]# ll

total 88

-rw-r--r--  1 root root 2739 Jun  9  2015 admin.php

drwxr-xr-x 11 root root  152 Jun  9  2015 api

-rw-r--r--  1 root root  727 Jun  9  2015 api.php

drwxr-xr-x  2 root root   22 Jun  9  2015 archiver

-rw-r--r--  1 root root    0 May 12  2016 a.txt   //能正常接收

~]# sh inotify.sh &    //让inotify运行于后台

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值