Назад | Перейти на главную страницу

Ограничение одновременных подключений на IP с помощью Apache2

Я размещаю общедоступную веб-службу с тяжелым процессором, и я хотел бы настроить Apache2, чтобы разрешить только одно одновременное подключение на каждый IP-адрес в текущем месте, чтобы отдельные клиенты не использовали слишком много ресурсов.

Есть ли для этого удобное решение apache2? Я изучил mod_bw, но, похоже, это не помогает (MaxConnections применяется только для всех пользователей, а не для каждого IP-адреса). Также существует модуль под названием apache2-mod-limitipconn, но у него нет предварительно скомпилированных пакетов, и я думаю, что он больше поддерживается, поскольку веб-сайт мертв. Я бы предпочел что-то, что я могу включить в качестве формальной зависимости в Ubuntu.

Я не уверен насчет модуля apache, но вы можете использовать для него iptables. Вот как использовать модуль connlimit: http://www.cyberciti.biz/faq/iptables-connection-limits-howto/

В вашей ситуации будет работать что-то вроде следующего:

/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

Однако, как упоминалось в других вопросах, будьте осторожны: это правило может блокировать некоторых легитимных роботов (например, поискового робота Google) или интернет-провайдеров / организаций, которые используют NAT и совместно используют один IP-адрес для большого количества пользователей.

Вы можете использовать модуль httpd mod_qos.

QS_SrvMaxConnPerIP <number> [<connections>]

Определяет максимальное количество подключений на исходный IP-адрес для этого сервера (виртуального хоста). Аргумент «соединения» определяет количество занятых соединений сервера (всех виртуальных хостов) для включения этого ограничения, по умолчанию - 0 (что означает, что ограничение всегда включено, даже если сервер простаивает).

Подробнее в http://mod-qos.sourceforge.net.

Пример:

LoadModule qos_module path_to_module/mod_qos.so
<IfModule mod_qos.c>
        # max connection per IP is
        QS_SrvMaxConnPerIP 15 
</IfModule>

<VirtualHost *:80>
...
</VirtualHost>

У меня просто была противоположная потребность - apache2 обслуживал только одну страницу за один IP. Если это займет много времени, загрузка другой страницы на другой вкладке не начнется до тех пор, пока другие на тот сервер, который я запросил, были завершены.

Я знал, что это связано с сессиями, и нашел полный ответ Вот и Вот.

Одно соединение на IP-адрес работать не будет. Веб-браузер будет использовать одно соединение для загрузки веб-страницы, затем 10+ одновременных подключений для получения всех изображений, css, javacripts и т. Д. Итак, если вы ограничите IP, пользователь получит главную страницу и, возможно, несколько изображения и все.

Единственный вариант использования, для которого работает ограничение по IP, - это если у вас есть выделенный сервер загрузки, на котором вы не хотите, чтобы люди использовали ускорители загрузки. Также известен как RapidShare.

Вам необходимо выяснить, как злоумышленники злоупотребляют вашими услугами, и нацелить их. Если ограничить всех, то всем будет больно.

Если трафик слишком большой, вам необходимо оптимизировать сайт или добавить еще несколько циклов ЦП с большим / более быстрым оборудованием.

По моему опыту, это немного сложнее, чем просто ограничение «одного соединения на IP», боюсь (не всегда :-)).

Однако были и другие настраиваемые параметры, такие как «MinSpareServers, MaxSpareServers и StartServers» (я не уверен, что они все еще существуют, но они определенно были в Apache 2.0).

Также очевидно, что сжатие вывода может улучшить потребности в полосе пропускания и ускорить время отклика до 75% с помощью "mod_deflate", если это поможет.

"mod_bandwidth" может предложить некоторую помощь, а не пытаться ограничить одно соединение, и, вероятно, это путь, по которому я бы пошел после просмотра сжатия.

Или, если вы можете написать C, вы можете сами создать модуль для подсчета подключений по IP.

Следует обратить внимание на то, что происходит, когда IP-адрес обслуживается одним соединением. Скажем так, обычно это не очень красивое зрелище! Вы можете перейти на страницу «Сервер занят» или что-то подобное, но я бы пошел по пути оптимизации вашего сервера, так что это лучше, чем расстраивать посетителей.