コントロールパネルのバグか何かでAWStatsが更新されなくなった
新しいドメインを追加したからか、ある日を境にAWStatsが更新されなくなっていました。
追加したドメイン以外のAWStatsも更新されなくなっていたので、CORESERVER側のクロンが失敗しているのか、そもそもCORESERVER側のクロンが動いていないのか不明な状況でした。
共用レンタルサーバーは大元のクロンログを見ることができませんので、四苦八苦した末に下記の方法で解決できました。
コントロールパネルのバグなのか /public_html/log/awstats/cgi-bin/awstats.[ドメイン名].conf も作成されていなかった
幸いにも以前正常に動作していた他のドメインの設定ファイルがあったので、それを使うことにしました。 同じ現象でお困りの方のために、こちら(クリックするとすぐダウンロードが始まります)にテンプレートファイルを置いておきます。
[CORESERVER専用] AWStatsの設定ファイルを自力で作成する手順
awstats.your-domain-FQDN.conf のファイル名を awstats.example.com.conf のように リネームします。 リネームした awstats.example.com.conf をテキストエディタで開いて 57行目の LogFile="/virtual/your-account/log/your-domain-FQDN.log" を LogFile="/virtual/アカウント名/log/example.com.log" に変更 101行目の PurgeLogFile="/virtual/your-account/log/your-domain-FQDN.log" を PurgeLogFile="/virtual/アカウント名/log/example.com.log" に変更 134行目の SiteDomain="your-domain-FQDN" を SiteDomain="example.com" に変更 FTPで /public_html/log/awstats/cgi-bin/の中に awstats.example.com.conf をアップロード
パーミッションは0600をおすすめしますが、0644でもawstats.plで怒られはするものの別に動きます。
CORESERVERは親切にもApacheの生アクセスログでIPを逆引きしてくれているので、AWStatsで解析に含めたくない自分のISPを除外するのも簡単です。
付録:自分の閲覧をAWStatsの解析から除外する設定
137行目 SkipHosts="" を SkipHosts="REGEX[^provider\-sample.+\.example\.com$]" のように変更
注)正規表現を使う場合はハイフンやドットのエスケープが必要です。
awstats.plのコマンドライン実行にバグがある
私がCORESERVERのコントロールパネルからインストールしたAWStatsはバージョンが7.6 (build 20161204)だったのですが、awstats.plのコマンドライン実行にバグがありました。
一般的なAWStatsの更新コマンド例
awstats.plにバグがあるので、 一見正常終了しますがWEB上で解析結果を閲覧できません。 -bash-4.2$ /usr/local/bin/perl /virtual/アカウント名/public_html/log/awstats/cgi-bin/awstats.pl -config=/virtual/アカウント名/public_html/log/awstats/cgi-bin/awstats.ドメイン名.conf -update
ドメイン名を指定しているのに、
出力される解析ファイルがすべて「awstats<mmyyyy>.txt」形式になってしまうのです。
「awstats<mmyyyy>.ドメイン名.txt」で書き出されないとAWStatsの閲覧画面で認識されません。はてさて、どうしたものか…。
結果的にawstats.plのソースコードをほぼ全行読み、ソースコードを改変せずにバグを解決する方法を見つけました。
ソースコードを改変せずにawstats.plのバグを回避するコマンド
-bash-4.2$ AWSTATS_FORCE_CONFIG=ドメイン名 && export AWSTATS_FORCE_CONFIG && /usr/local/bin/perl /virtual/アカウント名/public_html/log/awstats/cgi-bin/awstats.pl -config=/virtual/アカウント名/public_html/log/awstats/cgi-bin/awstats.ドメイン名.conf -update
awstats.plの17,387行目に$ENV{'AWSTATS_FORCE_CONFIG'}で強制的に割り込みできる箇所があったので、環境変数を渡して解決する、という方法です。
CRONジョブに登録する
CORESERVERでCRONを登録するには、シェルスクリプトにしなければならないので、 下記のような.shファイルを作成します。
#!/bin/sh AWSTATS_FORCE_CONFIG=example.com export AWSTATS_FORCE_CONFIG time(/usr/local/bin/perl /virtual/アカウント名/public_html/log/awstats/cgi-bin/awstats.pl -config=/virtual/アカウント名/public_html/log/awstats/cgi-bin/awstats.example.com.conf -update) 2>&1 exit
.shファイルを設置する場所はどこでも良いですが、/public_html/ドメイン名/直下においておくと、 何のためのshファイルなのか忘れなくて良いかと思います。
パーミッションは0500を推奨しますが、0700でも構いません。自分以外のアカウントには権限を与えないようにするのがポイントです。
仮に /public_html/ドメイン名/cron-awstats-update.sh に設置した場合、CRONジョブは以下のように設定します。
旧コントロールパネルの場合
新コントロールパネルの場合
0 8 * * * /virtual/アカウント名/public_html/ドメイン名/cron-awstats-update.sh >/dev/null 2>&1
最後の「 >/dev/null 2>&1」を抜くと、CRONの実行結果をメールで受信できます。
Cron実行結果のメール受信例
コントロールパネルにはジョブの最大実行時間は3分です。それを超えるものは強制停止されます。
と書いてあるので、real の値が1.5mを超えたらVPS等の上位プランに引っ越しを検討すべき頃合いとも言えます。
CRONジョブの頻度について
CORESERVERの生アクセスログは毎朝4~6時くらいに前日分が保存されるので、8時くらいに1回だけ更新すれば良いです。
生アクセスログが1日に1回しか排出されない以上、クロンを1時間に1回とか実行しても意味が無いですし、あまり負荷を掛けると同居しているユーザーに迷惑が掛かるので適度な値に設定することをおすすめします。