またこれ備忘録と Squid のうんちく。
yum を使ってパッケージインスコした Squid なんだけども、デフォルトでくっついてくる
logrotate.d 以下へ収めるスクリプトをかますと「ログの多重ローテーション」が起こる。

これを修正してみた。

# 2008/01/10 でかいミスを修正
2009/01/06 01:40 アホしていたのでこの記事はシカトしてください orz
squid.conf にて
logfile_rotate 0
として、あとは logrotate に任せて ok ですわな…

我が家の Squid の用途は、LAN 内にあるマシンが Web へアクセスするとき、アクセスした
サイトのコンテンツをキャッシュさせて他のマシンで同じページを見たときや、数日後に見るとき、
同じ素材を使った別ページを見るとき等々でアクセスを高速化させる「キャッシュサーバー」です。
その他、変なプログラムが勝手に外部へアクセスしてないか~なんてチェックも出来ます。
ただ、ブラウザのプロキシ設定を全てこのサーバーにセッティングしておく必要があるんで、そこだけ
手間がかかるけど最初の一度だけだしまぁいいかなと (笑

ということで、こーすると Web サイトにアクセスするときはブラウザ自体が持つキャッシュが先ず参照され、
なければ外部に行くけど、間にかましてある Squid でまたキャッシュを参照する。
ここであればインターネットに出ることなく LAN 内で解決するのでコンテンツ表示が速くなる。
Squid のキャッシュにも無ければ初めてインターネットに出て行ってコンテンツを取得する。

ブラウザのキャッシュはそのマシンのみ保持されるけど、Squid のキャッシュは通るアクセス全てを
保持しようとするので、LAN 内の共有キャッシュってな訳になるのであります。
サーバーを立てていて、LAN 内に複数の PC がある場合に導入しておくと非常に便利な物です。

本題は Squid が吐くログ。
上記の通り、サーバーを通る度にアクセス元やらアクセス先の URL 等々記録されるので、サイズもまた
膨大な量になってしまいます。
Weekly でローテーションかまして gzip で圧縮していたけど、圧縮されたログとされていないログで
中身は全く同じという現象がずっと起きていた。
あれこれと調べていたら logrotate でローテーションさせるスクリプトが 2 重にローテーションを
してしまっていると判明。
よくよく見ればそうだよな…と思った…。

動作の流れをひとまとめにしてみたやつを抜粋
Filename : /etc/logrotate.d/squid

1
2
3
4
5
6
7
8
9
10
11
/var/log/squid/access.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    postrotate
      /usr/sbin/squid -k rotate
    endscript
}

2 行目で Weekly。一週間毎のローテーション。
3 行目は ログを 5 世代まで保持。
5 行目でローテーションされたログを圧縮と。
とりあえずこれだけで毎週ログがローテーションされるんだけど、問題になるのは postrotate 以下。
「squid -k rotate」ってこれ実行されると Squid 自体がもつローテーションの機能が働く。
世代管理も squid.conf に記述してあるけど 3 行目で殺されている。
設定では 10 世代まで保持としてたのだが。と。

ということで、logrotate での管理を辞めて素直に cron で対処。
スクリプトは簡単にかける程度の物。
以下の内容を /etc/cron.weekly にぶち込んで chmod 755 するだけ。
動作確認は…まだ週明けじゃないのでやっていない。検証なしで圧縮部までいれちまったのは
どうかと思うけどまぁいけるでしょうと適当です。(自分のホストだしどうでもいい (爆 )

#!/bin/sh
# Squid Log Rotate.
#                                                                    2007.12.29
 
if [ -e /var/run/squid.pid ]; then
  /usr/sbin/squid -k rotate
fi

とまぁこんなもんで週明けの cron weekly が動くのを待ってみよう。
12/30 weekly のジョブが走ったけどエラー吐いてた orz

# 2008/01/10 修正事項
スクリプト内で gzip 圧縮かましていたけど、圧縮後には「access.log.0」は「access.log.0.gz」
になってしまうので、squid から見たらローテートされたログが無いと判断する訳でして…
また新たに「accesslog.0」が作成されてしまいます。
そしてまた一週間たつと圧縮時にはすでに「access.log.0.gz」が存在するのでなんかいわれます。
というか cron なのでエラー吐くかな。
ということで、この記事で書いている方法だと非圧縮のローテーションになります。
結構容量でかいのでこれはなんとか対応したいところです。

関連記事

12月 29, 2007 at 3:55 pm by BuCCi
Category: Linux/UNIX
Tags: ,