18

「facebookexternalhit」ボットにトラフィックを分散させる方法を知っている人はいますか?

私たちのウェブサイトは、45 ~ 60 分ごとに約 1 秒のスパイクで攻撃されます。Facebook ネットブロックからの 20 から 30 の異なる IP アドレスから、1 秒あたり 400 のリクエスト。スパイクの間にトラフィックは消えませんが、負荷は許容範囲内です。もちろん、ボットをブロックしたくはありませんが、これらのスパイクは危険です。ボットが時間の経過とともに負荷を均等に分散することを望んでいます。そして、Googlebot & friends のように動作することを確認してください。

関連するバグ レポート (最初のバグ2 番目のバグ、3 番目のバグ (#385275384858817)) を見ましたが、負荷を管理する方法についての提案は見つかりませんでした。

4

3 に答える 3

21

他の答えによると、Facebookからの半公式の言葉は「それを吸う」です。それは彼らがクロール遅延に従うことができないことを私に困惑させます(はい、私はそれが「クローラー」ではないことを知っています、しかしあなたがそれを呼びたいものは何でも、数秒で100ページをGETすることはクロールです)。

彼らの傲慢さに訴えることはできず、彼らのIPブロックを削除することはかなり厳しいので、ここに私の技術的な解決策があります。

PHPでは、すべてのリクエストに対してできるだけ早く次のコードを実行します。

define( 'FACEBOOK_REQUEST_THROTTLE', 2.0 ); // Number of seconds permitted between each hit from facebookexternalhit

if( !empty( $_SERVER['HTTP_USER_AGENT'] ) && strpos(  $_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit' ) === 0 ) {
    $fbTmpFile = sys_get_temp_dir().'/facebookexternalhit.txt';
    if( $fh = fopen( $fbTmpFile, 'c+' ) ) {
        $lastTime = fread( $fh, 100 );
        $microTime = microtime( TRUE );
        // check current microtime with microtime of last access
        if( $microTime - $lastTime < FACEBOOK_REQUEST_THROTTLE ) {
            // bail if requests are coming too quickly with http 503 Service Unavailable
            header( $_SERVER["SERVER_PROTOCOL"].' 503' );
            die;
        } else {
            // write out the microsecond time of last access
            rewind( $fh );
            fwrite( $fh, $microTime );
        }
        fclose( $fh );
    } else {
        header( $_SERVER["SERVER_PROTOCOL"].' 429' );
        die;
    }
}

次のようなコマンドラインからこれをテストできます。

$ rm index.html*; wget -U "facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)" http://www.foobar.com/; less index.html

改善の提案は大歓迎です...私はそれらが巨大な爆発を伴ういくつかの並行性の問題であるかもしれないと思います。

于 2012-11-07T19:25:11.887 に答える
2

ウェブサイト/サーバーでも同じ問題が発生しました。問題は、og:url metatag. それを削除した後、問題はほとんどの facebookexternalhit 呼び出しで解決されました。

もう 1 つの問題は、og:image タグで指定した一部の画像が存在しないことでした。そのため、facebookexternhit スクレーパーは、URL の呼び出しごとに URL 上のすべての画像を呼び出しました。

于 2014-06-08T14:34:24.653 に答える