squidguardのカスタマイズ、冗長化構成時の自動同期のヒント

■squidguardの更新対象外のDBを設定する。
 すべて更新すると重くなります。かと言って設定から外すのもまた、復旧させたいときに困る。
 実質、「whitelist」と「personal」だけを更新すれば使えるようにカスタマイズします。

 参考:DebianEduHowToSquidGuard
 http://wiki.debian.org/DebianEdu/HowTo/SquidGuard


■私の環境ではターゲットが異なるので、以下のようにしてあります。

$ sudo grep "TARGET=" /etc/cron.daily/squid_blacklists_updates.sh
#TARGET=/var/lib/squidguard/db/blacklists
TARGET=/var/lib/squidguard/db

■ポルノ系や、Youtube等も見れなくなるような音楽/動画系の
 「domains」と「urls」を空文字で上書きする行を
 「squidguard」の設定ファイルを読み込んで更新する手前に追加します。

 必要になれば、「list」から外すか、「for〜done」をコメントアウトします。
 「mv」は不要なら以下のように削除します。

 「squidGuard.conf」や「squid.conf」を変更しなくて良いので管理が楽です。

$ sudo grep -A 4 "for list in" /etc/cron.daily/squid_blacklists_updates.sh
for list in porn/domains porn/urls audio-video/domains audio-video/urls;do
  # mv "$list" /tmp
  echo -n "" > "$list"
done

/usr/bin/squidGuard -c /etc/squid/squidGuard.conf  -C all

■手動で変更した場合は以下のコマンドを。。。

 squidの負荷分散と冗長化
 http://d.hatena.ne.jp/labunix/20120826

$ sudo ./myscripts/squidguard_reconfig.sh

■「squidguard_reconfig.sh」を含め、以下をgithubにもおきました。

 私の環境では「squidGuard_report.sh」と「squidsummary.sh」、
 それに上記の「squid_blacklists_updates.sh」を
 「cron.daily」にシンボリックリンクで置いてます。

 squidguard
 https://github.com/labunix/squidguard

$ w3m -dump https://raw.github.com/labunix/squidguard/master/README.md
squidguard
==========

# Block Report Mail Script
squidGuard_report.sh

# squidguard change owner and chage acl and Database Reconfigure.
squidguard_reconfig.sh

# squid client Report,See also : apt-cache show squidclient
squidsummary.sh

■実行と確認。

$ sudo /etc/cron.daily/squid_blacklists_updates.sh
$ sudo wc -l /var/lib/squidguard/db/*/[du]*s | grep " 0 "
      0 /var/lib/squidguard/db/audio-video/domains
      0 /var/lib/squidguard/db/audio-video/urls
      0 /var/lib/squidguard/db/mail/urls
      0 /var/lib/squidguard/db/porn/domains
      0 /var/lib/squidguard/db/porn/urls
      0 /var/lib/squidguard/db/suspect/urls

■使用状況の確認
 ヒット率も体感レスポンスもかなり良くなりました。

$ sudo squidclient mgr:info | grep "%"
        Request Hit Ratios:     5min: 18.2%, 60min: 4.4%
        Byte Hit Ratios:        5min: 26.9%, 60min: 0.1%
        Request Memory Hit Ratios:      5min: 50.0%, 60min: 48.4%
        Request Disk Hit Ratios:        5min: 0.0%, 60min: 4.9%
        CPU Usage:      0.20%
        CPU Usage, 5 minute avg:        0.03%
        CPU Usage, 60 minute avg:       2.05%
        Total in use:           69954 KB 84%
        Total free:             13457 KB 16%

■システムコールを除いたサーバ情報を確認。
 特にボトルネックになるような箇所も無いようです。

$ sudo squidclient mgr:60min 2>&1 | grep -v "0\.00000\|^syscalls\|^client"
HTTP/1.0 200 OK
Server: squid/2.7.STABLE9
Date: Wed, 05 Sep 2012 12:38:00 GMT
Content-Type: text/plain
Expires: Wed, 05 Sep 2012 12:38:00 GMT
X-Cache: MISS from vmsqueeze.localdomain
X-Cache-Lookup: MISS from vmsqueeze.localdomain:3128
Connection: close

sample_start_time = 1346845385.516036 (Wed, 05 Sep 2012 11:43:05 GMT)
sample_end_time = 1346848985.978227 (Wed, 05 Sep 2012 12:43:05 GMT)
server.all.requests = 1.424539/sec
server.all.kbytes_in = 473.462825/sec
server.all.kbytes_out = 1.637290/sec
server.http.requests = 1.250951/sec
server.http.kbytes_in = 470.554865/sec
server.http.kbytes_out = 0.981263/sec
server.other.requests = 0.173589/sec
server.other.kbytes_in = 2.908238/sec
server.other.kbytes_out = 0.655749/sec
dns.median_svc_time = 0.023364 seconds
unlink.requests = 1.086805/sec
page_faults = 0.001944/sec
select_loops = 591.988719/sec
select_fds = 607.478119/sec
average_select_fd_period = 0.001646/fd
swap.outs = 0.939879/sec
swap.ins = 0.026108/sec
aborted_requests = 0.000833/sec
cpu_time = 53.587348 seconds
wall_time = 3600.462191 seconds
cpu_usage = 1.488346%

■おまけ

 squidguardのブロックするDBだけで管理するように変更したので、
 制限はありますが、以下を対象に自動同期が可能です。

変更、管理するDB        「whitelist」「personal」
変更、管理するスクリプト「squid_blacklists_updates.sh」

■制限とは?

 「tar.gz」を任意の時間で展開する上書きと「squidguard_reconfig.sh」の実行によって、
 プロキシ通信が切断されます。(両方稼動していれば問題無いはず)

■送り側(MASTER)側の更新ファイルの取得
 ※指定ユーザの$HOME直下に「squid_blacklists_updates.sh」があれば一緒にtar.gzします。
  この時点では変更の有無は問いません。
  最低限「rootユーザ」は変更しましょう。

$ w3m -dump https://raw.github.com/labunix/squidguard-script/master/squidguard_slave.sh

#!/bin/bash

# Chenge user name and group name.

LOCALUSER=root
LOCALGROUP=root

TARGETDB=/var/lib/squidguard/db
MYHOME=`su $LOCALUSER -c 'echo $HOME'`
OUTFILE="${MYHOME}/squidguard_mydb_`date '+%Y%m%d_%H%M'`.tar"

if [ "`id -u`" -ne "0" ] ;then
  echo "Sorry, Not Permit User!"
  exit 1
fi

find "$TARGETDB" -type d \( -name "whitelist" -o -name "personal" \) -print | \
  tar cvf "$OUTFILE" `xargs`
test -f ${MYHOME}/squid_blacklists_updates.sh && tar rvf "$OUTFILE" ${MYHOME}/squid_blacklists_updates.sh
test -f "$OUTFILE" && gzip "$OUTFILE"
test -f "${OUTFILE}.gz" && chown $LOCALUSER:$LOCALGROUP "${OUTFILE}.gz"

unset OUTFILE MYHOME LOCALGROUP LOCALUSER TARGETDB

■rsync+ssh(MASTER)の場合のヒント

 1日以内に変更のあった「tar.gz」を見つけて$DSTサーバにコピーする。

$ LOCALUSER=root; \
  MYHOME=`su $LOCALUSER -c 'echo $HOME'`; \
  TARGET=`find $MYHOME -type f -mtime -1 -name "squidguard_mydb_[0-9]*_[0-9]*.tar.gz"`; \
  DST=remote-squeeze; \
  rsync -avz -e "ssh -p 22" "${MYHOME}/${TARGET}/" $DST:~/${TARGET}

■受け側(SLAVE)のヒント

 1日以内に変更のあった「tar.gz」を見つけて展開、squidguardのDBを再構築する。

$ LOCALUSER=root; \
  MYHOME=`su $LOCALUSER -c 'echo $HOME'`; \
  TARGET=`find $MYHOME -type f -mtime -1 -name "squidguard_mydb_[0-9]*_[0-9]*.tar.gz"`; \
  sudo tar zxvf $TARGET; \
  sudo $MYHOME/squidguard_reconfig.sh