Я хочу принудительно установить соединения Keep Alive или Persistent для всех HTTP-запросов на моем сервере Apache 2.2.3, работающем на RHEL 5.8. Многие веб-сканеры по какой-то причине используют HTTP 1.0, и я хотел бы либо принудительно установить постоянные соединения, либо каким-то образом заставить эти соединения использовать HTTP 1.1, чтобы параметр Keep Alive On в конфигурации Apache вызывал постоянный HTTP. Это потому, что я хочу уменьшить количество открываемых TCP-соединений. Как я могу этого добиться?
HTTP 1.0 не поддерживает keep-alive (постоянные соединения AKA), и нет системы, которая просила бы их использовать HTTP 1.1, вы могли бы вернуть им 400x, но они все равно уже создали бы соединение, и нет стандартного способа сообщить им вместо этого попробовать HTTP 1.1. Даже если все ваши клиенты действительно работают, им нужен HTTP1.1, вы ничего не можете сделать с сервисом, чтобы остановить их отправку «close» в заголовке keep-alive или сброс соединения и при этом одно соединение для каждого запроса.
Есть несколько вариантов ядра Linux (в частности, DEFER_ACCEPT
иTIME_WAIT
), который может помочь в сокращении таблицы TCP-соединений, но я бы не рекомендовал идти по этому пути, если вы не знаете, что делаете, поскольку действительно легко сделать ситуацию хуже, чем лучше.
Но если мыслить шире, я думаю, что вы пытаетесь решить проблему неверным способом. Интернет темен и полон ужасов. Если случайные боты вызывают проблемы с ограничением TCP-соединения, тогда вы безнадежно уязвимы для SYN-флуда или других событий типа DDOS, а боты - это просто сигнал о том, что ваш веб-сервер либо занижен, атакован или неправильно настроен. В любом случае что-то не так.
Если вы действительно хотите контролировать, какие запросы поступают в apache, вам понадобится WAF (брандмауэр веб-приложений) или балансировщик нагрузки перед apache, чтобы отфильтровать плохие запросы до того, как они потребуют дорогостоящие соединения apache. Во многих случаях вы также можете разгрузить ЦП, выполняя шифрование SSL / TLS.
Я знаю, что это не быстрое решение или ответ, который вы ищете, но независимо от проблемы, вряд ли вы решите ее, идя по этому пути.
Вы можете просто установить для KeepAliveTimeout большое значение.
Вот ручной ввод для этой директивы: http://httpd.apache.org/docs/2.4/mod/core.html#keepalivetimeout
Обратите внимание, что «Установка высокого значения KeepAliveTimeout может вызвать проблемы с производительностью на сильно загруженных серверах. Чем больше тайм-аут, тем больше серверных процессов будет занято в ожидании соединений с бездействующими клиентами».