Нагрузка на сервер от поисковиков
Сегодня заметил что один из моих серверов дико перегружен. Load average был стабильно за 30. Началось все с того, что при коннекте к серверу по ftp, я получил ошибку 10600, что мол нет коннекта к серверу. Да уж подумал я, пошел по ssh смотреть в чем проблема.
Надо заметить, что это не совсем сервер, в плане понимания железа, а VPS от Hetzner c такими параметрами: 1 ядро 3 GHz-ового процессора и 2ГБ оперативки. Т.е. не самая паршивая конфигурация. Так вот, пошел я на сервер и увидел кучу процессов апача, которые и грузили сервер. И да, это была не ДДОС атака, т.к. при показе 503 ошибки, кол-во запросов к серверу падало. Т.е. кто-то на той стороне, обрабатывал это.
Я конечно знал, что этот сервер (а точнее сайт) посещает порядка 25к уников в день. Но исходя из текущей статистики, которая работала от клиентов через JS, это было не более 10 запросов в минуту, кто же остальные? Раз не работает JS, значит всего скорее боты. Ну, а раз боты, значит надо узнать кто именно: те кто парсит сайт, или поисковые боты.
Не долго думая я написал функцию, которая собирает ip в массив, сеарилизирует его, а при следующем запуске и наличии такого ip в базе, увеличивает счетчик посещаемости:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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.com: http://whois.domaintools.com/192.168.0.1
Таким образом, я увидел, что основную нагрузку создает поисковик Google-а. Что же делать дальше, поисковик-то баннить нельзя? К счастью, нормальные поисковики, могут использовать robots.txt, а в нем мы можем указать через какой промежуток времени, поисковик может делать запросы. Разумеется, это не фатальное ограничение для поисковиков, а всего лишь рекомендация, но в моем случае это сработало. Заветная конструкция выглядит так: Crawl-delay: 1, где 1 это промежуток через который поисковик может загружать документы, т.е. если поставить туда 5, то загрузка будет происходить 1 раз в 5 секунд. Вот это мне и надо было. Вот полный robots.txt:
1 2 3 4 5 |
User-agent: * Allow: / Crawl-delay: 1 |
Вначале, это не сработало, но где-то через час, все нормализовалось и пока продолжает работать так, как ожидалось.
Конечно же я понимаю, что это ограничивает поисковик, и так делать не желательно, но как временное решение это мне подошло и менять логику работы сайта сегодня же, я не буду.
Будьте внимательны, поисковик может отреагировать в вашем случае, совсем не так как в моем, и например, перестанет вас индексировать вообще. Поэтому будьте особенно внимательны, в случае, если вы не совсем понимаете как это работает и зачем это надо.
Так же в случае Google, помогает совет про управление скоростью загрузки через настройки в Google.Webmaster
Author: | Tags: /
| Rating:
Leave a Reply