前两篇把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了!
-
tar -zxvf rsync-3.0.9.tar.gz
-
cd rsync-3.0.9
-
./configure --prefix=/usr/local/rsync
-
make && make install
rsync是服务器间传递文件的,当然需要安装两台服务器喽!
另一台机器安装方式一样!
好!两台机器现在已经安装完毕,开始配置rsync,同步成功就OK!
先上总体流程图:需要同步的服务器如下图:
只是简略的画了一下需要管理什么配置,实际上还有很多问题,比如跨机房配置库同步问题等,当然这里介绍配置管理!
当然现在只是部署阶段只要调通就OK,所以选择两台服务器,资源库服务器命名为A服务器,其他服务器命名为B服务器。
楼主采用在管理配置A机器上往B机器推文件的方式来使用rsync,因为需要手动推呀,
这样A机器的rsync就不需要配置了rsync配置文件了,只要能用就行,通过脚本认证的话需要建立一个密码文件,就是个文本文件。
在B服务器上修改rsync配置
vi /etc/rsyncd.conf #这货默认是没有的,自己创建一个吧
-
#全局选项
-
strict modes = yes #是否检查口令文件的权限
-
port = 873 #默认端口873
-
log file = /usr/local/rsync/log #日志记录文件 原文中有的,我没有使用,日志文件
-
pid file = /usr/local/rsync/rsyncd.pid #运行进程的ID写到哪里 原文中有的,我没有使用,日志文件
-
-
[nginx]
-
max connections = 5 #最大连接数
-
uid = web #指定该模块传输文件时守护进程应该具有的uid
-
gid = web #指定该模块传输文件时守护进程应该具有的gid
-
path = /data/app # 传文件的目录
-
ignore errors # 可以忽略一些无关的IO错误
-
read only = no #no客户端可上传文件,yes只读
-
write only = yes #no客户端可下载文件,yes不能下载
-
hosts allow = * #充许任何主机连接
-
#hosts deny = xx.xx.xx.xx #禁止指定的主机连接
-
auth users = neusoft # 认证的用户名,如果没有这行,则表明是匿名
-
secrets file= /etc/rsync_secure.pass # 指定认证口令文件位置
配置项一定要写对,刚才secrets file我少写了个file,提示我认证失败,看了好久,后来还是没相信
自己的双手,对比了一下配置文件,发现少写了个file,调半天啊!
然后建立认证口令文件。
-
vi /etc/rsync_secure.pass
-
-
neusoft:111111
-
-
#暴露身份了....
-
-
:wq
-
-
chmod 600 /etc/rsync_secure.pass
然后启动rsync守护进程
-
/usr/local/rsync/bin/rsync --daemon
这里遇到一个坑,把密码文件的权限
-
chown web:web /etc/rsync_secure.pass
-
su - web
-
/usr/local/rsync/bin/rsync --daemon
进程怎么都无法启动,后来又将密码权限改回 root:root
启动成功了,不知道是不是rsync服务器端只能用root启动,有待验证。
服务器端启动成功了,修改iptables配置,开启873端口
-
service iptables save
-
vi /etc/sysconfig/iptables
-
-
#增加这么一段,其实我是模仿22端口写的
-
-A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
-
-
service iptables restart
这样该机器的873端口就可以被访问了!
然后回到A机器,也就是资源库服务器,执行命令
-
/usr/local/rsync/bin/rsync -vzrtopg --progress /data/app/esb_admin/rsync/hd.sh neusoft@10.70.33.32::nginx
需要输入密码,输入刚才设置的 111111
出现了!!!
-
sending incremental file list
-
hd.sh
-
1052 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)
-
-
sent 604 bytes received 27 bytes 1262.00 bytes/sec
说明同步成功了,到B机器的目录下,/data/app,发现增加了hd.sh文件,说明成功了!
注明一下:/data/app文件夹权限是所属web:web的,不然会出现不让操作文件的错误。同步的之后也可以指定密码文件,请看下面的命令:
-
/usr/local/rsync/bin/rsync -vzrtopg --progress /data/app/esb_admin/rsync/hd.sh neusoft@10.70.33.32::nginx --password-file=/da
-
ta/app/esb_admin/rsync/rsync.pass
这个密码文件也需要给予600,并且在A机器上,用哪个用户执行,这个密码文件就应该属于哪个用户。
-
vi /data/app/esb_admin/rsync/rsync.pass
-
-
111111
-
-
#里面只存了密码哦
rsync可以推文件,可以拉文件,还有好多功能,请读者自行研究喽,楼主看了一篇文章就学会了,附上地址:
http://www.iteye.com/topic/604436
rsync安装完毕~~~~!!!!下面是inotify!
首先看看机器是否支持inotify
出现下面的三行说明OK~~~
开始安装inotify,安装过程依旧很容易!
-
tar -zxvf inotify-tools-3.14.tar.gz
-
cd inotify-tools-3.14
-
./configure --prefix=/usr/local/inotify
-
make && make install
然后编写一个脚本:inotify_watch.sh
inotify检测一个文件夹内是否有改动脚本如下
-
#!/bin/sh
-
configdir="/data/app/rsynctest"
-
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f%e' ${configdir} | while read file
-
do
-
echo $file
-
done
保存退出!给予执行权限,然后执行该脚本,如下图哦!(顺带着在A机器上执行rsync同步)
看图发现rsync执行同步的时候,最后一步是将生成的文件MOVED_TO,然后脚本就变成这样了:
-
#!/bin/bash
-
configdir="/data/app/lightesb_transmit/conf/"
-
configfile="esb.conf"
-
order="/usr/local/openresty/nginx/sbin/nginx -s reload"
-
logdir="/data/app/inotify.log"
-
-
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f%e' ${configdir} | while read file
-
do
-
ok=`echo $file | grep -q MOVED_TO && echo 1 || echo 0`
-
if [ "$ok" == "1" ]; then
-
$order 2>&1
-
echo `date '+%Y-%m-%d %T'` >> $logdir
-
echo $order >> $logdir
-
echo '----------------------------------------------------------------------------' >> $logdir
-
fi
-
done
增加了输出日志的模块,增加了执行的重新加载配置的命令,
以上脚本的含义就是就是如果发现有MOVED_TO就执行重新加载nginx配置文件,
以上配置管理功能完成了。
然后在资源库中,用php自己写了一个配置管理的页面,来管理各种配置,形成了满足需求的配置管理工具!
以上~~~~~