Chinaunix首页 | 论坛 | 博客
  • 博客访问: 254817
  • 博文数量: 42
  • 博客积分: 3110
  • 博客等级: 中校
  • 技术积分: 830
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-18 22:12
文章分类

全部博文(42)

文章存档

2012年(2)

2011年(6)

2010年(5)

2009年(20)

2008年(9)

我的朋友

分类: LINUX

2010-04-22 17:14:25

要讓網站不因為機器硬體故障或人為操作錯誤而造成損失,備份是需要的。雖然我們可以將整個硬碟備份並燒成光碟,但是每天燒一片也等於每天製造一片垃圾(如 果網站都一直沒事的話)。故我們可以採用將重要資料備份到硬碟的作法,如果一段時間沒用上,我們可以將最舊的備份資料刪除掉,這樣就不怕資料庫掛了或人為 錯誤了。不過存放在本地端硬碟也有個風險,就是一旦硬碟掛了,就什麼都沒有了。比較保險一點的作法是同時也上傳一份檔案到遠端伺服器去,同時可以每個月或 每季再燒錄一片光碟以縮短真正需要復原時的下載時間。

由於很多檔案只要知道名字透過網路都可以找到,這些可以不用去備份它,來縮小備份檔的大小,加快檔案上傳到遠端伺服器。故我們需要的是找出真正需要備份的 資料檔或設定檔。以我的例子來說,當初規劃的目標是安裝一部主機可以達到下列功能
a. Internet connection(ADSL)
b. Dynamic IP DNS Mapping(no-ip)
c. SSH Server
d. FTP Server
e. DNS Server
f. Mail Server(Postfix + POP3/IMAP + Anti-Spam + Virus Scan)
g. Web Server(Apache + Tomcat + SSL)
h. Database Server(PostgreSQL)
i. Traffic monitor(SNMP, MRTG, AWstats)
j. Firewall(Auto-block)
故當我要備份時便要找到它們相關的設定檔,我把它們的內容列在backup.ini內,大致如下:
01/etc/awstats/*
02/etc/cron.hourly/split-vhost.sh
03/etc/httpd/conf/httpd.conf
04/etc/httpd/conf/workers.properties
05/etc/httpd/conf/ssl.crt/server.crt
06/etc/httpd/conf/ssl.key/server.key
07/etc/httpd/conf.d/*.conf
08/etc/mrtg/mrtg.cfg
09/etc/mrtg/mrtg.cpu
10/etc/mrtg/mrtg.ram
11/etc/postfix/access
12/etc/postfix/*.cf
13/etc/rc.d/init.d/noip
14/etc/rc.d/init.d/tomcat
15/etc/ssh/sshd_config
16/etc/sysconfig/i18n
17/etc/vsftpd/vsftpd.conf
18/etc/yum.repos.d/CentOS-Base.repo
19/etc/aliases
20/etc/amavisd.conf
21/etc/crontab
22/etc/dovecot.conf
23/etc/f-prot.conf
24/etc/fstab
25/etc/group
26/etc/hosts
27/etc/hosts.allow
28/etc/hosts.deny
29/etc/named.conf
30/etc/passwd
31/etc/php.ini
32/etc/resolv.conf
33/etc/vsftpd.chroot_list
34/etc/vsftpd.ftpusers
35/etc/vsftpd.user_list
36/root/admin/*
37/root/newsite/*
38/root/setup/*.sh
39/root/setup/*/*.sh
40/usr/bin/split-vhost.pl
41/usr/lib/sasl2/smtpd.conf
42/var/lib/pgsql/data/*.conf
43/var/lib/awstats/*
44/var/lib/webalizer/*
45/var/named/chroot/var/named/named.*
46/var/robust/worker1/conf/server.header
47/var/robust/worker1/conf/server.host
48/var/robust/worker1/conf/server.footer
49/var/robust/worker1/conf/server.xml
50/var/robust/worker1/conf/tomcat-users.xml
51/var/robust/worker1/conf/Catalina/*
52/var/robust/worker2/conf/server.header
53/var/tomcat5/bin/setenv.sh
54/var/tomcat5/common/classes/*
55/var/tomcat5/common/endorsed/jarlist.txt
56/var/tomcat5/common/lib/jarlist.txt
57/var/www/mrtg/*.png
58/var/www/mrtg/*.old
59/var/www/mrtg/*.log
60/var/www/mrtg/cpu.html
61/var/www/mrtg/ram.html
62/var/www/mrtg/net.html
63/var/www/mrtg/index.html
64/var/www/usage/*

/root/目錄下是我自己管理用的一些shell script,它們也一併備份起來。
接下來,我的網站安裝了兩套JForum來跑兩個網站,由於JForum可以由網路上下載得到,故我只需要備份無法從網路上下載得到的部分即可在需要復原 網站時派上用場。另外,我自己開發了一套webmail程式及改寫過的aquamp,我也一併整理進來,我把這個清單檔案命名為webapp.ini,內 容大致如下:
01/home/andowson/www/*.*
02/home/andowson/www/images/*.gif
03/home/andowson/www/images/avatar/*
04/home/andowson/www/templates/default/*.htm
05/home/andowson/www/templates/default/styles/zh_*.css
06/home/andowson/www/upload/*
07/home/andowson/www/WEB-INF/*.xml
08/home/andowson/www/WEB-INF/config/*.*
09/home/andowson/www/WEB-INF/config/database/generic/*
10/home/andowson/www/WEB-INF/config/database/postgresql/*
11/home/andowson/www/WEB-INF/config/languages/zh_*.properties
12/home/andowson/www/aquamp/*
13/home/andowson/www/webmail/*
14/home/30elite/www/*.*
15/home/30elite/www/images/*.gif
16/home/30elite/www/images/avatar/*
17/home/30elite/www/templates/tp101/*.htm
18/home/30elite/www/templates/tp101/styles/zh_*.css
19/home/30elite/www/upload/*
20/home/30elite/www/WEB-INF/*.xml
21/home/30elite/www/WEB-INF/config/*.*
22/home/30elite/www/WEB-INF/config/database/generic/*
23/home/30elite/www/WEB-INF/config/database/postgresql/*
24/home/30elite/www/WEB-INF/config/languages/zh_*.properties

好了,檔案的部分就差不多這樣子。別忘了,還有資料庫要備份,由於先前我還安裝了, 故在資料庫上多了一個olat資料庫要備份,這段我把它通通整理到/root/admin/backup.sh裡面去,先把資料庫名稱存到陣列 DBNAME去,透過迴圈的方式,透過pg_dump指令將資料庫備份到檔案,再將備份好的資料庫加到到db.tar去,最後再一次gzip起來。
由於這個backup.sh程式我可以設定為每天執行一次,故我想連系統狀態一併作個檢查,順便產生一個網頁檔好了,於是我又弄了一個 backup.html的樣版檔,內容大致如下:
01<html>
02<head>
03<title> [ hostname ] 每日檢查報表title>
04head>
05<body>
06<center>
07<h2> [ hostname ] 每日檢查報表h2>
08center>
09<div align="left">
10    <table>
11        <tr>
12            <td>主機名稱:td>
13            <td>hostnametd>
14        tr>
15        <tr>
16            <td>主機IP:td>
17            <td>iptd>
18        tr>
19        <tr>
20            <td>作業系統:td>
21            <td>os_versiontd>
22        tr>
23        <tr>
24            <td>Maintainer:td>
25            <td>webmaster@hostnametd>
26        tr>
27        <tr>
28            <td>CPU型號:td>
29            <td>cpumodeltd>
30        tr>
31        <tr>
32            <td>快取記憶體大小:td>
33            <td>cachesizetd>
34        tr>
35        <tr>
36            <td>實體記憶體大小:td>
37            <td>memsize MBtd>
38        tr>
39        <tr>
40            <td>虛擬記憶體大小:td>
41            <td>swapsize MBtd>
42        tr>
43        <tr>
44            <td>已開機時間:td>
45            <td>UPtimetd>
46        tr>
47        <tr>
48            <td>備份時間:td>
49            <td>backtimetd>
50        tr>
51    table>
52div>
53<table>
54  <tr>
55        <td>Log Typetd>
56        <td>File Nametd>
57        <td>Sizetd>
58    tr>
59    <tr>
60        <td>Apache LOGtd>
61        <td>/var/log/httpd/access_logtd>
62        <td>httpd_log_size MBtd>
63    tr>
64  <tr>
65        <td>Tomcat LOGtd>
66        <td>/var/robust/worker1/logs/catalina.outtd>
67        <td>tomcat_log_size MBtd>
68    tr>
69  <tr>
70        <td>Login LOGtd>
71        <td>/var/log/lastlogtd>
72        <td>lastlog_size MBtd>
73    tr>
74  <tr>
75        <td>Sendmail LOGtd>
76        <td>/var/log/maillogtd>
77        <td>maillog_size byte(s)td>
78    tr>
79  <tr>
80        <td>System LOGtd>
81        <td>/var/log/messagestd>
82        <td>messages_size byte(s)td>
83    tr>
84table>
85<p>p>
86<table>
87    
88    <tr>
89        <td>IPtd>
90        <td><a href="">CPU Loading(%)a>td>
91        <td><a href="">RAM Usage(%)a>td>
92        <td>HD Usage(%)td>
93        <td><a href="">Bandwidtha>td>
94    tr>
95    <tr>
96        <td>iptd>
97        <td>使用者: cpuusr%<p>系統: cpusys%td>
98        <td>實體: memused%<p>虛擬: swapused%td>
99        <td>

透過sed指令將一些變數取代掉。最後將這個網頁傳到遠端的網頁主機並發一封通知信,這樣就不會忘記每天去看一下狀態了。
詳細的backup.sh如下:
001#! /bin/bash
002# Name: Backup and System Health Check Report
003# Author: Andowson Chang (andowson [at] gmail [dot] com)
004# Version: 1.2
005# First Released: 2005/11/09
006# Last Modified: 2007/06/24
007 
008# Modify the following line for your environment
009ADMIN_PATH=/root/admin
010BACKUP_FILE_PATH=/home/andowson/backup
011DBNAME=( forum elite olat )
012MAILTO=someone@andowson.com
013NOTICE=${BACKUP_FILE_PATH}/notice.html
014REMOTE_WEB=remote.andowson.com
015 
016ip=`/sbin/ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d":" -f2`
017checkdate=`date +%Y%m%d`
018 
019# Generate jarlist.txt for recover jar files
020cd /var/tomcat5/common/endorsed
021ls *.jar > jarlist.txt
022cd /var/tomcat5/common/lib
023ls *.jar > jarlist.txt
024 
025# Backup system config files
026rm -rf ${BACKUP_FILE_PATH}/${ip}.tar.gz
027tar zcvf ${BACKUP_FILE_PATH}/${ip}.tar.gz `cat ${ADMIN_PATH}/backup.ini`
028 
029# Backup web application files
030tar zcvf ${BACKUP_FILE_PATH}/webapp_${checkdate}.tar.gz `cat ${ADMIN_PATH}/webapp.ini`
031 
032# Backup PostgreSQL databases
033for (( i = 0 ; i < ${#DBNAME[@]} ; i++ ))
034do
035    su - postgres -c "pg_dump ${DBNAME[i]} > /var/lib/pgsql/backups/${DBNAME[i]}_${checkdate}.bak"
036    tar rvf ${BACKUP_FILE_PATH}/db_${checkdate}.tar /var/lib/pgsql/backups/${DBNAME[i]}_${checkdate}.bak
037done
038gzip -f ${BACKUP_FILE_PATH}/db_${checkdate}.tar
039 
040backuptime=`date "+%Y-%m-%d %T"`
041 
042# Get system hardware information and status
043hostname=`/bin/hostname`
044os_version=`uname`" "`uname -r`
045cpumodel=`cat /proc/cpuinfo|grep "model name"|awk '{print $4" "$5" "$6" "$7}'|head -1`
046clock=`cat /proc/cpuinfo|grep "model name"|awk '{print $7}'|head -1`
047cachesize=`cat /proc/cpuinfo|grep "cache size"|awk '{print $4" "$5}'|head -1`
048mem=`cat /proc/meminfo|grep "MemTotal:"|awk '{print $2}'`
049swap=`cat /proc/meminfo|grep "SwapTotal:"|awk '{print $2}'`
050let MB=1024*1024
051let KB=1024
052let memsize=$mem/$KB
053let swapsize=$swap/$KB
054UPtime=`/usr/bin/uptime | awk '{print $3 " " $4 " " $5}' | cut -d"," -f1-2`
055 
056cpuusage=`/usr/bin/sar -u 1 3 | grep Average | awk '{print $3 " " $5}'`
057cpuusr=`echo $cpuusage | cut -d" " -f1`
058cpusys=`echo $cpuusage | cut -d" " -f2`
059 
060ramusage=`/usr/bin/sar -r 3 3 | grep Average | awk '{print $4 " " $9}'`
061memused=`echo $ramusage | cut -d" " -f1`
062swapused=`echo $ramusage | cut -d" " -f2`
063 
064hdusage=`df -t ext3 -h|awk '{print $6"\t" $2"\t" $3"\t" $4"\t" $5}'`
065 
066let lastlog_size=`/bin/ls -l /var/log/lastlog|awk '{print $5}'`/$MB
067let maillog_size=`/bin/ls -l /var/log/maillog|awk '{print $5}'`
068let messages_size=`/bin/ls -l /var/log/messages|awk '{print $5}'`
069let httpd_log_size=`/bin/ls -l /var/log/httpd/access_log|awk '{print $5}'`/$MB
070let tomcat_log_size=`/bin/ls -l /var/robust/worker1/logs/catalina.out|awk '{print $5}'`/$MB
071 
072grep "b/秒" /var/www/mrtg/${ip}_2.html |awk '{print $2 $3}'|cut -d ">" -f3|head -6 > /tmp/mrtg.tmp
073maxin=`head -1 /tmp/mrtg.tmp`
074avgin=`tail -5 /tmp/mrtg.tmp|head -1`
075maxout=`tail -3 /tmp/mrtg.tmp|head -1`
076avgout=`tail -2 /tmp/mrtg.tmp|head -1`
077# Generate HTML report page
078sed -e "s/hostname/$hostname/g" -e "s/ip/$ip/g" -e "s/backtime/$backuptime/g" \
079    -e "s/os_version/$os_version/g" -e "s/cpumodel/$cpumodel/g" \
080    -e "s/cachesize/$cachesize/g" -e "s/memsize/$memsize/g" \
081    -e "s/swapsize/$swapsize/g" -e "s/UPtime/$UPtime/g" \
082    -e "s/lastlog_size/$lastlog_size/g" -e "s/maillog_size/$maillog_size/g" \
083    -e "s/messages_size/$messages_size/g" -e "s/httpd_log_size/$httpd_log_size/g" \
084    -e "s/tomcat_log_size/$tomcat_log_size/g" -e "s/cpuusr/$cpuusr/g" \
085    -e "s/cpusys/$cpusys/g" -e "s/memused/$memused/g" \
086    -e "s/swapused/$swapused/g" ${ADMIN_PATH}/backup.html > ${BACKUP_FILE_PATH}/${ip}_${checkdate}.html
087echo "
$hdusage
"
>> ${BACKUP_FILE_PATH}/${ip}_${checkdate}.html
088echo "
089        最大流入: ${maxin}
平均流入: ${avgin}
最大流出: ${maxout}
平均流出: ${avgout}
090    
091
092
093 
094" >> ${BACKUP_FILE_PATH}/${ip}_${checkdate}.html
095rm -rf /tmp/mrtg.tmp
096 
097echo "
098
099每日系統檢查 表
100
101
102
104
105
106" > ${BACKUP_FILE_PATH}/index.html
107 
108# Upload to remote backup server
109cd ${BACKUP_FILE_PATH}
110# The disk space is limited, so we only keep the lastest version
111cp db_${checkdate}.tar.gz db.tar.gz
112cp webapp_${checkdate}.tar.gz webapp.tar.gz
113. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup index.html
114. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup ${ip}_${checkdate}.html
115. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup db.tar.gz
116. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup ${ip}.tar.gz
117. ${ADMIN_PATH}/ftp.sh `cat ${ADMIN_PATH}/ftp.cfg` backup webapp.tar.gz
118rm -rf db.tar.gz
119rm -rf webapp.tar.gz
120 
121echo "${REMOTE_WEB}/backup/${ip}_${checkdate}.html" > ${NOTICE}
122mail -s "${hostname} ${checkdate}的備份及系統檢查已完成" ${MAILTO} < ${NOTICE}
123 
124echo "Done!"

對了,遠端伺服器的FTP設定我另外存到ftp.cfg去,格式如下:
1remotehost username password

remotehost:請改成您的遠端主機IP(需有啟動FTP Server)
username:請改成您的FTP帳號
password:請改成您的FTP密碼
注意您得在遠端的主機上先建立一個backup的目錄!

至於ftp.sh的內容則很簡單,如下:
01#! /bin/bash
02/usr/bin/ftp -v -n >> /tmp/ftp.log <
03open $1
04user $2 $3
05bi
06prompt
07cd $4
08mput $5
09quit
10EOD

執行後可以到/tmp下看ftp的log檔。

最後,只要在/etc/crontab上加上定期自動執行backup.sh就完成了。
1# backup data and generate system report(2007.06.24)
201 03 * * * root /root/admin/backup.sh > /var/log/backup.log


日後,如果有新安裝的程式或網站,只需要修改backup.ini或webapp.ini即可。

使用方式:
1.先將檔案下載存到/root/admin下,將backup.sh修改為可執行。
2.建立一個備份用的本地端目錄,例如如/home/andowson/backup。
3.在遠端伺服器上亦需建立一個backup資料夾。
4.編輯backup.ini, webapp.ini及ftp.cfg, 修改backup.sh上面的一些參數。
5.執行/root/admin/backup.sh > backup.log,看是否正常,如果正常才進行下個步驟,否則應繼續進行步驟4。
6.設定/etc/crontab
文件:linux auto backup.rar
大小:3KB
下载:下载
阅读(556) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~