wordpress 迷惑なアクセスを除去している方法

wordpress 迷惑なアクセスを除去している方法のイメージ php

レンタルサーバーでWordpressのサイトを運営していると500エラーの頻度が多いことに気がつきます。
そんなにたくさんのアクセスがあって嬉しい!って思っていたんですが、ログを工夫して見てみたら上位アクセスの多くはbotだったり、amazonawsだったりと普通にアクセスしてくれるユーザーではなさそうで、ガッカリ。

リソースを増量したり、もっとアクセス過多に対応できるサーバーへ以降すべき?って思っていたこともありましたが全くの無駄ってことに気づきました。

サイトを運営する目的を考えると集客してくれる検索サイト(GoogleやBingなど)のアクセスは歓迎したいです。誰かがSNS上で紹介した結果エビデンスを調べるために訪れる「Facebot Twitterbot/1.0」や「Linespider/1.1」なども嬉しいアクセスだと思っています。

一方、集客に貢献してくれるわけでも無いbot(例えば「SemrushBot」、「360Spider」、「MauiBot」)は、レンタルサーバーのリソースを食いつぶす厄介なアクセスです。

またアクセスログファイルに記録されたIPアドレスからドメインを逆引き(nslookupやdigコマンド)してみると、amazonawsやロシア、ウクライナ、イギリス、ポーランドなど迷惑アクセスで有名なドメインやIPアドレスだったりとがっかりする内容でした。

こういった迷惑なアクセスを除去すると、500円〜の低価格なレンタルサーバーでもそこそこ稼げる環境へと導けることとができます。
低価格レンタルサーバーのワードプレス運営で気をつけているポイント

  • 【ポイント1】公式からダウンロードできるプラグインは極力インストールしない、必要最低限にしています。

    HTMLファイルで作られたサイトにアクセスした場合、ほぼサーバーのスペックで応答できます。
    ワードプレスはPHPプログラムです。そのためメモリ上(またはスワップファイル)にプログラムがコンパイルされ、MySQLから必要な情報を取得し、HTML整形して応答しています。多少なりともサーバーへ負荷を与えます

  • 【ポイント2】 サイトを立ち上げ、ワードプレスをインストール、テーマを決定した段階で「PageSpeed Insights – Google Developers」のスコア100を目指しています。

    運営中には、影響を与えてしまうかもしれないので消極的な手段を選びがちです。そのため、初期の段階でガッツリ対策しています。

    指摘の中で、サーバーの応答時間はサーバー変えるしか無いので無視しています。

    キャッシュ系のプラグインは記事内容をほとんど変えない場合絶大な効果があります。

    テーマ自体もPHPプログラムです。凝ったテーマはそれだけでスコアを悪くすることもあるので、なるべくシンプルなテーマに切り替えるようにしています。

    スコア90以上、可能なら100を目指しています。

  • 【ポイント3】 ワードプレスが動いたリアルタイムなアクセスログを収集する

    サーバーの負担を上げるワードプレスが動作するアクセスが異常に多くなっていないか?が知りたいと思っています。

    ほとんどのレンタルサーバーでアクセスログ、エラーログを提供しているかと思います。ログ(nginxやApacheのログ)は記事へのアクセスの他、画像ファイルへのアクセス、ファビコンへのアクセス、ワードプレスの特定の脆弱性を狙ったアクセスなどが記録されています。

    このログからは、記事に関するアクセス以外はワードプレスが動作しません。

    そのため、ワードプレスが動作したときだけ別のログファイルに記録する方法を採用しています。

  • 【ポイント4】 収集したログから異常なアクセスをあぶり出し、拒絶などの対策をします。

    一般ユーザーアクセスなのか、または迷惑なアクセスなのかを見極めて、迷惑なアクセスは極力除外するようにしています。

    除外は、.htaccessファイルで制御しています。
    Deny from IPアドレス・ドメイン で拒絶、
    SetEnvIf User-Agentでユーザーエージェント指定で拒絶、
    などです。

    こうすることで極力サイトを快適にして、アクセスしてくれた一般ユーザーの方が素早く表示できるいいサイトになるよう心がけています。

ワードプレスが動いたログを記録する

ワードプレスが動作した際、ログを記録するプラグインを自作し、有効化します。
ソースコードのファイル名、クラス名はかぶらない名前で適時変更してください。

またソースコード中、フルパスでログを格納するフォルダ(ディレクトリ)を指定しています。レンタルサーバーのディレクトリ構成がよくわからないって方は調べてみてください。

<?php
/*
Plugin Name: WordPress ログ記録
Plugin URI: http://サイトのURL/
Description: WordPress ログ記録
Author: scripts
Version: 1.0 
Author URI:https://www.wcguru.net/
*/
class accesslog_74bee6e126ef2866d0d6ebaf38734088{
    static $instance = null;
    static public function getInstance(){
        accesslog_74bee6e126ef2866d0d6ebaf38734088::$instance = new accesslog_74bee6e126ef2866d0d6ebaf38734088();
    }
    public $start = 0;
    public $starttime = 0;
    public $lapse = 0;
    function __construct(){
        $this->starttime = time()+ 9*60*60;// +9時間
        $this->start =  microtime(true);
        add_action('shutdown',  array($this, 'logger'));
    }
    function __destruct(){
        $logfile =  "/フルパス/wp_access_log";
       // $logfile =  __DIR__ . "/../../wp_access_log"; // 相対パス ワードプレス直下

        if( @file_exists($logfile) ){
            $mtime = filemtime($logfile) + 9*60*60;
            if( date('Ymd',$mtime) == date('Ymd', time() + 9*60*60 ) ){

            }else{
                $w = date('w',$mtime);
                $dstfile = $logfile . "." . $w;
                if( @file_exists($dstfile) ){ @unlink($dstfile); }
                @rename( $logfile, $dstfile );
            }
        }
        ob_start();
        $line = "{$this->lapse} ".date("H:i:s", $this->_starttime);
        $line .= " {$_SERVER['REMOTE_ADDR']} " ;
        $line .= '"' . $_SERVER['REQUEST_METHOD'] .' ' . $_SERVER['REQUEST_URI'] .'"' ;
        $line .= " ". $_SERVER['REDIRECT_STATUS'] ." ";
        $line .= '"' . $_SERVER['HTTP_USER_AGENT'] .'"' ;
        @file_put_contents( $logfile , $line.PHP_EOL, FILE_APPEND );
        ob_end_clean();
    }
    function logger(){
        $this->lapse = number_format(microtime(true) - $this->_start, 3 );
    }
}// class end
accesslog_74bee6e126ef2866d0d6ebaf38734088::getInstance();

例えばGoogleのボットアクセスの場合、このようなログを残すことができます。

0.299 00:00:13 66.249.79.250 "GET /" 200 "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.92 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

・いろいろとエラー処理は省いています。
・曜日ごとの最新ログファイルを残します。
・UTCで動作しているワードプレスで利用しています。日付が9時間ずれるようでしたら+9*60*60を削除することで正しい日付になります。

傾向と分析

全体のアクセスが少ない日は、7割ボット、3割ユーザーと言った感じの統計になっています。
対策を全くしていない場合、8割、9割がボットアクセスになることもあります。
日毎に傾向を捉えて、アクセスの傾向を分析していると発見があります。

同一IP、同一ボットからの激しいアクセスを見つけて、拒絶する

ボットの場合、大抵ユーザーエージェントを見ることで、わかるようになっています。

GoogleやBingなどメジャーなボット以外で激しいアクセスしているものは除外するようにしています。
Bingの場合、https://www.bing.com/toolbox/webmaster/?cc=jpにサイトを登録することでアクセスの頻度をコントロールすることができます。ただあくまで要望を伝える手段の一つでその通りに動作してくれるわけではありません。

同一IPからの激しいアクセスを見つけて、拒絶する

ボットでは無い、iPhone safariなどのユーザーエージェントを名乗ったアクセスがあったりします。
普通では違いが分かりませんが、時間を空けずにページを遷移が激しい場合スクレイピングと疑って除外するようにしています。

同一IPで複数のユーザーエージェントを名乗っているアクセスを見つける

同一IPでユーザーエージェントを変えながらアクセスし、別ユーザーを偽装するパターンがあります。
これを検出するためにはログファイルIPアドレスとユーザーエージェントの集計処理が必要です。
1つのIPで4つ以上のユーザーエージェントを名乗っている、そのIPをググってスパム等の検索結果があったら除外すると言った対応をしています。

その他:amazonawsは拒否、海外も注意が必要

amazonaws.comからのアクセスがあります。これはAmazon AWSサービスを利用しているユーザーからのアクセスで一般ユーザー扱いしなくていいと思っています。なので全拒否しています。

複数のホストから同時にアクセスすることで運営中のサイトは重くなりダメージを受けます。
海外の数10のIPアドレスから同時にアクセス(攻撃?)があったことがありました。
この時運営中のサイトは激しく重かったです。

ユーザーエージェントは偽装が可能なので絶対ではありません。ただスクレイピングのサンプルソースコードを元にアクセスしてくるパターンは簡単に分かります。ユーザーエージェントに「Python」、「Java」、「PHP」と言った利用中の言語のキーワードが入っています。

まとめ

ある程度ボットがサイトの情報を収集してくれないと集客が成り立ちません。1日1000アクセスぐらいなら7割ボットぐらいが丁度いいと思っています。

賢いボットは、サイトの負荷をなるべく上げないように分散して収集していると感じています。
賢く無いボットは、大体迷惑なアクセスですね。

コメント

タイトルとURLをコピーしました