Проблемы с modx.pro и документацией.
Последние недели сайт периодически отваливался по таймауту, иногда вместе с соседними проектами на том же сервере. Разобрался. Коротко: за сутки к modx.pro приходит 428 тысяч запросов при живой аудитории меньше тысячи человек в неделю. Расскажу, кто их делает и что с этим сделано.
Живых посетителей меньше тысячи в неделю. Всё остальное — роботы. Примерно четыре пятых трафика.
В сентябре первое место занимал ClaudeBot: 226 тысяч запросов в сутки, из них 220 тысяч на /all. При двадцати пяти тысячах заметок это девять полных обходов ленты за день. Закрыл его в robots.txt, помогло.
К октябрю на его место пришли двое других:
Потому что Claude-SearchBot — это не ClaudeBot. Другой токен. Закрыв одного поимённо, я не закрыл никого больше.
Схема оказалась проигрышной в принципе: каждый новый обходчик приходит с полным доступом, а узнаём мы о нём по нагрузке. Поэтому логику перевернул — теперь тяжёлые листинги закрыты для всех по умолчанию, а доступ выдан поимённо Яндексу, Google и Bing.
В старом файле стояло Disallow: /users/ — со слешем на конце. Такое правило закрывает /users/ivan, но не закрывает /users и /users?page=2: сопоставление идёт по префиксу пути, а путь здесь без слеша.
То есть список пользователей с пагинацией не был закрыт вообще ни для кого. Именно его оба робота и выгребали.
Самая неожиданная находка. В логах нашлись запросы такого вида:
Сайт давно не отдаёт таких ссылок, проверил: в выдаваемом HTML их нет, use_only_cookies включён. Это исторический мусор в очередях роботов — когда-то такие адреса существовали, роботы их запомнили и продолжают долбить по своим спискам.
Каждый такой запрос доходил до PHP, собирал полную страницу и заводил новую сессию в базе. Теперь nginx отдаёт на них 301 на чистый адрес, не доводя до PHP.
Это выяснилось ещё в сентябре. Apache обслуживает посетителей ограниченным числом процессов — по одному на соединение, всего 150. Когда свободные кончаются, остальные ждут в очереди и в итоге получают таймаут.
Так вот, больше половины этих процессов простаивало. Браузер давно всё забрал и ушёл, а соединение продолжало держать процесс ещё пять секунд — вдруг попросит что-то ещё. Сократил ожидание до двух секунд, и занятость упала со 150 до 26.
А база на сервере общая. Когда она занята, таймаут получают все проекты разом, включая те, к которым нагрузка отношения не имеет.
База настроена этом хорошо: попадание в буферный пул 99,9994%, временные таблицы на диск не выплёскиваются ни разу. Проблема не в ней, а в том, сколько её спрашивают.
Корень — страницы собираются заново на каждый запрос. Робот получает свежесобранную страницу с полусотней запросов к базе, хотя просит ровно то же, что просил час назад. Кэш для анонимных посетителей снял бы основную часть нагрузки независимо от того, кто и сколько ходит. Это следующая работа.
Если заметите, что что-то открывается не так или ломается — напишите в комментариях. Правок было много, и часть из них затрагивает все запросы к сайту.
Сколько нас на самом деле
Живых посетителей меньше тысячи в неделю. Всё остальное — роботы. Примерно четыре пятых трафика.
Кто ходит
В сентябре первое место занимал ClaudeBot: 226 тысяч запросов в сутки, из них 220 тысяч на /all. При двадцати пяти тысячах заметок это девять полных обходов ленты за день. Закрыл его в robots.txt, помогло.
К октябрю на его место пришли двое других:
- Claude-SearchBot — 85 тысяч запросов, 77 тысяч из них на /users;
- Reflectionbot — 40 тысяч, 32 тысячи на /users.
Почему robots.txt их не поймал
Потому что Claude-SearchBot — это не ClaudeBot. Другой токен. Закрыв одного поимённо, я не закрыл никого больше.
Схема оказалась проигрышной в принципе: каждый новый обходчик приходит с полным доступом, а узнаём мы о нём по нагрузке. Поэтому логику перевернул — теперь тяжёлые листинги закрыты для всех по умолчанию, а доступ выдан поимённо Яндексу, Google и Bing.
И отдельная дыра в правиле
В старом файле стояло Disallow: /users/ — со слешем на конце. Такое правило закрывает /users/ivan, но не закрывает /users и /users?page=2: сопоставление идёт по префиксу пути, а путь здесь без слеша.
То есть список пользователей с пагинацией не был закрыт вообще ни для кого. Именно его оба робота и выгребали.
Почти половина трафика была мусором
Самая неожиданная находка. В логах нашлись запросы такого вида:
GET /comments?page=12&MODSESSID=deac0757594052bce6484cfeca71d779Идентификатор сессии в адресе. Таких запросов за десять часов набралось 89 775 — 47% всего трафика, и 36 тысяч уникальных идентификаторов.Сайт давно не отдаёт таких ссылок, проверил: в выдаваемом HTML их нет, use_only_cookies включён. Это исторический мусор в очередях роботов — когда-то такие адреса существовали, роботы их запомнили и продолжают долбить по своим спискам.
Каждый такой запрос доходил до PHP, собирал полную страницу и заводил новую сессию в базе. Теперь nginx отдаёт на них 301 на чистый адрес, не доводя до PHP.
Почему ложились все сайты сразу
Это выяснилось ещё в сентябре. Apache обслуживает посетителей ограниченным числом процессов — по одному на соединение, всего 150. Когда свободные кончаются, остальные ждут в очереди и в итоге получают таймаут.
Так вот, больше половины этих процессов простаивало. Браузер давно всё забрал и ушёл, а соединение продолжало держать процесс ещё пять секунд — вдруг попросит что-то ещё. Сократил ожидание до двух секунд, и занятость упала со 150 до 26.
А база на сервере общая. Когда она занята, таймаут получают все проекты разом, включая те, к которым нагрузка отношения не имеет.
Что сделано
- KeepAliveTimeout с 5 секунд до 2;
- robots.txt перевёрнут: закрыто по умолчанию, доступ поимённо;
- /all, /users и /comments закрыты без слеша, чтобы покрыть и пагинацию;
- адреса с MODSESSID отдают 301 из nginx, минуя PHP и базу;
- на соседнем проекте заблокирована подсеть, дававшая 82% его трафика;
- поставлен сборщик состояния сервера, чтобы ловить отказы в момент, а не после.
Что дальше
База настроена этом хорошо: попадание в буферный пул 99,9994%, временные таблицы на диск не выплёскиваются ни разу. Проблема не в ней, а в том, сколько её спрашивают.
Корень — страницы собираются заново на каждый запрос. Робот получает свежесобранную страницу с полусотней запросов к базе, хотя просит ровно то же, что просил час назад. Кэш для анонимных посетителей снял бы основную часть нагрузки независимо от того, кто и сколько ходит. Это следующая работа.
Если заметите, что что-то открывается не так или ломается — напишите в комментариях. Правок было много, и часть из них затрагивает все запросы к сайту.
Техническая поддержка MODX
Сайт лежит, тормозит или остался без разработчика?
Переезд с MODX 2 на 3, PHP 7 на 8, скорость и безопасность. Поддержка со сроками и ответственностью, а не совет в чате.
Подробнее
Реклама
0
Комментарии: 0