Хочу рассказать интересную историю про взаимодействие с поисковыми роботами, а в частности с ботами великого и могучего Яндекса.

Преамбула. У меня имеется выделенный сервер, на котором крутится порядка нескольких десятков сайтов. Проблем не было никогда, машинка бодрая, новая. Несколько дней назад поступил репорт, что всё «зависло». Пришлось делать удаленную перезагрузку. Позже заметил, что нагрузка на ЦП выросла до 60% с 10% и стала держаться на этом уровне. Я, конечно, насторожился, но мало ли.

И вот вчера всё виснет напрочь. Перезагружаю — прогруз и снова полный штиль. Все сайты уходят вне доступа. После мониторинга процессов увидел загрузку mysql в 99.9%. Удивился, пошел искать сайт, с которого такая загрузка идёт. Нашел, отсеял другие запросы и увидел, что кто-то настойчиво долбит в 40к запросов в секунду, перегружая бедную БД по «самое не могу». Начинаю копать логи и вижу подсети, с которых идут эти запросы. Подключаюсь к серверу, прописываю DROP в iptables по маске /24, и всё нормализуется.

Обратил внимание, что ддосер посылает идентификацию Яндекс-бота. Слегка это удивило, но мало ли. Решил проверить, и оказалось, что две подсети, которые мне пришлось забанить принадлежат как раз-таки паучкам Яндекса.

После досконального изучения зачем и что боты делали на сайте с таким остервенением стало ясно, что боты дорвались до незакрытого фильтра товаров и наплодили по ссылкам невероятную кучу страниц, которые и стали усиленно просматривать с целью индексирования. Почему не сработала у них какая-то отсечка на подобное — не ясно. Сайт с данным фильтром работает более трёх лет и никаких проблем не было.

На данный момент фильтр закрыт от индексации через htaccess, боты разбанены, а я жду ответа от поддержки Яндекса.

Небольшой кусок логов
[29/Oct/2015:13:57:10 ] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&show=50&page=7&page=5&show=10&page=4&page=6 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.29 — - [29/Oct/2015:13:57:10 ] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&show=50&page=7&page=5&show=10&page=4&page=1 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.16 — - [29/Oct/2015:13:57:10 ] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&show=50&page=7&page=5&show=10&page=4&page=2 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.140 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=111&show=50&page=1&page=23&show=30&page=37 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.16 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=111&show=50&page=1&page=23&show=30&page=26 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.140 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=111&show=50&page=1&page=23&show=30&page=25 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.139 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=111&show=50&page=1&page=23&show=30&page=24 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.29 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=111&show=50&page=1&page=23&show=30&page=20 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.16 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=111&show=50&page=1&page=23&show=30&page=21 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.140 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=5&show=10&page=3&show=50&page=1&page=3&page=6&page=23 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.139 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=1&page=3&show=30&page=1&page=3&page=37 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.29 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=5&page=4&page=1&page=2&page=111 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.76.13.189 — - [29/Oct/2015:13:57:10] «GET / HTTP/1.1» 200 102 "-" «Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36»
87.250.244.16 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=8&page=7&page=8&page=6&page=4&page=5 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.140 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=8&page=7&page=8&page=6&page=4&page=7 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.139 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=8&page=7&page=8&page=6&page=4&page=6 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.29 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=8&page=7&page=8&page=6&page=4&page=1 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.16 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=8&page=7&page=8&page=6&page=4&page=2 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.138 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=4&show=50&show=10&show=30&page=37 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.143 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=1&show=50&page=4&show=30&page=37 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.137 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&show=30&page=1&page=3&page=2&page=3&page=1 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
141.8.141.132 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&show=30&page=1&page=3&page=2&page=3&page=6 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.15 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&show=30&page=1&page=3&page=2&page=3&page=4 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.38 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&show=30&page=1&page=3&page=2&page=3&page=5 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)»
87.250.244.14 — - [29/Oct/2015:13:57:10] «GET /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=7&page=9&show=30&page=11&show=50 HTTP/1.1» 200 102 "-" «Mozilla/5.0 (compatible; YandexBot/3.0;

И я понимаю, будь я предусмотрительней — подобных проблем не было бы. Но всё же.

Спасибо.

Комментарии (9)


  1. GDApsy
    06.11.2015 13:10

    А почему кравлер должен делать какую-то отсечку по таким страницам? С его точки зрения это самая обычная страница сайта, разрешенная к индексации. Я может что-то не уловил, но кравлер же не проводит же смысловой анализ, а что перед ним.


    1. lolhunter
      06.11.2015 13:22

      Кравлер должен иметь отсечку по количеству страниц в секунду/минуту. Иначе новый сайт с 10к товаров никогда не поднимется из-за ддоса.


      1. ragimovich
        06.11.2015 13:23
        +1

        Откройте для себя директиву robots.txt Crawl-delay.


        1. lolhunter
          06.11.2015 13:37

          Ну это скорее к топик стартеру. Но в любом случае, имхо, какая-то встроенная отсечка должна быть в любом случае.


      1. maxru
        06.11.2015 16:50

        > новый сайт с 10к товаров
        Типовой небольшой интернет-магазин

        > никогда не поднимется
        Это плохой, негодный пример того, как не надо делать интернет-магазины.


    1. Dedalum
      06.11.2015 13:54
      -1

      По сути, у паучков есть проверка по загруженности, и если появляются страницы, которые способны наплодить себе подобные в геометрической прогрессии, должна срабатывать отсечка по использованию ресурсов. Но соль в том, что до этого всегда всё было нормальны. Данный фильтр существует 3 года.
      p.s. Как оказалось, чеснок протух, серебро окислилось. В общем, роботс не отсекает роботов от индексации. Всё закрыли через отдачу 404 ошибки ботам при обращении к адресу с вхождением filter.


  1. illi
    06.11.2015 14:22

    Сталкивался с этой же самой проблемой.
    Боты Яндекса настойчиво долбили по сайту с неистовой скоростью.

    Техподдержка Яндекса ответила:

    Да, этот робот принадлежит нам. Если Вы хотите снизить нагрузку на Ваш сервер, я рекомендую Вам разместить директиву Crawl-delay с соответствующим значением в файле robots.txt: yandex.ru/support/webmaster/controlling-robot/robots-txt.xml#crawl-delay.



    После добавления директивы боты «подуспокоились»


  1. dmitriy_novikov
    06.11.2015 16:01
    +2

    кажется, проблема не в фильтре, а в постраничной навигации, судя по url из логов

    /catalogue/kotli/?176&filter=1&fldX=0&page=8&page=6&show=10&page=111&show=50&page=1&page=23&show=30&page=26


  1. max_rip
    08.11.2015 12:12

    Для таких каталогов Crawl-delay: обязательный параметр, другой момент что есть еще куча ботов, котом на него начхать.
    Тот же Бинг майкрософта, управлять им можно только из их вебмастера, зато можно выбрать время для сканирования сайта и его интенсивность.
    А еще есть кучка

    $badBots=array(
    	  "80legs"
    	 ,"AhrefsBot"
    	 ,"linkpad"
    	 ,"megaindex"
    	 ,"BLEXBot"
    	 ,"bingbot"
    );

    Которым приходится принудительно отдавать 403