unison+inotify 同步web代碼並排除指定目錄不一樣步

unison + inotify  實現web 數據雙向同步
 
unison 是一款跨平臺的文件同步對象,不只支撐本地對本地同步,也支持經過SSH,RSH和Socket 等網絡協議進行同步。unison 支持雙向同步,你能夠同A同步到B ,也能夠從B同步到A,這些都須要額外的設定。
 
 
源碼包下載地址:連接:https://pan.baidu.com/s/1b8DU70 密碼:sby7
1. 兩臺服務器都編譯安裝這三個源碼包,在此只寫在一臺服務器上的編譯安裝的過程,另外一臺請自行安裝
[root@localhost ~]# cd soft/
[root@localhost soft]# ls
inotify-tools-3.14.tar.gz  ocaml-3.10.2.tar.gz    v2.3.0.zip
jdk-7u21-linux-x64.rpm     unison-2.32.52.tar.gz
[root@localhost soft]# tar xf inotify-tools-3.14.tar.gz  -C /usr/src
[root@localhost soft]# tar xf ocaml-3.10.2.tar.gz -C /usr/src
[root@localhost soft]# tar xf unison-2.32.52.tar.gz -C /usr/src
[root@localhost soft]# cd /usr/src/inotify-tools-3.14/
[root@localhost inotify-tools-3.14]# yum -y install gcc gcc-c++ make
[root@localhost inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify && make && make install
[root@localhost inotify-tools-3.14]# cd /usr/local/inotify/
##修改PATH 環境變量:
[root@localhost inotify]# echo "PATH=/usr/local/inotify/bin:$PATH" > /etc/profile.d/inotify.sh
[root@localhost inotify]# source /etc/profile.d/inotify.sh
##添加庫文件到系統識別的路徑:
[root@localhost inotify]# echo "/usr/local/inotify/lib" > /etc/ld.so.conf.d/inotify.conf
[root@localhost inotify]# ldconfig -v | grep inotify
/usr/local/inotify/lib:
libinotifytools.so.0 -> libinotifytools.so.0.4.1
##連接庫文件到系統識別的路徑:
[root@localhost inotify]# ln -sv /usr/local/inotify/include/ /usr/include/inotify
`/usr/include/inotify' -> `/usr/local/inotify/include/'
##編譯安裝ocaml,unison依賴於ocaml
[root@localhost ocaml-3.10.2]# cd /usr/src/ocaml-3.10.2/
[root@localhost ocaml-3.10.2]# ./configure
[root@localhost ocaml-3.10.2]# make world opt
[root@localhost ocaml-3.10.2]# make install
[root@localhost ocaml-3.10.2]# cd /usr/src/unison-2.32.52/
[root@localhost unison-2.32.52]# yum -y install ctags-etags
[root@localhost unison-2.32.52]# make UISTYLE=text
[root@localhost unison-2.32.52]# make install
mv /root/bin//unison /tmp/unison-29781
mv: 沒法獲取"/root/bin//unison" 的文件狀態(stat): 沒有那個文件或目錄
make: [doinstall] 錯誤 1 (忽略)
cp unison /root/bin/
cp: 沒法建立普通文件"/root/bin/": 是一個目錄
make: *** [doinstall] 錯誤 1
報錯信息,依據提示操做:此錯誤就是要把unison 複製到/usr/local/bin下
[root@localhost unison-2.32.52]# find / -name unison -type f
/usr/src/unison-2.32.52/unison
[root@localhost unison-2.32.52]# cp /usr/src/unison-2.32.52/unison  /usr/local/bin/
[root@localhost unison-2.32.52]# make install   //在次執行 make install
mv /root/bin//unison /tmp/unison-29807
cp unison /root/bin/
cp unison /root/bin/unison-2.32
 
服務器B 上的安裝同上,在此省略。
 
2.服務器A 生成的公鑰傳到服務器B 上:
[root@localhost unison-2.32.52]# ssh-keygen -t rsa
[root@localhost ~]# scp ~/ .ssh/id_rsa.pub 192.168.9.28:/root/
##在服務器B 上移動公鑰並重命名
[root@localhost ~]# mv id_rsa.pub ./.ssh/authorized_keys
##公鑰受權爲600
[root@localhost ~]# chmod 600 .ssh/authorized_keys
## 服務器B 重啓sshd服務
[root@localhost ~]# service sshd restart
 
 
3. 服務器B 上生成的公鑰傳到服務器A 上
##服務器B 上生成公鑰
[root@localhost ~]# ssh-keygen -t rsa
##將服務器B 上公鑰傳到服務器A 上
[root@localhost ~]# scp ~/ .ssh/id_rsa.pub 192.168.9.27:/root/
##將服務器B 的公鑰移動並·重命名
[root@localhost ~]# mv id_rsa.pub .ssh//authorized_keys
## 修改權限爲600
[root@localhost ~]# chmod 600 .ssh/authorized_keys
##重啓服務器A sshd服務
[root@localhost ~]# service sshd restart
 
 
4.測試兩臺服務器是否能夠免密鑰登錄
## 服務器A 登錄服務器B
[root@localhost ~]# ssh root@192.168.9.28
Last login: Wed Nov 29 13:47:07 2017 from 192.168.10.245
[root@localhost ~]# exit
logout
Connection to 192.168.9.28 closed.
 
## 服務器B 登錄服務器A
[root@localhost ~]# ssh root@192.168.9.27
Last login: Wed Nov 29 13:46:59 2017 from 192.168.10.245
[root@localhost ~]# exit
logout
Connection to 192.168.9.27 closed.
 
五、分別搭建web服務器,兩臺服務器的代碼根目錄統一設定爲/usr/local/zx-runtime/zx
## 服務器A httpd 的搭建
[root@localhost ~]# rpm -q httpd
package httpd is not installed
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
136 Listen 80
949 <VirtualHost *:80>
950 DocumentRoot "/usr/local/zx-runtime/zx/"
951 CustomLog logs/access_log combined
952 ErrorLog logs/error_log
953 <Directory /usr/local/zx-runtime/zx>
954     Options FollowSymLinks
955     AllowOverride None
956     Order deny,allow
957     Deny from all
958     Allow from all
959 </Directory>
960 </VirtualHost>
[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# /etc/init.d/httpd start
正在啓動 httpd:
##建立apache 根目錄
[root@localhost zx]# pwd  
/usr/local/zx-runtime/zx
[root@localhost zx]# ls
index.html
[root@localhost zx]# cat index.html
9.27 頁面正常
瀏覽器訪問: http://192.168.9.27/index.html
 
## 服務器B httpd 服務的搭建
[root@localhost ~]# rpm -q httpd
package httpd is not installed
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
1003 <VirtualHost *:80>
1004 DocumentRoot "/usr/local/zx-runtime/zx/"
1005 CustomLog logs/access_log combined
1006 ErrorLog logs/error_log
1007 <Directory /usr/local/zx-runtime/zx>
1008     Options FollowSymLinks
1009     AllowOverride None
1010     Order deny,allow
1011     Deny from all
1012     Allow from all
1013 </Directory>
[root@localhost ~]# /etc/init.d/httpd start
正在啓動 httpd:
##建立apache 根目錄
[root@localhost zx]# pwd  
/usr/local/zx-runtime/zx
[root@localhost zx]# ls
index.html
[root@localhost zx]# cat index.html
9.28 頁面正常
 
瀏覽器訪問:http://192.168.9.28/index.html
 
6. 編輯unison 同步的腳本進行測試
## 服務器A 的腳本
[root@localhost ~]# mkdir scripts
[root@localhost ~]# cd scripts/
[root@localhost scripts]# vim serA.sh
 
#!/bin/bash
ipB="192.168.9.28"
srcA="/usr/local/zx-runtime/zx"
dstB="/usr/local/zx-runtime/zx"
/usr/local/inotify/bin/inotifywait -mrq -e create,delete,modify,move $srcA | while read line; do
/usr/local/bin/unison -batch $srcA ssh://$ipB/$dstB
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
 
##服務器B 的腳本
[root@localhost ~]# mkdir scripts
[root@localhost ~]# cd scripts/
[root@localhost scripts]# vim serB.sh
 
#/bin/bash
ipA="192.168.9.27"
srcB="/usr/local/zx-runtime/zx"
dstA="/usr/local/zx-runtime/zx"
/usr/local/inotify/bin/inotifywait -mrq -e create,delete,modify,move $srcB | while read line; do
/usr/local/bin/unison -batch $srcB ssh://$ipA/$dstA
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done
 
7.測試webA webB 上傳代碼是否同步
a .啓動webA,webB上的腳本
[root@localhost scripts]# sh -x serA.sh
[root@localhost scripts]# sh -x serB.sh
 
b.在webA上在開個終端,建立{1-5}.txt
[root@localhost zx]# pwd
/usr/local/zx-runtime/zx
[root@localhost zx]# ls
include  index.html  log
[root@localhost zx]# touch {1..5}.txt
[root@localhost zx]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  include  index.html  log
 
在webB上查看:目標文件都已經同步過來
[root@localhost zx]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  include  index.html  log
 
c. 在webB上建立{a..e}.txt,  在web1上查看
[root@localhost zx]# touch {a..e}.txt
[root@localhost zx]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  a.txt  b.txt  c.txt  d.txt  e.txt  include  index.html  log
 
在webA上查看: 目標文件都已同步過來
[root@localhost zx]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  a.txt  b.txt  c.txt  d.txt  e.txt  include  index.html  log
 
d. 刪除webA上的*.txt 文件
[root@localhost zx]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  a.txt  b.txt  c.txt  d.txt  e.txt  include  index.html  log
[root@localhost zx]# rm -rf *.txt
[root@localhost zx]# ls
include  index.html  log
 
在webB上查看: 目標文件已被刪除
[root@localhost zx]# ls
include  index.html  log
 
 
 
擴展:在實際生產環境,apache 根目錄有log目錄和compiled緩存目錄不須要同步。unison 工具支持排除指定目錄功能
 

模式匹配: html

以下參數 ignore/ignorenot, follow, sortfirst/sortlast, backup, merge 定義各自的匹配模式。 例如: ignore = pattern pattern 的語法格式linux

● Regex regexp 即常規表達式。c++

● Name name   路徑的最後一部分與 「name" 匹配。可使用通配符,見下面描述。web

● Path path 全路徑與 "path" 匹配。可使用通配符,見下面描述。apache

如下通配符能夠用在 Path 和 Name 中:vim

● ? 匹配除了 "/" 以外,任意單個字符; 瀏覽器

● * 匹配除了 "/" 以外的任意字符;若是用在 "Name" 中,則不和以 "."開始的文件匹配,而用在 "Path" 中,能夠和 "." 開始的向匹配。緩存

● [xyz] 匹配 {x,y,z} 中任一字符;bash

● {a,bb,ccc} 匹配 a, bb, ccc 中任何一個;服務器

示例:

● 忽略 CVS 目錄以及以 .cmo 結尾的文件: ignore = Name {CVS,*.cmo}

● 忽略路徑 a/b: ignore = Path a/b

● 忽略路徑 */tmp。當 * 用在 Path 中,能夠和以 "." 開始的文件、目錄名匹配,以下面的和 ".foo/tmp" 匹配; ignore = Path */tmp

● 忽略 a/b/ 開始,結尾是 .ml 的文件。 ignore = Regex a/b/.*\.ml

 
 
生產環境要求忽略log及compiled 目錄
在webA  webB 中 添加:
[root@localhost scripts]# vim /root/.unison/default.prf
 
# Unison preferences file
ignore = Name {log,compiled}
 
 
啓動jwebA webB 腳本
[root@localhost scripts]# sh -x serA.sh
[root@localhost scripts]# sh -x serB.sh
a . webA上建立 9-27compiled 文件
[root@localhost zx]# ls
include  index.html  log
[root@localhost zx]# cd include/compiled/
[root@localhost compiled]# ls
[root@localhost compiled]# touch 9-27compiled
[root@localhost compiled]# ls
9-27compiled
 
webB上查詢:  9-27compiled 緩存文件沒有同步過來,驗證成功
[root@localhost zx]# ls
include  index.html  log
[root@localhost zx]# cd include/compiled/
[root@localhost compiled]# ls
[root@localhost compiled]#
[root@localhost compiled]#
 
b. webA上建立log 日誌文件
[root@localhost compiled]# cd ../../log/
[root@localhost log]# ls
[root@localhost log]# touch 9-27.log
[root@localhost log]# ls
9-27.log
 
webB上查詢:  9-27.log 日誌文件沒有同步過來,驗證成功
[root@localhost compiled]# cd ../../log/
[root@localhost log]# ls
[root@localhost log]#
 
 
c. webA zx目錄 下建立{1..5}.txt
[root@localhost log]# cd ../
[root@localhost zx]# ls
include  index.html  log
[root@localhost zx]# touch {1..5}.txt
[root@localhost zx]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  include  index.html  log
 
webB上查詢: 驗證成功
[root@localhost log]# cd ../
[root@localhost zx]# ls
1.txt  2.txt  3.txt  4.txt  5.txt  include  index.html  log
 
 
d. webA 上建立log 日誌  compiled 緩存文件
[root@localhost zx]# cd log/
[root@localhost log]# ls
[root@localhost log]# touch 9-28.log
[root@localhost log]# ls
9-28.log
[root@localhost log]# cd ../include/compiled/
[root@localhost compiled]# ls
[root@localhost compiled]# touch 9-28compiled
[root@localhost compiled]# ls
9-28compiled
 
webA上查詢: 沒有同步過來,驗證成功
[root@localhost zx]# cd log/
[root@localhost log]# ls
9-27.log
[root@localhost log]# cd ../include/compiled/
[root@localhost compiled]# ls
9-27compiled
[root@localhost compiled]#
 
 
webA webB上腳本後臺啓動並添加到開機啓動
[root@localhost scripts]# chmod +x serA.sh
[root@localhost scripts]# ll
總用量 8
-rwxr-xr-x. 1 root root 406 11月 30 13:48 serA.sh
[root@localhost scripts]# nohup ./serA.sh &
[root@localhost scripts]# echo "/root/scripts/serA.sh" >> /etc/rc.local
[root@localhost scripts]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
 
touch /var/lock/subsys/local
/root/scripts/serA.sh
相關文章
相關標籤/搜索