要讓網站不因為機器硬體故障或人為操作錯誤而造成損失,備份是需要的。雖然我們可以將整個硬碟備份並燒成光碟,但是每天燒一片也等於每天製造一片垃圾(如
果網站都一直沒事的話)。故我們可以採用將重要資料備份到硬碟的作法,如果一段時間沒用上,我們可以將最舊的備份資料刪除掉,這樣就不怕資料庫掛了或人為
錯誤了。不過存放在本地端硬碟也有個風險,就是一旦硬碟掛了,就什麼都沒有了。比較保險一點的作法是同時也上傳一份檔案到遠端伺服器去,同時可以每個月或
每季再燒錄一片光碟以縮短真正需要復原時的下載時間。
由於很多檔案只要知道名字透過網路都可以找到,這些可以不用去備份它,來縮小備份檔的大小,加快檔案上傳到遠端伺服器。故我們需要的是找出真正需要備份的資料檔或設定檔。以我的例子來說,當初規劃的目標是安裝一部主機可以達到下列功能
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內,大致如下:
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 |
14 | /etc/rc.d/init.d/tomcat |
17 | /etc/vsftpd/vsftpd.conf |
18 | /etc/yum.repos.d/CentOS-Base.repo |
33 | /etc/vsftpd.chroot_list |
40 | /usr/bin/split-vhost.pl |
41 | /usr/lib/sasl2/smtpd.conf |
42 | /var/lib/pgsql/data/*.conf |
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 |
63 | /var/www/mrtg/index.html |
/root/目錄下是我自己管理用的一些shell script,它們也一併備份起來。
接下來,我的網站安裝了兩套JForum來跑兩個網站,由於JForum可以由網路上下載得到,故我只需要備份無法從網路上下載得到的部分即可在需要復原
網站時派上用場。另外,我自己開發了一套webmail程式及改寫過的aquamp,我也一併整理進來,我把這個清單檔案命名為webapp.ini,內
容大致如下:
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/* |
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的樣版檔,內容大致如下:
03 | < title > [ hostname ] 每日檢查報表 title > |
07 | < h2 > [ hostname ] 每日檢查報表 h2 > |
25 | < td >webmaster@hostname td > |
61 | < td >/var/log/httpd/access_log td > |
62 | < td >httpd_log_size MB td > |
66 | < td >/var/robust/worker1/logs/catalina.out td > |
67 | < td >tomcat_log_size MB td > |
71 | < td >/var/log/lastlog td > |
72 | < td >lastlog_size MB td > |
76 | < td >/var/log/maillog td > |
77 | < td >maillog_size byte(s) td > |
81 | < td >/var/log/messages td > |
82 | < td >messages_size byte(s) td > |
90 | < td >< a href = "" >CPU Loading(%) a > td > |
91 | < td >< a href = "" >RAM Usage(%) a > td > |
93 | < td >< a href = "" >Bandwidth a > td > |
97 | < td >使用者: cpuusr%< p >系統: cpusys% td > |
98 | < td >實體: memused%< p >虛擬: swapused% td > |
透過sed指令將一些變數取代掉。最後將這個網頁傳到遠端的網頁主機並發一封通知信,這樣就不會忘記每天去看一下狀態了。
詳細的backup.sh如下:
002 | # Name: Backup and System Health Check Report |
003 | # Author: Andowson Chang (andowson [at] gmail [dot] com) |
005 | # First Released: 2005 / 11 / 09 |
006 | # Last Modified: 2007 / 06 / 24 |
008 | # Modify the following line for your environment |
009 | ADMIN_PATH=/root/admin |
010 | BACKUP_FILE_PATH=/home/andowson/backup |
011 | DBNAME=( forum elite olat ) |
012 | MAILTO=someone @andowson .com |
013 | NOTICE=${BACKUP_FILE_PATH}/notice.html |
014 | REMOTE_WEB=remote.andowson.com |
016 | ip=`/sbin/ifconfig eth0|grep "inet addr" |awk '{print $2}' |cut -d ":" -f2` |
017 | checkdate=`date +%Y%m%d` |
019 | # Generate jarlist.txt for recover jar files |
020 | cd /var/tomcat5/common/endorsed |
021 | ls *.jar > jarlist.txt |
022 | cd /var/tomcat5/common/lib |
023 | ls *.jar > jarlist.txt |
025 | # Backup system config files |
026 | rm -rf ${BACKUP_FILE_PATH}/${ip}.tar.gz |
027 | tar zcvf ${BACKUP_FILE_PATH}/${ip}.tar.gz `cat ${ADMIN_PATH}/backup.ini` |
029 | # Backup web application files |
030 | tar zcvf ${BACKUP_FILE_PATH}/webapp_${checkdate}.tar.gz `cat ${ADMIN_PATH}/webapp.ini` |
032 | # Backup PostgreSQL databases |
033 | for (( i = 0 ; i < ${#DBNAME[@]} ; i++ )) |
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 |
038 | gzip -f ${BACKUP_FILE_PATH}/db_${checkdate}.tar |
040 | backuptime=`date "+%Y-%m-%d %T" ` |
042 | # Get system hardware information and status |
043 | hostname=`/bin/hostname` |
044 | os_version=`uname` " " `uname -r` |
045 | cpumodel=`cat /proc/cpuinfo|grep "model name" |awk '{print $4" "$5" "$6" "$7}' |head - 1 ` |
046 | clock=`cat /proc/cpuinfo|grep "model name" |awk '{print $7}' |head - 1 ` |
047 | cachesize=`cat /proc/cpuinfo|grep "cache size" |awk '{print $4" "$5}' |head - 1 ` |
048 | mem=`cat /proc/meminfo|grep "MemTotal:" |awk '{print $2}' ` |
049 | swap=`cat /proc/meminfo|grep "SwapTotal:" |awk '{print $2}' ` |
053 | let swapsize=$swap/$KB |
054 | UPtime=`/usr/bin/uptime | awk '{print $3 " " $4 " " $5}' | cut -d "," -f1- 2 ` |
056 | cpuusage=`/usr/bin/sar -u 1 3 | grep Average | awk '{print $3 " " $5}' ` |
057 | cpuusr=`echo $cpuusage | cut -d " " -f1` |
058 | cpusys=`echo $cpuusage | cut -d " " -f2` |
060 | ramusage=`/usr/bin/sar -r 3 3 | grep Average | awk '{print $4 " " $9}' ` |
061 | memused=`echo $ramusage | cut -d " " -f1` |
062 | swapused=`echo $ramusage | cut -d " " -f2` |
064 | hdusage=`df -t ext3 -h|awk '{print $6"\t" $2"\t" $3"\t" $4"\t" $5}' ` |
066 | let lastlog_size=`/bin/ls -l /var/log/lastlog|awk '{print $5}' `/$MB |
067 | let maillog_size=`/bin/ls -l /var/log/maillog|awk '{print $5}' ` |
068 | let messages_size=`/bin/ls -l /var/log/messages|awk '{print $5}' ` |
069 | let httpd_log_size=`/bin/ls -l /var/log/httpd/access_log|awk '{print $5}' `/$MB |
070 | let tomcat_log_size=`/bin/ls -l /var/robust/worker1/logs/catalina.out|awk '{print $5}' `/$MB |
072 | grep "b/秒" /var/www/mrtg/${ip}_2.html |awk '{print $2 $3}' |cut -d ">" -f3|head - 6 > /tmp/mrtg.tmp |
073 | maxin=`head - 1 /tmp/mrtg.tmp` |
074 | avgin=`tail - 5 /tmp/mrtg.tmp|head - 1 ` |
075 | maxout=`tail - 3 /tmp/mrtg.tmp|head - 1 ` |
076 | avgout=`tail - 2 /tmp/mrtg.tmp|head - 1 ` |
077 | # Generate HTML report page |
078 | sed -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 |
087 | echo "$hdusage " >> ${BACKUP_FILE_PATH}/${ip}_${checkdate}.html |
089 | 最大流入: ${maxin} 平均流入: ${avgin} 最大流出: ${maxout} 平均流出: ${avgout} |
|