「ディスパッチベース」のロゴ画像

CORESERVERでAWStatsが更新されない場合の対処方法

コントロールパネルのバグか何かで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のアカウント例

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回とか実行しても意味が無いですし、あまり負荷を掛けると同居しているユーザーに迷惑が掛かるので適度な値に設定することをおすすめします。

▲ページ先頭に戻る

CORESERVER

GMOデジロック社のCORESERVERを利用する時に便利な技を公開しています。

-
記事公開日:
デザイン調整日:2020年06月02日