WordPressのxmlrpc.phpへの大量アクセスで時々サーバーが息をしなくなってしまうので、IPアドレスでアクセス制限をかけています。ただ、毎回アクセスログを見てアクセス元のIPアドレスを確認するのも面倒です。
日頃からLogwatchでサーバーの状態を確認しているので、ここでxmlrpc.phpへのアクセス数の集計も見られると便利だと思い設定しました。Ubuntu 12.04.4 LTSにtaskselからLAMP環境を構築しWordPressを設置した状態を前提にしています。
まずLogwatchをインストール。
sudo aptitude install logwatch
sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
sudo cp /usr/share/logwatch/default.conf/services/* /etc/logwatch/conf/services/
/etc/logwatch/conf/logwatch.conf の最低限の設定を変更します。
TmpDir = /tmp
Output = mail
MailTo = myname@example.com
ここで動作確認
sudo /etc/cron.daily/00logwatch
メールが届けばOKです。
/etc/logwatch/conf/services/services に wp-xmlrpc-access-count.conf を作成
Title = "WordPress xmlrpc.php Access Count"
LogFile = http
/etc/logwatch/scripts/services にログの集計を行うスクリプト wp-xmlrpc-access-count を追加
#!/usr/bin/python
import sys;
ipcount = {}
for line in sys.stdin.readlines():
if "xmlrpc.php" in line:
ip = line.split(" ", 1)[0]
if (ip in ipcount):
ipcount[ip] = ipcount[ip] + 1
else:
ipcount[ip] = 1
count_length = 0
for ip, count in sorted(ipcount.items(), key=lambda x:x[1] * -1):
if count_length == 0:
count_length = len(str(count))
print ((ip + ":").ljust(17) + str(count).rjust(count_length) + " Time(s)")
スクリプトの動作確認
logwatch -service wp-xmlrpc-access-count -output stdout
これで集計結果が表示されればOKです。
この設定を行うにあたってLogwatch にサービス・フィルタを追加するを参考にしました。