Я размещаю общедоступную веб-службу с тяжелым процессором, и я хотел бы настроить 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-адрес обслуживается одним соединением. Скажем так, обычно это не очень красивое зрелище! Вы можете перейти на страницу «Сервер занят» или что-то подобное, но я бы пошел по пути оптимизации вашего сервера, так что это лучше, чем расстраивать посетителей.