ブログのメンテナンス

6633 ワード


文章はまず、コードハチのノートで発表します.
 
 
私のブログのメンテナンススクリプトの機能は主に、ブログ(MySQL、PHP-FPM、NRGIX)を起動し、停止し、データベースデータとアクセスログのバックアップ、Wordpressのファイルパッケージのバックアップ、悪意のスキャンしたIPをファイアウォールのブラックリストに参加し、人類訪問の記録をフィルタリングします.
私のVPSのシステムはUbuntu 12.04です.
 
ブログのスクリプトを開始、停止します.
startBlog.sh、このスクリプトは起動スクリプトに加えられています.もしVPSが再起動されたら、自動的にブログを起動します.
log=/home/coderbee/blog/startBlogLog.log
date >> $log
/usr/share/mysql/bin/mysql.server start && {
        /usr/share/php5/sbin/php-fpm && {
                /usr/share/nginx/sbin/nginx && echo "start blog ok" >> $log ||
                echo "start nginx failed " >> $log ;
        };
} || { echo "start mysql failed ."  >> $log ; }
shutDownBlog.shは、この脚本は主にブログを作り始めたばかりの時に使います.今はほとんど使われていません.
/usr/share/mysql/bin/mysql.server stop 2>&1 >/dev/null
kill -quit `cat /usr/share/php5/var/run/php-fpm.pid` 2>&1 >/dev/null
/usr/share/nginx/sbin/nginx -s stop 2>&1 >/dev/null
 
データベースデータとアクセスログのバックアップパッケージ
cronday.shは、この脚本は毎朝のスケジュールで行われます.
export JAVA_HOME='/usr/share/jdk1.7.0_21'
export PATH=$PATH:$JAVA_HOME/bin

blog=/home/coderbee/blog/
bakDir=${blog}dataBak
#   mysqldump            ,   vpsBack.jar   Dropbox,vpsBack.jar  Dropbox API       ,         。
/usr/share/mysql/bin/mysqldump -u wpblog -p'password' blog > ${bakDir}/blog-bak.sql.tmp 2>/dev/null &&
 mv ${bakDir}/blog-bak.sql.tmp ${bakDir}/blog-bak.sql  &&
 java -jar ${blog}vpsBack.jar upload vpsBak4coderbee/db/`date -d"yesterday" +"%Y%m%d"`/ ${bakDir}/blog-bak.sql &&
 echo "backup sql to dropbox ok ."


#                      ,                     。
monDir=${bakDir}/weblog/$(date -d"yesterday" +"%Y")/$(date -d"yesterday" +"%m")
dayPath=$(date -d"yesterday" +"%d").log
[ -d "${monDir}" ] || mkdir -p ${monDir}


logDir=/usr/share/nginx/logs

#  nginx    、  、  
cd $logDir && cp access.log ${dayPath} && :> access.log &&
#    nginx        
kill -USR1  `cat /usr/share/nginx/logs/nginx.pid` &&


#        
tar -czf "${dayPath}.tar.gz" "${dayPath}" &&

#        
rm -f ${dayPath} && mv -f "${dayPath}.tar.gz" ${monDir} &&
chown -R coderbee:appgroup ${bakDir} && echo "backup web log down"
 
WordPressのファイルパッケージのバックアップ
cronweek.shは、このスクリプトはWordpressのファイルを包装し、Dropboxにアップロードします.ブログを書いてアップロードするマルチメディアとWordpressプラグインは普通このディレクトリの下に置くので、毎週一回バックアップします.
cd /var/www/

export JAVA_HOME="/usr/share/jdk1.7.0_21"
export PATH=$PATH:$JAVA_HOME/bin

fname="web-`date +"%Y%m%d" -d"yesterday"`.gz"
tar czf $fname wordpress/ && 
 java -jar /home/coderbee/blog/vpsBack.jar upload vpsBak4coderbee/web/ $fname &&
 rm $fname && echo "backup web done ."
 
人類訪問の記録を濾過する
まず私のnginxのログログフォーマットを言います.'$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 
例えばこれは一つです.122.194.20.145 - - [03/Aug/2013:18:13:49 +0800] "GET /index.php/algorithm/20130801/343 HTTP/1.1" 200 10575 "http://news.dbanotes.net/newest" "Mozilla/5.0 (iPad; CPU OS 6_0_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A550 Safari/8536.25" "-" 
これは簡単なログ処理スクリプトで、今日のブログ記事とトップページのアクセスログだけを処理して、User-Agentによってフィルタリングします.
log="/usr/share/nginx/logs/access.log"

awk -F"\"" '$2 ~ /(GET \/ HTTP.*)|(\/index.php\/[a-zA-Z]*\/[0-9]+\/[0-9]+ .*)|(\/html5\/[a-zA-Z0-9]+.html .*)/ && $6 !~/(http:\/\/|Java|robot|.com|Wget|PHP|Reeder|Spider|(^-$)|ips-agent|@)/ {print $0}' $log
 
また、refer統計によると:. humanVisit.sh | awk -F"\"" '{print $2, $4}' | cut -d" " -f2,4 | sort -k 1 | uniq -c 
アクセスが一番多いurl:. humanVisit.sh | awk -F"\"" '{print $2}' | cut -d" " -f2 | sort | uniq -c 
悪意のスキャンのIPをファイアウォールのブラックリストに参加します.
このスクリプトは最近追加されたもので、主にそれらのアクセスログの4 xx状態、訪問URLは悪意のあるIPをファイアウォールに追加してフィルタリングします.クロンでは時間のスケジュールなしに一回実行します.
ipfilter.sh
cd /home/coderbee/blog/
sortIps=sortIpx

#          4xx  、   URL    admin|Admin|scripts  php     IP
awk -F'"' '$3~/4.. [0-9]+/ && $2 ~ /GET \/.*(admin|Admin|scripts).+(index|setup)\.php/ {print $0}' /usr/share/nginx/logs/access.log | awk '{print $1}' >> evilIP

sort evilIP | uniq > evilIP.tmp && mv evilIP{.tmp,}

iptables -F INPUT

#     IP/24      
cut -d. -f1-3 ips evilIP | sort | uniq > $sortIps
for i in $sortIps
do
    while read line
    do
        if [[ ! -z $line ]]; then
           ip=$line/24
           iptables -t filter -I INPUT -s $ip -j DROP
        fi
    done < $i
done

rm $sortIps
クラウンスケジューリング
1  0  *   *  * /home/coderbee/blog/cronday.sh 2>&1 >> /home/coderbee/blog/cronlog
1  4  *   *  1 /home/coderbee/blog/cronweek.sh 2>&1 >> /home/coderbee/blog/cronlog
1  *  *   *  * /home/coderbee/blog/ipfilter.sh 2>&1 >> /home/coderbee/blog/ipfilterlog
結び目
ここには複雑で深いものはありません.基本的にはAWK処理テキスト、sort順序、uniq去重、cutフィルタフィールド、tarは包装圧縮、cronタイミングでスケジュールし、shellの命令条件で実行、コマンドコンビネーション、リダイレクトなどを行います.
 
これはこのLinuxシステムの強力な一つである.大量の簡単な基本命令を提供し、これらの命令をshellで結合することでより複雑で強力な機能を実現することができる.
 
私もLinux shellのもっと多い遊び方を探し続けます.できるだけ手作業を自動化に変えてください.
 
Linuxの下でshellを編集するには、まずコマンドラインのテキストエディタをマスターしなければなりません.普通はViです.以前はクールシェルのこの文章「簡明Vim練習級攻略」http://coderbee.net/index.php/notes/20130803/372によって、二週間ぐらい練習してから基本的に上手になりました.
 
ブログの構築過程について見られます.http://coolshell.cn/articles/5426.html.