- Как ограничить пропускную способность Apache на Windows для IP и отдельных файлов
- Как включить mod_bw
- Добавление файлов для обработки модулем
- Ограничение скорости загрузки с сервера
- Минимальная гарантированная скорость
- Ограничение скорости скачивания с сервера файлов определённого вида и размера
- Размер пакетов
- Максимальное число подключений
- Изменение кода ошибок
- Страница статуса модуля
- Примеры
- Как настроить сервер Apache на максимальную производительность
- Что замедляет сервер?
- Как ускорить работу Apache?
- 5 шагов для ускорения работы Apache
- Настройки для ускорения Apache во время компиляции
- Загружайте только нужные модули
- Выберите правильный MPM
- Ускорение работы Apache изменениями во время выполнения
- Поиск DNS
- Настройка AllowOverride
- Настройки FollowSymLinks и SymLinksIfOwnerMatch
- Согласование содержимого (Content Negotiation)
- Настройка MaxClients
- Настройки MinSpareServers, MaxSpareServers и StartServers
- Настройка MaxRequestsPerChild
- Настройка KeepAlive и KeepAliveTimeout
- Timeout
- Сжатие и кэширование HTTP
- Разные серверы для статического и динамического контента
- Тонкая настройка MySQL и PHP
- Заключение
Как ограничить пропускную способность Apache на Windows для IP и отдельных файлов
В данной статье мы рассмотрим как управлять пропускной способностью веб-сервера, как ограничивать пропускную способность для IP или для определённого сайта (виртуального хоста). Для этого мы установим и настроим плагин mod_bw. Это ограничитель пропускной способности для Apache на Windows. Данный модуль позволяет настраивать скорость загрузки данных с сервера, причём настроить можно отдельно для каждого типа и размера файлов, установить ограничения на основе IP адреса, подсети и User Agent пользователя.
Файл данного плагина не входит в стандартный набор Apache, но команда apachelounge компилирует его для Windows. Перейдите на сайт https://www.apachelounge.com/download/, найдите и скачайте файл mod_bw:
Как включить mod_bw
Распакуйте архив и поместите файл mod_bw.so в папку modules, если вы устанавливали по этой инструкции, то это папка C:\Server\bin\Apache24\modules\.
Для включения этого модуля, добавьте в ваш конфигурационный файл httpd.conf (C:\Server\bin\Apache24\conf\httpd.conf) строку:
По умолчанию модуль отключён, чтобы она начал работать добавьте в конфигурационный файл также строку:
Чтобы изменения вступали в силу, не забывайте при каждом изменении конфигурационного файла httpd.conf перезапускать веб-сервер!
Добавление файлов для обработки модулем
По умолчанию данный модуль ловит не все запросы, пример нормального использования:
То есть будут обрабатываться только текстовые и HTML файлы. Чтобы принудительно обрабатывать каждый запрос укажите следующую директиву:
Это важная настройка! Поскольку если вы не добавите определённый тип файлов для обработки, то они будут игнорироваться! Причём даже если тип файла явно указан в директории LargeFileLimit!
Ограничение скорости загрузки с сервера
Следующей директивой устанавливается пропускная способность:
Она принимает 2 параметра. ИСТОЧНИК — это источник подключений. Это может быть полный хост, часть домена, IP адрес, маска подсети, (например 192.168.0.0/24 или 192.168.0.0/255.255.255.0) или all, что означает любой источник. Второй параметр указывает общую скорость, доступную для ИСТОЧНИКА. Если скорость установлена на 0, значит без лимитов.
Порядок имеет значение — первые записи имеют приоритет.
Вы также можете ограничить пропускную способность для определённых User Agent:
User-Agent — это регулярное выражение, которые будет проверяться на совпадение с моделей браузера. Самый простой способ объяснить, это примеры:
Первое правило будет искать браузер, который идентифицирует себя как Mozilla/5(что-то ещё).
Второе правило совпадёт с браузером, который в качестве части своего пользовательского агента имеет «wget».
Минимальная гарантированная скорость
Установка минимальной ширины пропускного канала:
Она принимает 2 параметра. ИСТОЧНИК — это источник подключений. Это может быть полный хост, часть домена, IP адрес, маска подсети, (например 192.168.0.0/24 или 192.168.0.0/255.255.255.0) или all, что означает любой источник. Второй параметр указывает общую скорость, доступную для ИСТОЧНИКА. Если скорость установлена на 0, значит без лимитов.
Что это значит? Если у вас общая скорость 100 Кбайт, а MinBandWidth установлен на 50 Кбайт, не имеет значения, сколько у вас клиентов, у всех будет минимальная общая скорость загрузки 50 Кбайт. Если скорость равна 0, вы будете использовать минимальное значение по умолчанию (256 байт/с). Существует специальное значение -1. Это значение означает, что у каждого клиента будет максимальная скорость, определяемая директивой BandWidth. Смотрите примеры:
В приведённом выше примере будет установлена максимальная скорость 100kb для первого клиента. Если придёт больше клиентов, пропускная способность будет соответственно разделена, но у каждого будет по крайней мере 50kb (даже если у вас 50 клиентов)
Этот пример делает так, что каждый имеет максимальную скорость 50kb.
Ограничение скорости скачивания с сервера файлов определённого вида и размера
Директива для ограничения пропускной способности для файлов определённого типа и/или размера:
ТИП, последняя часть файла (расширение) или * для соответствия всем файлам. Вы можете использовать .tgz, чтобы соответствовать только tar-сжатым файлы, .avi для соответствия видеофайлам или * для соответствия всем. МИНИМАЛЬНЫЙ РАЗМЕР — это размер (в килобайтах) файла для сопоставления. Таким образом, вы можете включить правилодля огромных видеофайлов, которые создают нагрузку на пропускной канал.
Пример — разрешённая скорость для файлов указанного типа и размера.:
Ограничит .avi файлы большего (или равного) размера 500kb на скорость скачивания 10kbytes/s
При этом не забудьте установить значение AddOutputFilterByType для обработки указанного типа файлов или используйте ForceBandWidthModule для принудительной обработки всех типов файлов:
Настройки LargeFileLimit для типов необрабатываемых файлов игнорируются!
Если вы хотите установить ограничение для всех типов файлов, то в качестве ТИП укажите * (звёздочку).
Размер пакетов
Директива для установки размера пакета:
Вероятно, вам никогда не нужно менять это. По умолчанию 8192, что хорошо
практически для любой скорости. Пакет должен быть размером от 1024 до 131072. Небольшой пакет приведёт к снижению максимальной скорости, а мод будет использовать больше времени для разбития на пакеты. Если вы используете слишком большой размер, мод настроит его на более низкие скорости. Если вы используете мод в высокоскоростных сетях, то есть вы хотите установить ограничения в мегабитах/с, вам будет лучше использовать размеры пакетов 16384 или 32768.
Максимальное число подключений
Настройка максимального количества подключений:
Директива принимает 2 параметра. ИСТОЧНИК — это источник подключений. Это может быть полный хост, часть домена, IP адрес, маска подсети, (например 192.168.0.0/24 или 192.168.0.0/255.255.255.0) или all, что означает любой источник. Второй параметр — это максимальное количество соединений, разрешённых от источника. Любое соединение выше МАКСИМАЛЬНО, получит ошибку 503 Сервис временно недоступен
Есть подвох. Вам необходимо иметь ограничение BandWidth для того же источника.
Это не обязательно должен быть нижний предел. Но нужно что-то установить (неограниченно, не считается). Вы можете спросить, почему. Это потому, что в модуле используется одинаковое пространство памяти ограничения полосы пропускания для подсчёта соединений, поэтому получается сэкономить пространство памяти. Если вы не указали ширину BandWidth с тем же источником, MaxConnections будет игнорироваться.
Для указания максимального количества подключений можно указать пользовательский агент. Если вы хотите сделать это:
User-Agent — это регулярное выражение, которые будет проверяться на совпадение с моделей браузера. Самый простой способ объяснить, это примеры:
Первое правило будет искать браузер, который идентифицирует себя как Mozilla/5(что-то ещё).
Второе правило совпадёт с браузером, который в качестве части своего пользовательского агента имеет «wget».
Пожалуйста, помните, что каждая скорость будет зависеть в основном от вашего соединения. Вы не можете получить больше скорости, если у вас её нет.
Изменение кода ошибок
Настройка кода ошибки:
По умолчанию при достижении maxconnections мод выдаст HTTP код 503, то есть код HTTP_SERVICE_UNAVAILABLE. Некоторым пользователям раздражает сообщение об ошибке, и они не знают, почему. Вы можете использовать ErrorDocument, чтобы указать ошибку 503 на страницу, объясняющую, что вы находитесь под большой нагрузкой соединений, но иногда 503 выдаётся сервером по другим причинам. Таким образом, с помощью этой директивы вы можете установить код ошибки, который будет возвращаться при достижении MaxConnection. Вы можете использовать любой код ошибки от 300 до 599. Обратите внимание, что некоторые коды ошибок уже используются, поэтому перед использованием любого числа просмотрите список кодов (найдите коды ошибок http в google). При тестировании я использовал код ошибки 510, который ещё не назначен для других целей.
Страница статуса модуля
Модуль может отображать простую страницу статуса, показывающую статистику от работающего модуля. Статистика показывает точную информацию по использованию модуля для ограничения скорости передачи в данную секунд.
Чтобы это работала, вам нужно настроить обработчик на любой виртуальный хост. Можно установить под административном виртуальным хостом или настроить какие-нибудь политики, чтобы сделать его приватным.
Пример на локальном веб сервере, добавьте в конфигурационный файл строки:
Теперь страница со статусом будет доступна по адресу http://127.0.0.1/modbw. Или вы можете загрузить статистику в формате CSV по адресу http://127.0.0.1/modbw?csv
Предоставляется следующая информация:
Примеры
Ограничить каждого пользователя максимальной скоростью загрузки 10Kb/s на этот виртуальный хост:
Ограничить всех внутренних пользователей (LAN) на 1000 kb/s с минимальной скоростью 50kb/s, а для файлов больше чем 500kb на 50kb/s.
Ограничить файлы с расширениями avi и mpg на 20kb/s.
«Правильный» способ использования указав фильтр по mime типу (для текста) на 5kb/s:
Как настроить сервер Apache на максимальную производительность
В наши дни все ждут от сайтов молниеносной скорости загрузки. В этой статье мы рассмотрим лучшие методы оптимизации сервера Apache.
Что замедляет сервер?
Работа веб-серверов может замедляться из-за вредоносных программ, больших объемов трафика или из-за неправильного распределения ресурсов. Есть два пути ускорения работы веб-сервера Apache:
Круглосуточный мониторинг производительности и экстренные исправления.
Отслеживание производительности, завершение процесса-нарушителя и установление лимитов выделенных ресурсов, чтобы в будущем предотвратить возникновение подобных проблем.
Периодический аудит производительности и настройка Apache.
Позволяет найти уязвимости сервера и защитить их.
Как ускорить работу Apache?
Настроить производительность Apache таким образом, чтобы она соответствовала объемам получаемого трафика. Таким образом можно добиться 50% ускорения работы.
5 шагов для ускорения работы Apache
Ускорить работу Apache можно на двух основных стадиях:
- Во время компиляции – настройки при установке сервера.
- Во время выполнения — установка параметров, влияющих на сервер во время его работы.
Настройки для ускорения Apache во время компиляции
Нужно выбирать вариант установки Apache, исходя из ваших требований. Это поможет создать быстрый и эффективный веб-сервер.
Загружайте только нужные модули
В Apache функциональность реализуется путем добавления модулей. Они бывают двух типов: статические и динамические (общие).
Чтобы посмотреть список модулей, поддерживаемых вашим сервером, используйте команду apachectl -M. Статические модули компилируются в бинарные файлы httpd, а динамические загружаются непосредственно во время выполнения.
Статические и динамические модули : ключевые различия
Статические модули | Динамические модули |
Компилируются в бинарные файлы | Добавляются во время выполнения |
Требуют перекомпиляции кода | Перекомпиляция не требуется |
Быстро загружаются | Замедляют веб-сервер |
Чем больше статических модулей в бинарных файлах, тем быстрее работает веб-сервер. Но они требуют перекомпиляции Apache каждый раз, когда нужно что-то изменить. Из-за этого динамические модули или DSO используются чаще, поскольку они могут быть скомпилированы отдельно и загружены во время выполнения.
Но большое количество динамических или общих модулей может замедлить работу сервера Apache и сайта. Поэтому при выборе модулей требуется соблюдать осторожность.
Чтобы увеличить скорость работы и производительность, используйте минимальное количество динамических модулей, поскольку они уменьшают объем доступной памяти.
Выберите правильный MPM
В Apache используются MPM (мульти-процессинговые модули), которые обрабатывают запросы, приходящие на сервер. Они прослушивают сетевые порты сервера, принимая запросы и создавая дочерние процессы.
MPM бывают двух типов: Prefork и Worker. В MPM Prefork каждый процесс httpd обрабатывает один сетевой запрос. Это более безопасно по сравнению с MPM Worker, но требует большего количества памяти и ресурсов.
MPM – Prefork и Worker
MPM Prefork | MPM Worker |
Один поток | Несколько потоков |
Использует больше ресурсов | Использует меньше памяти |
Отказоустойчив | Справляется с большим трафиком |
При использовании MPM Worker Apache работает в режиме многопоточного сервера, где каждый отвечает за свой запрос. Этот вариант подходит для обработки большего трафика при ограниченных мощностях сервера.
По умолчанию большинство установок Apache используют модуль Prefork. Он применяется для обработки больших объемов трафика. Вы можете проверить, какой модуль MPM использует ваш сервер при помощи следующей команды:
Определение типа MPM на вашем веб — сервере Apache
В Apache 2.4 появилась поддержка э MPM модуля Event, который может обрабатывать множественные запросы внутри одного потока. Поэтому он работает даже быстрее, чем модуль Worker.
Ускорение работы Apache изменениями во время выполнения
Чтобы повысить производительность сервера, нужно регулярно измерять производительность и осуществлять тонкую настройку конфигурации. Наиболее важные параметры, которые нужно оптимизировать:
Поиск DNS
Apache может тратить время на определение хоста каждого IP, с которого приходит запрос. Это замедляет обработку запроса, а также приводит к пустой трате ресурсов. Чтобы избежать этого, нужно отключить опцию HostnameLookups.
При настройке директив Allow from или Deny from используйте IP-адреса вместо доменных имён. Иначе будет осуществляться двойной поиск имени DNS, который уменьшит производительность сервера.
Настройка AllowOverride
Если задана опция AllowOverride, то Apache попытается открыть файл .htaccess в каждой папке, которую он посещает. Эти дополнительные запросы к файловой системе увеличивают время отправки ответа с сервера.
Поэтому лучше отключить эту опцию. Если переопределение настроек в файлах .htaccess необходимо в определённой папке, нужно разрешить это только для данного каталога.
Настройки FollowSymLinks и SymLinksIfOwnerMatch
Настройка Apache FollowSymLinks сообщает серверу, что нужно проверять символические ссылки и проходить по ним. Если она имеет значение Off, Apache придётся выполнять дополнительные проверки, что замедлит его работу.
Если установлена директива SymLinksIfOwnerMatch, сервер будет проходить по символическим ссылкам, только если владелец целевого файла тот же, что и владелец ссылки. Это также влияет на скорость работы Apache.
Лучше всего активировать директиву FollowSymLinks и выключить директиву ‘SymLinksIfOwnerMatch’. Но это может привести к проблемам с безопасностью, поэтому окончательное решение остается за вами.
Согласование содержимого (Content Negotiation)
Согласование содержимого позволяет клиентам выбирать формат данных, получаемых от сервера. Рекомендуется избегать согласования содержимого для быстрого ответа.
Если согласование содержимого необходимо для сайта, можно снизить задержки, используя файлы type-map вместо директивы Options MultiViews. Ее применение увеличивает задержку.
Настройка MaxClients
Настройка MaxClients устанавливает лимит количества одновременных запросов, которое может поддерживаться Apache. Если это значение слишком мало, запросы станут в очередь, и не будут обрабатываться.
Большое значение параметра может загрузить оперативную память и повлиять на скорость ответов Apache. Необходимо выбрать оптимально значение исходя из объёма доступной памяти и ресурсов, потребляемых процессом.
Настройки MinSpareServers, MaxSpareServers и StartServers
MaxSpareServers и MinSpareServers определяют количество дочерних процессов, которые будут находиться в состоянии ожидания обработки запросов. Эти параметры важны, потому что создание дочернего процесса отнимает ресурсы.
Если значение MinSpareServers слишком низкое, и на сервер поступает одновременно несколько запросов, Apache создаст дополнительные дочерние процессы. Это снижает возможность быстрого ответа на запрос клиента.
Значение MaxSpareServers не должно быть слишком большим. Так как стоящие в очереди на обработку дочерние процессы потребляют лишние серверные мощности. Нужно установить эти значения в оптимальном диапазоне, чтобы сбалансировать использование ресурсов и производительность.
Директива StartServers устанавливает количество дочерних серверных процессов, которые создаются при старте сервера. Если запросов много, а Apache часто перезагружается, нужно установить относительно большое значение.
Настройка MaxRequestsPerChild
Директива MaxRequestsPerChild устанавливает лимит количества запросов, которое будет обрабатывать каждый дочерний процесс. Слишком малое значения может привести к перегрузке сервера при создании новых процессов. Поэтому нужно установить это значение в диапазоне нескольких тысяч, чтобы ускорить работу Apache.
Настройка KeepAlive и KeepAliveTimeout
KeepAlive используется для поддержки единого соединения для передачи данных веб-страницы. Благодаря чему не тратится время на создание нового подключения для каждого файла.
KeepAliveTimeout определяет время ожидания следующего запроса. Если значение большое, дочерние процессы могут расходовать ресурсы, ожидая следующего запроса. Оптимальное значение – 2-5 секунд для небольших объемов трафика и 10 секунд для высоконагруженных серверов.
Timeout
Устанавливает время ожидания запроса от посетителя. При больших объемах трафика значение параметра должно быть не менее 120 секунд. Но лучше держать это значение минимальным. Это позволяет предотвратить излишнее расходование ресурсов.
Сжатие и кэширование HTTP
Сжатие HTTP применяется для ускорения работы серверов Apache. Сервер применяет к телу ответа шифрование gzip или deflate перед тем, как отправить его клиенту. Затем клиент распаковывает полученные данные. Данные сжимаются только если браузер запрашивает сжатие. Сжатие HTTP включается в Apache с помощью модуля ‘mod_deflate’.
При кэшировании копия данных сохраняется на стороне клиенте или прокси-сервере, поэтому их не нужно получать напрямую с сервера. Кэширование часто используемых файлов помогает снизить нагрузку на сервер и ускорить обработку запросов.
Модули mod_expires и mod_headers для настройки кэша через HTTP- заголовки, присылаемые с сервера. С помощью директив cache-control можно управлять правилами кэширования, чтобы ускорить работу Apache.
Также можно использовать кэширование на стороне сервера, когда часто запрашиваемый контент хранится в памяти. Для настройки данного типа кэширования используется модуль mod_cache.
Разные серверы для статического и динамического контента
Процессы Apache, которые управляют динамическим контентом, потребляют от 3 до 20 Мб памяти. Статический контент требуют всего лишь 1Мб памяти. Процесс, управляющий динамическим контентом, при следующем запросе может предоставлять статический контент.
Что приводит к расходам памяти и замедлению работы сервера. Поэтому рекомендуется разделить серверы на управляющие статическим контентом и динамическим контентом.
Например, можно использовать небольшой Apache в качестве frontend-сервера, предоставляющего статический контент. Запросы на динамический контент будут перенаправляться к другому серверу Apache со всеми необходимыми модулями.
Для подобного перенаправления запросов используются модули mod_proxy и mod_rewrite. Клиент не заметит разницы, и будет считать, что все запросы выполняются одним сервером.
Используя два сервера, можно ускорить работу Apache, выдавая статический контент быстрее и выделяя большее количество памяти для обработки динамического контента.
Тонкая настройка MySQL и PHP
Не менее важно оптимизировать сервер баз данных, чтобы избежать задержек в его работе. Также необходимо улучшить производительность PHP-страниц, используя механизм кэширования, такой как Zend OPcache.
Сервер MySQL оптимизируется путем настройки фрагментации таблиц, максимального количества подключений, размеров буфера, кэша запросов, пула и т.п.
Заключение
Настройка производительности Apache – нелёгкое дело. Поэтому важно иметь чёткое понимание технических требований веб-сервера и принципа его работы.