linux web服务器静态资源的处理 unison+inotify双向同步
linux web服务器静态资源的处理 unison+inotify双向同步
http://monkeyzhu.blog.51cto.com/5764358/1324391
简介
unison可以使两个本地磁盘目录保持内容一致,也可以支持网络数据同步。在内部实现上,unison使用OCaml语言开发,通过基于rsync算法对两边文件进行比较。
unison是双向的,自动更新两边没有冲突的部分,冲突的部分需要人工解决(当两边同时对一个文件进行修改的时候),有冲突的部分会显示出来由用户选择更新策略
支持增量同步,每次同步完会记录文件状态,下次同步以上次记录状态为起点开始同步
unison有字符界面和GTK+图形界面
unison提供两种远程通信方式
1、远程shell,由ssh工具完成,类似于rsync压缩传输协议
2、socket,要求发送tcp包进行通信,数据传输不安全,不建议使用
一、两台机器
192.168.11.11 vm1
192.168.11.12 vm2
注意:两边都要安装Unison!!
二、在vm1上编译安装Unison
Linux下通过源码包编译安装Unison时,需要用到Objective Caml compiler。
通过以下方式安装
[root@vm1 ~]# wget http://caml.inria.fr/pub/distrib/ocaml-3.12/ocaml-3.12.1.tar.gz
[root@vm1 ~]# tar -xzvf ocaml-3.12..tar.gz
[root@vm1 ~]# cd ocaml-3.12.
[root@vm1 ~]# more INSTALL
[root@vm1 ocaml-3.12.]# ./configure
[root@vm1 ocaml-3.12.]# make world.opt
[root@vm1 ocaml-3.12.]# make install
编译安装Unison
[root@vm1 ~]# yum install -y ctags-etags
[root@vm1 ~]# wget http://pkgs.fedoraproject.org/repo/pkgs/unison240/unison-2.40.128.tar.gz/md5/aa4d9d425b2ee2f9676ac5331a154bac/unison-2.40.128.tar.gz
[root@vm1 ~]# tar -xzvf unison-2.40..tar.gz
[root@vm1 ~]# cd unison-2.40.
[root@vm1 unison-2.40.]# make UISTYLE=text THREADS=true
[root@vm1 unison-2.40.]# make install
[root@vm1 unison-2.40.]# cp unison /usr/local/bin/
[root@vm1 unison-2.40.]# scp unison root@192.168.11.12:/usr/local/bin/ #将可执行文件unison上传到远程主机192.168.11.
make install出现错误的原因在与Unison默认是将文件Copy到/当前用户/bin目录下,但Linux默认是没有该目录的,因此我们需要将生成的可执行文件unison复制到系统的PATH目录。
make install的时候会出错,默认会在当前目录下生成可执行文件unison,将其复制到系统的PATH目录
三、配置ssh key信任
自查
四、生成unison目录和文件
将本机的目录/data/和远端主机的/data/进行同步。一般的,需要两台机能ssh连接。
注意:在主机和目录间又多加了一个 "/"
两边都创建/data目录
mkdir /data
修改两台服务器的unison配置文件,输入以下内容
[unison@vm1 ~]$ vi /root/.unison/default.prf
root = /tmp/
root = ssh://root@192.168.14.91//tmp/123
#path = www
#ignore = Path wp-content/tmp
ignore = Path wp-config.php #忽略wp-config.php文件 相当于rsync的exclude
#nodeletion = /data
batch = true
maxthreads =
#repeat =
owner = true
group = true
perms = -
fastcheck = false
sshargs = -C
xferbycopying = true
log = true
logfile = /tmp/unison.log [root@steven ]# ll
total
-rw-r--r-- root root Feb : .txt
-rw-r--r-- root root Feb : wp-config.php
运行unison
[root@steven ~]# unison
然后就是测试工作了:
[root@vm2 ~]# cd /data/ ;echo 23323 >33.txt ; unison
[root@vm1 ~]# cd /data/; echo defd >22.txt ; unison
注意
1、如果要保持文件的源权限,需要使用可以chown的用户来同步,一般使用root用户来同步。
2、可能出现的问题是在unison同步的时候 ,如果提示输入密码,需要做ssh互信关系
3、如果是权限不对,注意用户的权限,还有是 lock文件 可以删除.unison/ara1da075598bd182a68b3563be920002b类似文件,再重新执行unison
# ls -lh
总用量 464K
-rw------- root root 458K 2月 : ar08f197646847353b45eb96cb656aedee
-rw------- root root 2月 : default.prf
五、安装Inotify-tools工具,实时触发unison进行同步
ll /proc/sys/fs/inotify
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_queued_events
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_instances
-rw-r--r-- 1 root root 0 Mar 7 02:17 max_user_watches
备注:Linux下支持inotify的内核最小为2.6.13,可以输入命令:uname -a查看内核
安装inotify-tools
yum install make gcc gcc-c++
wget -c http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
cd /download
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify
make
make install
设置系统环境变量,添加软连接
echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh
source /etc/profile.d/inotify.sh
echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf
ln -s /usr/local/inotify/include /usr/include/inotify
vi /etc/sysctl.conf #添加以下代码
fs.inotify.max_user_instances=65535
创建脚本,实时触发rsync进行同步
vi /root/unison.sh
# use tools(linux inotify,unison)
# author:steven --
#!/bin/sh srcdir=/data
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib,move $srcdir | while read file
do
unison
echo " ${file} was rsynced" >> /tmp/unison.log >&
done
设置脚本开机自动执行
vi /etc/rc.d/rc.local
/bin/sh /root/unison.sh &
注意:上面实验只是在vm1上安装inotify和配置unison配置文件,如果需要两边都inotify触发,那么需要vm2上也要配置default.prf和安装inotify
unison的弊端:没有rsync那样只同步新创建或者修改的文件,不同步被删除的文件(-nodeletion选项),unison会同步被删除的文件,A机器删除了1.txt文件,也会删除B机器上1.txt文件
保持完全同步
-nodeletion:
nodeletion= /data/
unison
Fatal error: /data (given as argument to 'nodeletion' preference)
is not one of the current roots:
/data/
ssh://root@192.168.1.22//data/
-nodeletion无用,一定要是子目录才行,比如nodeletion= /data/tmp
文件同步工具Unison使用介绍 南非蚂蚁
http://ixdba.blog.51cto.com/2895551/526431
三种方式调用
第一种方式
unison profilename [options] 默认读取~/.unison 目录下的配置文件 profilename.prf 需要在配置文件profile里指定同步路径和同步参数
第二种方式
unison profile root1 root2 [options] root1 root2分别表示要同步的两个路径,如果是远程路径:ssh://username@remotehost//tmp/ixdab/files 这种方式不需要在profile.prf文件里指定root指令同步路径
第三种方式
unison root1 root2 [options] 这种方式相当于unison default root1 root2 [options],即读取default.prf
unison的使用
Unison可以在一台主机上使用,同步两个文件夹,也可以在网络上是用。
1:本地使用
使用方法:
#unison #同步本地的111和222文件夹
Contacting server...
Looking for changes
Warning: No archive files were found for these roots. This can happen either
because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different
archive format.
Update detection may take a while on this run if the replicas are
large.
Unison will assume that the 'last synchronized state' of both replicas
was completely empty. This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.
Press return to continue.[<spc>] Reconciling changes
111 222
<---- file aaaaaaaaaaaaa [f] ?
Commands:
<ret> or f or <spc> follow unison's recommendation (if any)
I ignore this path permanently
E permanently ignore files with this extension
N permanently ignore paths ending with this name
m merge the versions
d show differences
x show details
l list all suggested changes
p or b go back to previous item
g proceed immediately to propagating changes
q exit unison without propagating any changes
/ skip
> or . propagate from left to right
< or , propagate from right to left
<---- file aaaaaaaaaaaaa [f] f
Proceed with propagating updates? [] y
Propagating updates
UNISON started propagating changes at 15:06:08 on 27 Aug 2007
[BGN] Copying aaaaaaaaaaaaa
from /222
to /111
[END] Copying aaaaaaaaaaaaa
UNISON finished propagating changes at 15:06:08 on 27 Aug 2007
Saving synchronizer state
Synchronization complete (1 item transferred, 0 skipped, 0 failures)
如果检测到两个文件夹有所不同,unison会提示,让你选择相应的操作。如上例所示.
表示右边222的文件夹有新的文件,是否同步到左边的111文件夹,f表示force,然后将确认,进行更新,如果输入?会有更详细的介绍。
2: unison远程使用
使用方法:
# unison <本地目录> ssh://remotehostname(IP)/<远程目录的绝对路径>
# unison /home/AAA ssh://username@remotehostname(ip)//DB/path/BBB
表示将本机的目录/home/AAA和远端主机的/DB/path/BBB进行同步。一般的,需要两台机能ssh连接。
注意 在主机和目录间又多加了一个 "/"
unison参数说明
Unison有很多参数,这里只介绍经常使用的几个,详细的请参看unison手册:
1." -testserver
测试连通性,连接到服务器即退出。示例:
$ unison / ssh://opensou1@bluehost/ -servercmd=~/bin/unison -testserver
如果服务器端 unison 可执行文件不在默认目录下,甚至没有 unison 命令(需要你编译一个上传到服务器),则需要使用 -servercmd 参数告诉要执行的服务器 unison 命令位置。
使用 -testserver 参数,则成功链接即退出,也不会去执行目录的比较等后续操作。
2." -servercmd xxx
告诉 unison, 服务器端的 unison 命令是什么。参见上面的示例。
3." -auto
接受缺省的动作,然后等待用户确认是否执行。
4." -batch
batch mode, 全自动模式,接受缺省动作,并执行,无需人为干预。
5." -ignore xxx
同步时可以忽略的目录和路径,增加 xxx 到忽略列表中
6." -ignorecase [true|false|default]
是否忽略文件名大小写
7." -follow xxx
是否支持对符号连接指向内容的同步,会把软链接指向内容进行同步
8." -immutable xxx
指定不变化的目录,扫描时可以忽略该目录,不同步该目录
9." -path xxx 参数
只同步 -path 参数指定的子目录以及文件,而非整个目录。-path 在配置中可以多次出现,例如
unison /home/username ssh://remotehost//home/username \
-path shared \
-path pub \
-path .netscape/bookmarks.html
10.其他参数
owner = true (保持同步过来的文件属主)
group = true (保持同步过来的文件组信息)
perms = -1 (保持同步过来的文件读写权限)
repeat = 1 (间隔1秒后,开始新的一次同步检查)
retry = 3 (失败重试)
sshargs = -C (使用ssh的压缩传输方式)
xferbycopying = true (这个是优化参数,默认true)
silent (安静模式 除了错误,不打印任何信息)
times (同步修改时间 同步mtime)
maxthreads n (指定文件同步的最大线程数)
rsync (默认是true,激活rsync传输模式)
log (记录unison运行日志,默认true)
logfile (日志输出到文件)
通过配置文件来使用unison
尽管可以完全通过命令行的方式来指定unison运行所需要的参数,但我们还是推荐使用配置文件来进行配置使用unison
原因很简单,看配置文件比看命令行容易理解,而且可管理性更强。
默认的配置文件夹位于~currentuser/.unison,即当前用户的home目录下,windows则位于C:\Documents and Settings\currentuser\.unison
默认的配置文件名是default.prf
Archive文件也可以有多个,这个文件记录每次完成同步后每个文件的状态,可以在下次更新动作中更快判断文件是否应该更新,减少扫描时间。
运行这样的命令:
#unison exitgogo
Unison将默认读取~currentuser/.unison/exitgogo.prf文件里的配置信息.我的配置信息在/root/.unison/exitgogo.prf
因此我们可以根据上面参数的介绍,把所有的参数配置信息写入到一个.prf的文件中.
下面是我的一个web应用中两个文件夹同步的配置信息:
root = /sina/webdata
root = ssh://root@192.168.60.121//sina/webdata
#force =/sina/webdata
ignore = Path as/*
#prefer = ssh://root@192.168.60.121//sina/webdata
batch = true
#repeat = 1
#retry = 3
owner = true
group = true
perms = -1
fastcheck=false
rsync =false
#debug=verbose
sshargs = -C
xferbycopying = true
log = true
logfile = /root/.unison/sina_122.1547.log
说明如下:
两个root表示需要同步的文件夹
force表示以本地的/var/www/bbsnew文件夹为标准,将该目录同步到远端。注意,如果指定了force参数,那么unison就变成了单项同步了,也就是说会以force指定的文件夹为准进行同步.
Unison本身是可以双向同步的,但是要做到双向同步,就不要设置force参数,如果设置了force参数,就成了单项同步了,此时unison类似与sync.
Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是 A B文件夹的合集.
Unison双向同步的一个缺点是,对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准.
ignore = Path表示忽略/sina/webdata下面的WEB-INF/tmp目录,即同步时不同步它。
batch = true,表示全自动模式,接受缺省动作,并执行
-fastcheck true表示同步时使用文件的创建时间来比较两地文件,如果这个选项为false,unison则将比较两地文件的内容.建议设置为true
log = true表示在终端输出运行信息。
logfile则指定了同时将输出写入log文件。
unison FAQ
如何在和远程服务器同步大量数据,上传一部分数据后,超时:
9% 559:15 ETARead from remote host bluehost: Connection reset by peer
Fatal error: Lost connection with the server
实际操作中,最好的方法是,第一次先把要上传的文件打成包,用 ftp 上传,然后展开到服务器,之后执行一次 unison 同步即可。
yum install -y ctags-etags
Linux就这个范儿 P268
查找函数定义需要tags文件帮忙,它是由ctags程序产生的一个索引文件。郑重声明:ctags和cscope是成就vim IDE的两个法宝
ctags -R
网上多篇文章都会出现没有安装ctags-etags的错误,估计ctags-etags是用来生成一个文件索引文件,发现差异查找这个索引文件
出现错误:
which: no etags in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/latest/bin:/usr/local/tomcat/bin:/root/bin)
/bin/sh: line 1: etags:command not found
make[1]: [tags] Error 127(ignored)
make[1]: Leavingdirectory `/unison/unison-2.48.3′
解决办法:
# yum install ctags-etags
(make UISTYLE=text 报错时,需要创建/root/bin/文件夹后再运行make install。mkdir /root/bin/;make install;cp unison /root/bin/;cp unison /usr/local/bin/
报etags错误可以忽略或者安装etags:yum -y install ctags-etags)
在执行 make UISTYLE=text是可能会出现以下报错。是因为没有etags命令
可以使用 yum install ctags-etags解决。
F
linux web服务器静态资源的处理 unison+inotify双向同步的更多相关文章
- TCP/IP协议学习(四) 基于C# Socket的Web服务器---静态资源处理
目录 1. C# Socket通讯 2. HTTP 解析引擎 3. 资源读取和返回 4. 服务器测试和代码下载 Web服务器是Web资源的宿主,它需要处理用户端浏览器的请求,并指定对应的Web资源返回 ...
- linux web服务器及LAMP动态网站平台搭建
(vim补:)vim另存为:x,x w 目标文件路径vim批量删除x:x,x d Web服务:基于B/S架构的web通信服务端:支持HTTP协议的网页提供程序客户端:按标记规范显示网页的浏览器程序客户 ...
- web中静态资源和动态资源的概念及区别
1.静态资源和动态资源的概念 简单来说: 静态资源:一般客户端发送请求到web服务器,web服务器从内存在取到相应的文件,返回给客户端,客户端解析并渲染显示出来. 动态资源:一般客户端请求的动态资源, ...
- linux web服务器必需的库文件
往往安装完linux之后,本文用的centos6.4,再编译安装其它服务器软件时,总是提示缺少各种库文件,在这里我总结了一下 平时web服务器经常需要的一些库,如下: yum -y install m ...
- windows无法访问vmware搭建好虚拟机linux web服务器
[前置条件] vmware搭建好虚拟机web服务器 ,但是本机就是无法访问的解决办法. linux虚拟机的网络选择Bridged 桥接到本机网卡. 具体情况如下 : 1.本机能ping通虚拟机 2.虚 ...
- 08.Web服务器-4.Web服务器动态资源请求
1 浏览器请求动态页面过程 2 WSGI 怎么在你刚建立的Web服务器上运行一个Django应用和Flask应用,如何不做任何改变而适应不同的web架构呢? 在以前,选择 Python web 架构会 ...
- (4)Spring Boot Web开发---静态资源
文章目录 对静态资源的映射规则 模板引擎 Thymeleaf 使用 & 语法 使用之前将的快速创建项目的方法,勾选我们需要的场景,这里我需要 web --> web.sql --> ...
- rsync unison+inotify双向实时同步
rsync多线程同步 A:文件服务器 ip:10.10.1.10 B:备份服务器 ip:10.10.1.11 1.在B服务器上安装rsync软件 tar xzvf rsync-3.1.0.tar.gz ...
- linux web服务器,防火墙iptables最简配置
配置防火墙(服务器安全优化) 安全规划:开启 80 22 端口并 打开回路(回环地址 127.0.0.1) # iptables –P INPUT ACCEPT # iptables –P OUTP ...
随机推荐
- hdu Can you find it
这道题也是道二分的题,主要有几个注意点: 1.两个数组的合并的问题,可以将a数组和b数组合并,这样可以降低时间复杂度. 2.二分查找的left和right的变化问题.之前这里一直wa...一定要是le ...
- Silic PHP大马Cookie欺骗漏洞
$password="ebd9a3c106064a255aaee28b6eb4f21c"; if($_COOKIE['admin_silicpass'] != md5($passw ...
- SQL中批量删除被注入的恶意代码的方法
下文将为您介绍SQL中批量删除被注入的恶意代码的方法,供您参考,如果您也遇到了这样的问题,不妨一看,相信对您会有所帮助. 1,如果你的数据表很少的话,那么写几条简单的sql就搞定了 对于表中的nvch ...
- 11. 求奇数分之一序列前N项和
求奇数分之一序列前N项和 #include <stdio.h> int main() { int denominator, i, n; double item, sum; while (s ...
- PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别
[PHP 配置文件中与错误相关的选项 ] 选项 描述 error_reporting 设置错误报告的级别 display_errors 是否显示错误 log_errors 设置是否将错误信息记录到日志 ...
- page fault rate
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION A program computes th ...
- JsonCpp 简单使用
[转]自: http://www.cnblogs.com/ytjjyy/archive/2012/04/17/2453348.html JsonCpp 是一个C++用来处理JSON 数据的开发包.下面 ...
- SQL Server游标【转】
什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作 ...
- IOS 入门开发教程
object-c: http://mobile.51cto.com/iphone-261129.htm Objective-C入门教材 Objective-C入门教材 2011-05-11 15:58 ...
- 业界有很多MQ产品
目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量 ...