前两篇把php+mysql+apache部署好了,项目中有一条需求是可以管理
系统中各个节点的配置文件,修改、重启并生效,本来这部分打算推给puppet配置管理工具
后来由于开发时间紧,没人去研究这个工具,就换了方案,下面简单介绍下方案:
各个节点的配置文件,比如nginx、apache、redis、memcached、还有java和php的一些应用
配置,统一有一个配置资源库,放在管理后台,在管理后台管理这个资源库,通过php修改文本内容,实现
修改配置文件这个需求点(其实就是file_put_content和file_get_content这两个函数),我们修改完了配置文件
需要传输到目标服务器上,文件传输的功能就交给rsync去解决,这样文件传输问题通过rsync解决了。
之后要介绍的是inotify,不愿意打字了,在网上摘抄一段,给大家解释下inotify能干什么:

——————————————————————————————————————————————————————

在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如:

  • 通知配置文件的改变
  • 跟踪某些关键的系统文件的变化
  • 监控某个分区磁盘的整体使用情况
  • 系统崩溃时进行自动清理
  • 自动触发备份进程
  • 向服务器上传文件结束时发出通知

通常使用文件轮询的通知机制,但是这种机制只适用于经常改变的文件(因为它可以确保每过x秒就可以得到i/o),其他情况下都非常低效,并且有时候会丢失某些类型的变化,例如文件的修改时间没有改变。像Tripwire这样的数据完整性系统,它们基于时间调度来跟踪文件变化,但是如果想实时监控文件的变化的话,那么时间调度就束手无策了。Inotify就这样应运而生了。
———————————————————————————————————————————————————————

从上面可以看到inofity可以检测到文件是否更改,然后我们rsync同步时,会创建一些临时文件,
最后将文件通过move to的机制,来覆盖已经存在的文件,这样我们通过inofity就可以检测是否有
文件move to到我们指定文件的 文件名。然后执行重启或者重新加载配置脚本来实现重启生效。
完美满足需求,但是有缺点,在配置文件更改错误的时候,尤其像keepalived这种不检测配置文件是否正确
直接重启导致错误的配置文件无法正确运行,这个会影响很大。nginx和apache好说,如果配置文件不正确,重启
会不成功,仍然按照修改之前的配置文件进行。总结起来就是,无法验证重启是否成功,当然这些同样可以通过脚本来实现。
脚本什么的之后慢慢完善就好了,先看安装部署吧,这两个软件依赖不多,装起来相比php5.4轻松许多啊,主要就是调整,
不过对于软贱攻城师来说,重装个10几次算是什么问题呢!我多嘴了。。。。



首先安装rsync吧,不互相影响,先装哪个无所谓!
rsync下载:http://rsync.samba.org/ftp/rsync/
rsync-3.0.9.tar.gz

首先确认Linux系统中是否装了基础软件gcc、make、perl
楼主也没装过,直接用yum了!

1. tar -zxvf rsync-3.0.9.tar.gz
2. cd rsync-3.0.9
3. ./configure --prefix=/usr/local/rsync
4. make && make install

rsync是服务器间传递文件的,当然需要安装两台服务器喽!
另一台机器安装方式一样!

好!两台机器现在已经安装完毕,开始配置rsync,同步成功就OK!

先上总体流程图:需要同步的服务器如下图:

只是简略的画了一下需要管理什么配置,实际上还有很多问题,比如跨机房配置库同步问题等,当然这里介绍配置管理!

当然现在只是部署阶段只要调通就OK,所以选择两台服务器,资源库服务器命名为A服务器,其他服务器命名为B服务器。

楼主采用在管理配置A机器上往B机器推文件的方式来使用rsync,因为需要手动推呀,
这样A机器的rsync就不需要配置了rsync配置文件了,只要能用就行,通过脚本认证的话需要建立一个密码文件,就是个文本文件。

在B服务器上修改rsync配置
vi /etc/rsyncd.conf    #这货默认是没有的,自己创建一个吧

1. #全局选项
2. strict modes = yes #是否检查口令文件的权限
3. port = 873 #默认端口873
4. log file = /usr/local/rsync/log #日志记录文件 原文中有的,我没有使用,日志文件
5. pid file = /usr/local/rsync/rsyncd.pid #运行进程的ID写到哪里 原文中有的,我没有使用,日志文件
6. 
7. [nginx]
8. max connections = 5 #最大连接数
9. uid = web #指定该模块传输文件时守护进程应该具有的uid
10. gid = web #指定该模块传输文件时守护进程应该具有的gid
11. path = /data/app # 传文件的目录
12. ignore errors # 可以忽略一些无关的IO错误
13. read only = no #no客户端可上传文件,yes只读
14. write only = yes #no客户端可下载文件,yes不能下载
15. hosts allow = * #充许任何主机连接
16. #hosts deny = xx.xx.xx.xx #禁止指定的主机连接
17. auth users = neusoft # 认证的用户名,如果没有这行,则表明是匿名
18. secrets file= /etc/rsync_secure.pass # 指定认证口令文件位置

配置项一定要写对,刚才secrets file我少写了个file,提示我认证失败,看了好久,后来还是没相信
自己的双手,对比了一下配置文件,发现少写了个file,调半天啊!
然后建立认证口令文件。

    1. vi /etc/rsync_secure.pass
    2. 
    3. neusoft:111111 
    4. 
    5. #暴露身份了....
    6. 
    7. :wq
    8. 
    9. chmod 600 /etc/rsync_secure.pass

    然后启动rsync守护进程


    1. /usr/local/rsync/bin/rsync --daemon

    这里遇到一个坑,把密码文件的权限 

      1. chown web:web /etc/rsync_secure.pass
      2. su - web
      3. /usr/local/rsync/bin/rsync --daemon

      进程怎么都无法启动,后来又将密码权限改回 root:root
      启动成功了,不知道是不是rsync服务器端只能用root启动,有待验证。
      服务器端启动成功了,修改iptables配置,开启873端口

      1. service iptables save
      2. vi /etc/sysconfig/iptables
      3. 
      4. #增加这么一段,其实我是模仿22端口写的
      5. -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
      6. 
      7. service iptables restart

      这样该机器的873端口就可以被访问了!

      然后回到A机器,也就是资源库服务器,执行命令

      1. /usr/local/rsync/bin/rsync -vzrtopg --progress /data/app/esb_admin/rsync/hd.sh neusoft@10.70.33.32::nginx

      需要输入密码,输入刚才设置的 111111 
      出现了!!!

        1. sending incremental file list
        2. hd.sh
        3. .00kB/s 0:00:00 (xfer#1, to-check=0/1)
        4. 
        5. sent 604 bytes received 27 bytes 1262.00 bytes/sec

        说明同步成功了,到B机器的目录下,/data/app,发现增加了hd.sh文件,说明成功了!
        注明一下:/data/app文件夹权限是所属web:web的,不然会出现不让操作文件的错误。同步的之后也可以指定密码文件,请看下面的命令:

        1. /usr/local/rsync/bin/rsync -vzrtopg --progress /data/app/esb_admin/rsync/hd.sh neusoft@10.70.33.32::nginx --password-file=/da
        2. ta/app/esb_admin/rsync/rsync.pass

        这个密码文件也需要给予600,并且在A机器上,用哪个用户执行,这个密码文件就应该属于哪个用户。

        1. vi /data/app/esb_admin/rsync/rsync.pass
        2. 
        3. 111111
        4. 
        5. #里面只存了密码哦

        rsync可以推文件,可以拉文件,还有好多功能,请读者自行研究喽,楼主看了一篇文章就学会了,附上地址:
        http://www.iteye.com/topic/604436

        rsync安装完毕~~~~!!!!下面是inotify!
        首先看看机器是否支持inotify

        出现下面的三行说明OK~~~

        开始安装inotify,安装过程依旧很容易!

          1. tar -zxvf inotify-tools-3.14.tar.gz
          2. cd inotify-tools-3.14
          3. ./configure --prefix=/usr/local/inotify
          4. make && make install

          然后编写一个脚本:inotify_watch.sh
          inotify检测一个文件夹内是否有改动脚本如下


          1. #!/bin/sh
          2. configdir="/data/app/rsynctest"
          3. /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f%e' ${configdir} | while read file
          4. do
          5. echo $file
          6. done

          保存退出!给予执行权限,然后执行该脚本,如下图哦!(顺带着在A机器上执行rsync同步)


          看图发现rsync执行同步的时候,最后一步是将生成的文件MOVED_TO,然后脚本就变成这样了:

          1. #!/bin/bash
          2. configdir="/data/app/lightesb_transmit/conf/"
          3. configfile="esb.conf"
          4. order="/usr/local/openresty/nginx/sbin/nginx -s reload"
          5. logdir="/data/app/inotify.log"
          6. 
          7. /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f%e' ${configdir} | while read file
          8. do
          9. ok=`echo $file | grep -q MOVED_TO && echo 1 || echo 0`
          10. if [ "$ok" == "1" ]; then
          11. $order 2>&1
          12. echo `date '+%Y-%m-%d %T'` >> $logdir
          13. echo $order >> $logdir
          14. echo '----------------------------------------------------------------------------' >> $logdir 
          15. fi
          16. done

          增加了输出日志的模块,增加了执行的重新加载配置的命令,
          以上脚本的含义就是就是如果发现有MOVED_TO就执行重新加载nginx配置文件,
          以上配置管理功能完成了。

          然后在资源库中,用php自己写了一个配置管理的页面,来管理各种配置,形成了满足需求的配置管理工具!
          以上~~~~~



          转载于:https://blog.51cto.com/ljianbing/1617621