Время от времени несколько очень медленных HTTP-клиентов решают забрать страницы с моего веб-сайта. Это плохо, потому что, когда их делает достаточно много, это резко снижает количество свободных процессов Apache, доступных для обработки запросов от остального мира. Я не знаю, это какая-то отстойная DDoS-атака или просто очень медленные клиенты.
В прошедшие годы я знаю, что lingerd был решением этой проблемы. Но в наши дни вокруг него не наблюдается большой активности. Фактически, отсутствие пакета lingerd в Debian (есть старые неофициальные пакеты) говорит о том, что есть методы получше.
Я использовал mod_limitipconn, чтобы частично решить эту проблему, но мне нужно, чтобы это число было достаточно высоким, чтобы оно не мешало обычным браузерам. Это делает его своего рода неполноценным решением. Мне приходит в голову, что я мог бы поставить Squid перед Apache, но это кажется немного тяжеловесным. А может, мои впечатления от Squid искажены.
В любом случае, я ищу идеи или указатели на очевидное, что я упустил.
Идеи?
Если бы это была DDoS-атака, казалось бы, много таких подключений из разных мест. Вы не указываете статистику в своем вопросе, поэтому мы не можем судить.
Если многие из медленных запросов поступают из одного и того же места, особенно если они предназначены для большого объекта, возможно, у вас есть люди, открывающие много соединений с помощью диспетчера загрузок.
Если вы не привязаны к Apache по определенным причинам, вы можете рассмотреть возможность перехода на сервер, основанный на архитектуре, управляемой событиями, а не на архитектуре, основанной на угрозах / процессах, например nginx. Это позволяет значительно более эффективно масштабировать количество одновременных подключений, поскольку для каждого базового запроса требуется очень мало дополнительных ресурсов (в частности, ОЗУ), хотя масштабируемость запросов к скриптовым ресурсам может сильно варьироваться в зависимости от вашей настройки, обеспечивая эффективность modPHP (если вы еще не запустили его в режиме (faast) CGI) может потребовать больше работы для настройки, например, и, конечно, вы можете использовать другие модули / функции, которые не поддерживаются хорошо за пределами Apache.
Вы также можете просто выделить больше оперативной памяти и увеличить максимальное количество процессов / потоков Apache.
Посередине между этими двумя решениями является то, что если медленные запросы предназначены для статических ресурсов, вы можете использовать легкий веб-сервер для обслуживания статического контента (в гораздо меньшем объеме ОЗУ, чем Apache) и проксировать скриптовые запросы (и другие требуемые дополнительные функции, помимо обслуживания файла) к настройке Apache. Многие крупные сильно загруженные сайты работают аналогичным образом.
В общем, я не знаю метода, который ограничивал бы количество времени, которое может занять один запрос - это, вероятно, в любом случае не решит вашу проблему, потому что как в ситуации DoS, так и в случае менеджеров загрузки новое соединение будет немедленно предпринять попытку.