X

Нагрузка на сервер от поисковиков

Сегодня заметил что один из моих серверов дико перегружен. Load average был стабильно за 30. Началось все с того, что при коннекте к серверу по ftp, я получил ошибку 10600, что мол нет коннекта к серверу. Да уж подумал я, пошел по ssh смотреть в чем проблема.

Надо заметить, что это не совсем сервер, в плане понимания железа, а VPS от Hetzner c такими параметрами: 1 ядро 3 GHz-ового процессора и 2ГБ оперативки. Т.е. не самая паршивая конфигурация. Так вот, пошел я на сервер и увидел кучу процессов апача, которые и грузили сервер. И да, это была не ДДОС атака, т.к. при показе 503 ошибки, кол-во запросов к серверу падало. Т.е. кто-то на той стороне, обрабатывал это.

Я конечно знал, что этот сервер (а точнее сайт) посещает порядка 25к уников в день. Но исходя из текущей статистики, которая работала от клиентов через JS, это было не более 10 запросов в минуту, кто же остальные? Раз не работает JS, значит всего скорее боты. Ну, а раз боты, значит надо узнать кто именно: те кто парсит сайт, или поисковые боты.

Не долго думая я написал функцию, которая собирает ip в массив, сеарилизирует его, а при следующем запуске и наличии такого ip в базе, увеличивает счетчик посещаемости:

function writeIPLog()
{
    $logIPFile= 'tmp/iplog';
    $logIPFileReadable = 'tmp/iplog.readable';
    $ip = file_exists($logIPFile)?@unserialize(file_get_contents($logIPFile)):Array();

    if (empty($ip[$_SERVER['REMOTE_ADDR']])) $ip[$_SERVER['REMOTE_ADDR']]=0;
    $ip[$_SERVER['REMOTE_ADDR']]++;

    file_put_contents($logIPFile, serialize($ip));
    ob_start();
    arsort($ip);
    print_r($ip);
    $data = ob_get_clean();
    file_put_contents($logIPFileReadable, $data);
}

//writeIPLog();

Итого в одном файле мы храним сериализированную инфу, а во втором (readable) мы выводим в читаемом и отсортированном по убыванию формате. Функция не претендует на мега анализатор, и не рассчитана на постоянную работу, но получить результаты работы в течении 5 минут вполне можно, даже на мега посещаемом ресурсе.

Таким образом я выделил группу, ip адресов, которые делали больше всего запросов на сайт. Дальше я пошел искать по ним инфу, а точнее кому они принадлежат. Сделать это не сложно, я использовал сервис domainstools.comhttp://whois.domaintools.com/192.168.0.1

Таким образом, я увидел, что основную нагрузку создает поисковик Google-а. Что же делать дальше, поисковик-то баннить нельзя? К счастью, нормальные поисковики, могут использовать robots.txt, а в нем мы можем указать через какой промежуток времени, поисковик может делать запросы. Разумеется, это не фатальное ограничение для поисковиков, а всего лишь рекомендация, но в моем случае это сработало. Заветная конструкция выглядит так: Crawl-delay: 1, где 1 это промежуток через который поисковик может загружать документы, т.е. если поставить туда 5, то загрузка будет происходить 1 раз в 5 секунд. Вот это мне и надо было. Вот полный robots.txt:

User-agent: *
Allow: /
Crawl-delay: 1

Вначале, это не сработало, но где-то через час, все нормализовалось и пока продолжает работать так, как ожидалось.

Конечно же я понимаю, что это ограничивает поисковик, и так делать не желательно, но как временное решение это мне подошло и менять логику работы сайта сегодня же, я не буду.

Будьте внимательны, поисковик может отреагировать в вашем случае, совсем не так как в моем, и например, перестанет вас индексировать вообще. Поэтому будьте особенно внимательны, в случае, если вы не совсем понимаете как это работает и зачем это надо.

Так же в случае Google, помогает совет про управление скоростью загрузки через настройки в Google.Webmaster

Категории: Apache PHP SEO