Регулирование трафика для web-сервера lighttpd Алексей Снастин, независимый разработчик ПО, начальник отдела Дата: 04.12.2012 http://www.ibm.com/developerworks/ru/library/l-lighttpd/ Описание: В статье рассматривается настройка регулирования сетевого трафика для широко известного и достаточно часто применяемого на практике web-сервера lighttpd. Введение Web-сервер lighttpd (произносится как lighty) с самого начала был задуман как альтернатива "тяжеловесным, корпоративным" серверам. Основными его преимуществами по сравнению с конкурентами стали существенно меньшие требования к ресурсам компьютера, главным образом, к оперативной памяти, скорости и эффективности обслуживания входящих запросов. Автор-разработчик Ян Кнешке (Jan Kneschke) с самого начала взял курс на оптимизацию производительности web-сервера, не забывая при этом об обеспечении высокой степени безопасности. В настоящее время (последняя версия 1.4.30 от 18 декабря 2011 г.) lighttpd поддерживает широкий спектр функциональных возможностей: Web 2.0, FastCGI, SCGI, Auth, Output-Compression, URL-Rewriting и многие другие. Предварительные замечания Если администратор web-сервера не держит под контролем количество пользовательских соединений и не устанавливает для них необходимые ограничения, то рано или поздно наступает ситуация, в которой ресурсы сервера оказываются полностью исчерпанными. Спамеры, взломщики всех мастей и калибров, всевозможные боты способны "съесть" всю пропускную способность web-сервера. Поэтому для web-сервера необходимо определить разумную политику отслеживания и регулирования соединений, а также установить ограничение на количество установленных соединений в секунду, поскольку по умолчанию lighttpd не предусматривает подобного ограничения. Лимит можно установить на пропускную способность как для каждого отдельного соединения, так и для всех соединений. Кроме того, потребуется изменение параметров сетевого экрана (firewall) для ограничения количества соединений в секунду. Такие настройки позволят постоянно держать под контролем пользовательские соединения. Изменение конфигурации Первое необходимое действие для того, чтобы получить возможность ограничить трафик, – редактирование файла конфигурации /etc/lighttpd/lighttpd.conf. Разумеется, для внесения изменений в этот файл требуются права суперпользователя root. Ограничение пропускной способности можно установить несколькими способами. Во-первых, можно назначить лимит для всех соединений с web-сервером. Требуемое значение задаётся в Кбайт/с. В файл конфигурации /etc/lighttpd/lighttpd.conf следует вписать следующую строку: Code: server.kbytes-per-second=512 Это означает, что суммарная пропускная способность всех соединений с контролируемым web-сервером не будет превышать 512 Кбайт/с. Во-вторых, ограничение можно установить для каждого отдельного соединения. Для этого в файл конфигурации добавляется такая строка: Code: connection.kbytes-per-second=64 Таким образом, для любого соединения с контролируемым web-сервером трафик будет ограничен значением 64 Кбайт/с. Третий вариант: ограничение пропускной способности только для соединений, устанавливаемых с конкретным виртуальным хостом. Создание и конфигурирование виртуальных хостов подробно рассматривается в соответствующем разделе документации по lighttpd. В данной статье рассматривается только назначение лимита для трафика, показанное в листинге 1. Листинг 1. Установка ограничения трафика для виртуального хоста Code: $HTTP["host"] == "www.myserv.org" { server.kbytes-per-second = 64 } После внесения любых изменений в файл конфигурации /etc/lighttpd/lighttpd.conf необходимо перезапустить сервер lighttpd, например, следующей командой (для её выполнения также требуются права суперпользователя root): Code: service lighttpd restart После перезапуска все внесённые изменения вступят в силу. Регулирование установления соединений с отдельных IP-адресов Ограничения на количество устанавливаемых соединений с одного IP-адреса регулируются с помощью штатного (для Linux) средства администрирования сетевого экрана (фильтра) iptables. В листинге 2 приведён фрагмент файла shell-скрипта, в котором назначается лимит на соединения с одного IP-адреса. Листинг 2. Пример регулирования лимита на соединения с помощью iptables Code: # Контролируемый временной интервал в секундах LIMIT_SEC=90 # Допустимое максимальное количество соединений с одного IP-адреса LIMIT_CNNCT=10 # ... # По умолчанию любое превышение лимита будет игнорироваться - DROP (или возможно REJECT) LIMIT_ACTION="DROP" /sbin/iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set /sbin/iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update \ --seconds ${LIMIT_SEC} --hitcount ${LIMIT_CNNCT} -j ${LIMIT_ACTION} # ... Фрагмент, приведённый в листинге 2, определяет, что любые попытки установления входящих соединений с одного IP-адреса будут отвергнуты, если с данного IP-адреса уже выполнено более 10 попыток установления соединения в течение полутора минут (90 секунд). Этот фрагмент (с необходимыми по месту корректировками) может быть включён в shell-скрипт, который устанавливает правила для сетевого экрана в конкретной Linux-системе. Заключение Web-сервер lighttpd является не только быстрым и эффективным, но и удобным в управлении и конфигурировании. По мнению самих авторов lighttpd, в самых простых случаях конфигурирование сервера занимает от 5 до 10 минут. Такая гибкость позволяет без особых затруднений решать различные проблемы, связанные с безопасностью и производительностью web-серверов. Решение одной из таких проблем: регулирование трафика и ограничение количества соединений, - было показано в данной статье.