Я веб-разработчик dev-ops, у меня на сайте есть два ec2.small за балансировщиком нагрузки на AWS.
Недавно мы видели, как 3-4 запроса в секунду закрывали сайт наших клиентов.
Сайт был неработоспособен и не возвращался после нескольких перезагрузок сервера и сканирования журнала ошибок для любых сценариев, которые могли вызывать проблему, даже если в последнее время не было внесено никаких изменений.
После того, как я включил ведение журнала балансировщика нагрузки, я увидел, что тысячи запросов на одну страницу поступают с одного IP-адреса.
Мы перенаправили запрос от балансировщика нагрузки на сервер, обрабатывающий запрос, используя X-forwarded-for, и заблокировали IP-адрес с помощью правила .htaccess.
Во время общения с ИТ-отделом клиентов они были уведомлены о том, что IP-адрес, ответственный за поток запросов, на самом деле является одним из компьютеров их внутренней компании.
Ответственная машина была удаленно перезагружена, и все запросы остановлены. Сайт вернулся в онлайн.
Официальным объяснением этого было «компьютер сходил с ума».
Возможно ли, чтобы веб-браузер или компьютер с Windows выполняли 3-4 запроса в секунду на веб-страницу с балансировкой нагрузки и отключали ее на 5+ часов?
Вот как выглядели запросы:
2017-01-14T01:00:46.170447Z west-ssl XX.XXX.XX.XXX:33370 - -1 -1 -1 503 0 0 0 "GET https://www.example.com:443/example/12 HTTP/1.1" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" ECDHE-RSA-AES128-SHA256 TLSv1.2
Конечно, это возможно - хотя это зависит от ряда факторов:
1) Похоже, у серверного приложения проблемы с параллелизмом. Возможно, стоит посмотреть, были ли узкими местами серверы приложений или они были вышестоящими, такими как БД и серверы приложений, у которых не хватало памяти из-за того, что конфигурация apache не очищала потоки достаточно быстро. Если бы это были серверы приложений, возможно, стоило бы провести некоторую настройку - развернуть идентичную машину за пределами ELB и использовать JMeter, чтобы добавить на нее некоторую нагрузку, чтобы выяснить узкие места.
Если это была база данных, вы можете использовать memcache / elasticache (поскольку похоже, что вы извлекаете определенный объект) для кеширования фактических запросов. Таким образом, соединения с базой данных быстро реагируют, Apache может быстро реагировать и отключать потоки, а не заполнять пул памяти компьютера приложения.
Если вы действительно чувствуете себя уязвимым, вы можете поставить Varnish в восходящем направлении для кэширования запросов с TTL 1–5 с, чтобы предотвратить крупный поток запросов. Но будьте осторожны, поскольку VCL неумолим и может привести к серьезным проблемам и боли (отравление / утечка кеша).
2) Что касается самой "предметной" машины. Очевидно, это могло быть скомпрометировано - это обязательно должно быть расследовано. Я позволю вам решить, честен ли ИТ-специалист или нет - это выходит за рамки serverfault.
Предполагая, что он не был взломан, это мог быть какой-то плохой код javascript - если вы выполняете опрос обновлений и каким-то образом был изменен параметр времени, он вполне может начать отправлять много запросов в секунду. Точно так же JS, возможно, вел себя хорошо, но у человека могло быть открыто 25 вкладок и он пошел домой на вечер - если каждая отправляет 1 запрос в 5 секунд, это 5 запросов в секунду.