Сегодня утром один из моих клиентов написал что всю ночь сайт не отвечает, а сейчас открывается по 20 секунд. Идем разбираться - с местом на сервер все в порядке, с настройками тоже, но загрузка всех ядер 100% и не думает падать. В логах очень много хитов, прямо таки аномально много, сайт не такой популярный) В итоге в логах вижу строчки огромной боли многих веб-мастеров - UserAgent: YandexBot 3.0. Бот прямо таки ненасытен - генерирует по 20-30 хитов в секунду. ЧТобы проверить действительно ли он "виновник происшествия" - блокирую в nginx все подключения с UserAget YandexBot. Для этого в блоке server конфигурации nginx прописываю:
if ($http_user_agent ~* (YandexBot)) {
return 403;
}
Нагрузка через некоторое время спадает, яндекс вебмастер начинает "плеваться" ошибками индексации в почту. Устанавливаю в панели Яндекс Вебмастер параметр "Скорость обхода сайта" на 1 запрос в секунду. УБираю блок в nginx. Загрузка снова растет до 100%, все ложится. То есть видимо параметр применится только на следующий обход. Смотрим что еще можно сделать чтобы умерить аппетиты Яндекса. На странице https://yandex.ru/support/webmaster/ro...obots.html нахожу еще одно решение - возвращать на все запросы код HTTP код 429. Прописываю в ini.php: http_response_code(429); Жду пару минут. Нагрузка спадает до нормальных значений. Но возвращать на каждый хит 429 как-то не правильно. То есть возвращать нам его нужно только когда высокая загрузка системы и возвращать только поисковым ботам. Реальному посетителю мы должны открыть сайт в любом случае с нормальными ответами. Набросал вот такой код и добавил в init.php:
Для определения мгновенной загрузки использую стандартную функцию sys_getloadavg. Так как на сервер 2 вычислительных ядра, нагрузка больше 2 это уже перегруз, в этом случае ничего не делаем и выдаем ошибку. Если же загрузка более 0.8 - просто выдаем код 429 и контент. В таком варианте работает сейчас. Значения порогов подбираете на вашем железе экспериментально.
Сейчас все чаще применяю блокировку на уровне nginx если есть доступ к конфигурации веб-сервера. Способ хорош тем что до выполнения PHP в этом случае дело даже не доходит и на отражение "атаки бота" ресурсов тратится кратно меньше. Для этого: 1) Создаем файл для кастомной блокировки /etc/nginx/vhosts-includes/custom_blocks.conf 2) В него прописываем примерно следующее:
### blocking bad bots (case insensitive).
if ($http_user_agent ~* (ClaudeBot|SemrushBot|AhrefsBot|Riddler|aiHitBot|trovitBot|Detectify|BLEXBot|LinkpadBot|Mozilla.*Indy|Mozilla.*NEWT|SeaMonkey|Acunetix|binlar|BlackWidow|Bolt\s0|BOT\sfor\sJCE|Bot\smailto\:craftbot@yahoo\.com|casper|checkprivacy|ChinaClaw|clshttp|cmsworldmap|Custo|Default\sBrowser\s0|diavol|DIIbot|DISCo|dotbot|Download\sDemon|eCatch|EirGrabber|EmailCollector|EmailSiphon|EmailWolf|Express\sWebPictures|extract|ExtractorPro|EyeNetIE|feedfinder|FHscan|FlashGet|flicky|g00g1e|GetRight|GetWeb\!|Go\!Zilla|Go\-Ahead\-Got\-It|grab|GrabNet|Grafula|harvest|HMView|Image\sStripper|Image\sSucker|InterGET|Internet\sNinja|InternetSeer\.com|jakarta|Java|JetCar|JOC\sWeb\sSpider|kanagawa|kmccrew|larbin|LeechFTP|libwww|Mass\sDownloader|microsoft\.url|MIDown\stool|miner|Mister\sPiX|MSFrontPage|Navroad|NearSite|Net\sVampire|NetAnts|NetSpider|NetZIP|nutch|Octopus|Offline\sExplorer|Offline\sNavigator|PageGrabber|Papa\sFoto|pavuk|pcBrowser|PeoplePal|planetwork|psbot|purebot|pycurl|RealDownload|ReGet|Rippers\s0|sitecheck\.internetseer\.com|SiteSnagger|skygrid|SmartDownload|sucker|SuperBot|SuperHTTP|Surfbot|tAkeOut|Teleport\sPro|Toata\sdragostea\smea\spentru\sdiavola|turnit|vikspider|VoidEYE|Web\sImage\sCollector|WebAuto|WebBandit|WebCopier|WebFetch|WebGo\sIS|WebLeacher|WebReaper|WebSauger|Website\seXtractor|Website\sQuester|WebStripper|WebWhacker|WebZIP|Widow|WPScan|WWW\-Mechanize|WWWOFFLE|Xaldon\sWebSpider|Zeus|zmeu|360Spider|CazoodleBot|discobot|EasouSpider|ecxi|GT\:\:WWW|heritrix|HTTP\:\:Lite|HTTrack|ia_archiver|id\-search|IDBot|Indy\sLibrary|IRLbot|ISC\sSystems\siRc\sSearch\s2\.1|LinksCrawler|LinksManager\.com_bot|linkwalker|lwp\-trivial|MFC_Tear_Sample|Microsoft\sURL\sControl|Missigua\sLocator|MJ12bot|panscient\.com|PECL\:\:HTTP|PHPCrawl|PleaseCrawl|SBIder|SearchmetricsBot|Snoopy|Steeler|URI\:\:Fetch|urllib|Web\sSucker|webalta|WebCollage|Wells\sSearch\sII|WEP\sSearch|XoviBot|YisouSpider|zermelo|ZyBorg)) {
return 403;
}
3) Перезапускаем nginx, радуемся... Но недостаток - нет получения текущей загрузки системы и возвращения 429 кода. Если есть джедаи nginx которые подскажут как такое можно реализовать - буду благодарен.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».