Оптимизация работы Apache

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

Выбор правильного MPM

Apache является модульным, так как вы можете легко добавлять и удалять функции. Многопроцессорные модули (MPM) обеспечивают эту модульную функциональность в основе Apache - управление сетевыми соединениями, привязка к портам и диспетчеризация запросов. MPM позволяют использовать потоки или даже переносить Apache на другую операционную систему.

Одновременно может быть активен только один MPM, и он должен быть скомпилирован статически с:

Традиционная модель одного процесса на запрос называется prefork. Более новая, потоковая модель называется worker, которая использует несколько процессов, каждый из которых имеет несколько потоков, чтобы получить лучшую производительность при меньших накладных расходах. Наконец, событийный MPM - это модуль, который хранит отдельные пулы потоков для различных задач.

Чтобы определить, какой MPM вы используете в настоящее время, выполните команду

Вы можете посмотреть, какие модули Apache были скомпилированы, выполнив

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

Prefork является более безопасным выбором; вы должны провести тщательное тестирование, если вы выберете worker. Прирост производительности также зависит от библиотек, поставляемых с вашим дистрибутивом, и вашего оборудования.

  • Worker MPM - использует несколько дочерних процессов, каждый из которых может иметь несколько потоков. Каждый поток обрабатывает одно соединение за раз. Worker обычно является хорошим выбором для серверов с высоким трафиком, работающих под управлением Apache версий до 2.4, поскольку он занимает меньше памяти, чем prefork MPM. Однако он страдает из-за несовместимости с непотокобезопасными библиотеками.
  • Event MPM - работает по потокам, как и Worker MPM, но предназначен для одновременного обслуживания большего количества запросов путем передачи части работы по обработке вспомогательным потокам, освобождая основные потоки для работы с новыми запросами. Event MPM функционирует идентично рабочему MPM в случае SSL-соединений. Apache имеет самые низкие требования к ресурсам при использовании под Event MPM. Event MPM доступен только начиная с версии Apache 2.4.
  • Prefork MPM - использует несколько дочерних процессов с одним потоком в каждом. Каждый процесс обрабатывает одно соединение за раз. На многих системах prefork сравним по скорости с worker, но потребляет больше памяти. Безпоточная конструкция prefork имеет преимущества перед worker в некоторых ситуациях: Prefork является самым безопасным модулем и может использоваться с непотокобезопасными сторонними модулями. Prefork MPM также легче отлаживать на платформах с плохой поддержкой отладки потоков.

Независимо от того, какой MPM вы выберете, вы должны настроить его соответствующим образом. В целом, настройка или оптимизация MPM подразумевает указание Apache, как управлять активными и неактивными рабочими, а также тем, являются ли они потоками или процессами. Начиная с Apache 2.2 Prefork является MPM по умолчанию.

Другие опции MPM

Дополнительный модуль Apache mod_mpm_itk заставляет процесс Apache переключаться на идентификатор пользователя (UID) и идентификатор группы (GID) владельца домена, прежде чем ответить на запрос. Это позволяет каждому пользователю изолировать свои файлы от других с помощью стандартных параметров разрешения файлов. По сути, это позволяет изолировать каждый vhost непосредственно в его конфигурационном файле.

Основное ограничение ITK заключается в его производительности, поскольку он создает и затем уничтожает процесс для каждого запроса, что снижает производительность, особенно по сравнению с Prefork или Worker MPM.

  • mod_mpm_itk не функционирует как отдельный MPM. Вы должны установить prefork MPM для того, чтобы использовать модуль MPM ITK, который должен быть установлен отдельно.
  • mpm_winnt является частью интеграции Apache в операционную систему Microsoft Windows. Использование этого MPM является обязательным условием при использовании Apache в системах этого типа.

Существуют и другие экспериментальные MPM, но мы не рекомендуем использовать их в производственной среде.

Нахождение файла Apache.conf

Для начала найдите и откройте файл конфигурации Apache и найдите раздел директив MPM:

  • CentOS / RHEL / Fedora: /etc/httpd/conf/httpd.conf
  • Ubuntu / Debian: /etc/apache2/httpd.conf
  • DirectAdmin: /etc/httpd/conf/extra/httpd-mpm.conf
  • cPanel: /etc/apache2/conf.d/httpd.conf
  • Plesk: /etc/httpd/conf/

Если вы используете nano, vi или vim: после открытия файла вы можете найти директивы, прокрутив файл. Используя VI или VIM, вы также можете выполнить поиск, набрав прямую косую черту '/' и введя точную строку, которую вы ищете (поиск зависит от регистра).

Ниже приведен пример конфигурации модуля MPM prefork:

Для изменения MPM в простых системах на базе RHEL или Debian замените mpm_prefork_module на mpm_worker_module или mpm_event_module, соответственно.

В DirectAdmin модуль MPM может быть выбран с помощью Custombuild или путем редактирования /usr/local/directadmin/custombuild/options.conf

Администраторы cPanel могут изменить MPM, пройдя в WHM > Home > Software > EasyApache EasyApache 4

Директивы MPM

Ниже вы можете найти ссылки на документацию Apache для всех 3 модулей MPM:

StartServers (Prefork, Event, Worker MPM)

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

Подсказка: зеркально отразите это значение на то, которое установлено в MinSpareServers.

MinSpareServers (Prefork MPM)

Устанавливает желаемое минимальное количество простаивающих процессов дочернего сервера. Неработающий процесс - это процесс, который не обрабатывает запрос, но ожидает нового запроса.

Если количество простаивающих дочерних процессов меньше, чем задано этим значением, то родительский процесс создает новые дочерние процессы с максимальной скоростью 1 в секунду. Начиная с Apache 2.4, эта скорость увеличивается экспоненциально, начиная с 1 и заканчивая 32 дочерними процессами в секунду.

Преимущество заключается в том, что при поступлении запроса он может занять незанятый поток; если поток будет недоступен, Apache придется порождать нового ребенка, занимая ресурсы и увеличивая время выполнения запроса.

Рекомендуется изменить значение этого параметра следующим образом. Эти значения основаны на общем объеме установленной памяти (RAM):

  • Виртуальный выделенный сервер 5
  • Выделенный сервер с 1-2 ГБ ОЗУ 10
  • Выделенный сервер с 2-4 ГБ ОЗУ 20
  • Выделенный сервер с 4+ ГБ ОЗУ 25

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

MaxSpareServers (Prefork MPM)

Устанавливает желаемое максимальное количество простаивающих процессов дочернего сервера. Неработающий процесс - это процесс, который не обрабатывает запрос, но ожидает нового запроса.

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

Если значение MaxSpareServers меньше MinSpareServers, Apache автоматически подгонит MaxSpareServers к MinSpareServers плюс один.

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

ServerLimit (Prefork, Event, Worker MPM)

В Prefork MPM директива ServerLimit представляет собой верхний предел MaxRequestWorkers. Эта настройка обычно используется как защита или потолок от ошибок ввода при изменении MaxRequestWorkers.

В Prefork MPM ServerLimit используется только в том случае, если вам нужно установить MaxRequestWorkers больше 256 (по умолчанию). В этом случае вы должны соответствовать значению, которое вы установили для MaxRequestWorkers, но вы не должны устанавливать значение этой директивы выше, чем то, на которое вы, возможно, захотите установить

MaxRequestWorkers

В Event MPM и Worker MPM ServerLimit представляет собой верхний предел допустимого количества дочерних процессов Apache. Это ограничение предотвращает порождение гораздо большего количества дочерних серверов, чем может выдержать система, что может привести к простою или даже потере данных.

Для рабочих и событийных MPM эта директива в сочетании с ThreadLimit устанавливает максимальное значение MaxRequestWorkers на время жизни процесса Apache httpd.

Для MPM событий эта директива также определяет, сколько старых процессов сервера могут продолжать работать и завершать обработку открытых соединений.

ThreadLimit (Event, Worker MPM)

Эта директива устанавливает максимальное настроенное значение для ThreadsPerChild на время жизни процесса Apache httpd. Любые попытки изменить эту директиву во время перезапуска будут проигнорированы, но ThreadsPerChild может быть изменен во время перезапуска до значения этой директивы.

При использовании этой директивы следует соблюдать особую осторожность. Если ThreadLimit установлен в значение, значительно превышающее ThreadsPerChild, будет выделена дополнительная неиспользуемая общая память. Если и ThreadLimit, и ThreadsPerChild установлены в значения, превышающие возможности системы, Apache httpd может не запуститься или система может стать нестабильной.

Не устанавливайте значение этой директивы больше, чем наибольшее прогнозируемое значение ThreadsPerChild для текущего запуска Apache httpd.

ThreadsPerChild (Event, Worker MPM)

Эта директива устанавливает количество потоков, создаваемых каждым дочерним процессом. Каждый запущенный поток может обрабатывать один запрос. Дочерний процесс создает эти потоки при запуске.

При использовании MPM типа mpm_winnt, где есть только один дочерний процесс, это число должно быть достаточно большим, чтобы справиться со всей нагрузкой сервера.

При использовании MPM типа worker, где есть несколько дочерних процессов, общее количество потоков должно быть достаточно большим, чтобы справиться с общей нагрузкой на сервер.

Для этой директивы также существует верхний предел, который контролируется директивой ThreadLimit, по умолчанию равной 64 потокам.

Для увеличения ThreadsPerChild свыше 64 потоков также необходимо внести изменения в ThreadLimit.

Увеличение этого значения позволяет каждому дочернему процессору обрабатывать больше запросов, снижая потребление памяти и позволяя увеличить директиву MaxRequestWorkers. Ключевым преимуществом запуска большего количества потоков в каждом дочернем процессоре является доступ к кэшу общей памяти. Потоки из одного дочернего процесса не могут получить доступ к

MaxRequestWorkers / MaxClients (Prefork, Event, Worker MPM)

MaxRequestWorkers назывался MaxClients до версии Apache 2.3.13. Однако старое название все еще поддерживается. Он устанавливает ограничение на количество одновременно обслуживаемых запросов. Любые попытки соединения, превышающие лимит MaxRequestWorkers, обычно ставятся в очередь, до числа, определяемого директивой ListenBacklog. Как только дочерний процесс будет освобожден по завершении другого запроса, соединение будет обслужено.

Если это значение установлено слишком мало, соединения, отправленные в очередь, в конечном итоге завершаются по времени; если же эта директива установлена слишком высоко, это приводит к тому, что память начинает свопиться.

Для непоточных серверов (т.е. prefork) MaxRequestWorkers означает максимальное количество дочерних процессов, которые будут запущены для обслуживания запросов. Значение по умолчанию равно 256; чтобы увеличить его, необходимо также поднять ServerLimit.

MaxRequestWorkers и ServerLimit должны иметь равные или почти равные значения, при этом MaxRequestWorkers никогда не должен превышать ServerLimit. Для серверов с высокой нагрузкой это значение должно быть увеличено.

Дополнительную информацию о том, как определить директиву MaxRequestWorkers, смотрите ниже.

Формула для определения директивы MaxRequestWorkers: (Общая память - память критических служб) / Размер на процесс Apache

Я определяю критические службы как службы, такие как mySQL, Plesk, DirectAdmin; любые службы, которые необходимы для правильной работы вашего сервера.

Я использовал следующие команды через shell для определения значений общей памяти, памяти ОС, памяти MySQL и размера процесса Apache:

Общая память

Выделенная память MYSQL

Память Apache

В этом случае серверу выделено 1002 Мб памяти, xx используется самой ОС, 21 Мб используется mySQL, а каждый поток Apache в среднем использует около 30 Мб. MaxClients = (1002 - 21) / 30, поэтому MaxClients = 32,7

Необходимые значения также можно определить с помощью одной единственной команды

MaxConnectionsPerChild (Prefork, Event, Worker MPM)

MaxConnectionsPerChild устанавливает ограничение на количество соединений, которые будет обрабатывать отдельный дочерний серверный процесс. По истечении MaxConnectionsPerChild соединений дочерний процесс умрет. Если MaxConnectionsPerChild равно 0, то процесс никогда не завершится.

Установка MaxconnectionsPerChild в ненулевое значение ограничивает объем памяти, который процесс может израсходовать в результате (случайной) утечки памяти. Код, выполняемый через Apache, может содержать ошибки, которые приводят к утечке памяти. Эти утечки со временем увеличиваются, делая все меньшую часть общего пула памяти дочернего процесса пригодной для использования. Способ восстановления после утечки памяти - это переработка пострадавшего дочернего процесса Apache.

Как определить оптимальное значение для MaxConnectionsPerChild:

Формула для определения директивы MaxConnectionsPerChild: (общее количество ежедневных запросов / общее количество ежедневных процессов).

Определение этих значений немного сложнее, так как требует наличия какого-либо пакета статистики или глубоких знаний по интерпретации журналов доступа Apache.

Эта директива не оказывает негативного влияния на использование памяти, только небольшое количество процессорного времени для запуска процесса. Поэтому, если вы не можете определить эту информацию, следует использовать значение по умолчанию 1000.

Основные директивы Apache

Основные директивы для Apache можно редактировать в файлах ниже:

На сервере на базе DirectAdmin они будут расположены в: /etc/httpd/conf/extra/httpd-default.conf
На сервере cPanel, он будет расположен в /etc/apache2/conf.d/httpd.conf
На сервере Plesk он будет находиться в /etc/httpd/conf/

Если вы используете nano, vi или vim: открыв файл, вы можете найти директивы, прокручивая файл. Используя VI или VIM, вы также можете выполнить поиск, набрав прямую косую черту '/' и введя точную строку, которую вы ищете (поиск зависит от регистра).

Timeout

Параметр Timeout - это количество секунд до истечения времени "отправки" или "получения" данных (на или от клиента). По умолчанию установлено значение 60 секунд.

Определение идеального значения тайм-аута зависит как от трафика, так и от размещенных приложений. В идеале, Timeout должен быть настолько низким, насколько это возможно, при этом позволяя подавляющему большинству обычного трафика работать без проблем.

Большие тайм-ауты заставляют посетителей сайта "ждать в очереди", что создает дополнительную нагрузку на сервер. Это также открывает сервер для DOS-атак в стиле SlowLoris и может привести к длительному ожиданию в браузере, когда он столкнется с проблемой.

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

Необходимо найти баланс между этими двумя крайностями.

Разумное значение 100-120 для виртуальных частных серверов с ограниченными ресурсами или высоконагруженных выделенных серверов. Для серверов с нормальной нагрузкой рекомендуется более низкое значение, предпочтительно менее 60.

KeepAlive

Директива KeepAlive может обеспечить снижение задержки на 50% при одновременном снижении загрузки процессора. Это значительно повышает производительность Apache. Значение по умолчанию - ON.

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

В большинстве ситуаций KeepAlive следует устанавливать на On.

Однако KeepAlive увеличивает потребление памяти и должен быть отключен на серверах с ограниченным объемом оперативной памяти.

Это происходит потому, что процессы Apache вынуждены держать соединения открытыми, ожидая новых запросов от установленных соединений. Пока они ждут, они занимают оперативную память, которую можно было бы использовать для обслуживания других клиентов. Если вы отключите KeepAlive, меньше процессов apache останутся активными.

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

Короче говоря, отключение KeepAlive снижает потребление памяти и позволяет Apache обслуживать больше пользователей, а включение KeepAlive повышает производительность и снижает нагрузку на процессор.

MaxKeepAliveRequests и KeepAliveTimeout. Обсуждаемые в следующем разделе, играют важную роль в тонкой настройке директивы KeepAlive.

MaxKeepAliveRequests

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

Как правило, необходимо, чтобы это значение было не меньше, чем наибольшее количество элементов (HTML, текст, CSS, изображения и т.д.), обслуживаемых наиболее посещаемыми страницами на сервере.

Рекомендуется не увеличивать это значение больше 100 для виртуализированных аккаунтов, таких как VPS. На выделенных серверах с большим объемом оперативной памяти это значение может быть увеличено.

KeepAliveTimeout

Количество секунд, в течение которых Apache будет ждать нового запроса, прежде чем закрыть соединение.

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

Значение по умолчанию 10 секунд является хорошим значением для средней производительности сервера. Это значение следует поддерживать на низком уровне, поскольку в противном случае сокет будет простаивать в течение длительного времени. Рекомендуется снизить это значение до 5 на серверах с высокой нагрузкой.

Другие улучшения производительности

Удаление неиспользуемых модулей

Для экономии памяти отключите загрузку ненужных модулей, включая, но не ограничиваясь, mod_php, mod_ruby, mod_perl и т.д. Помните, что вы можете посмотреть, какие модули Apache были скомпилированы, введя httpd -l

Установите ExtendedStatus Off

ExtendedStatus будет производить несколько системных вызовов для каждого запроса на сбор статистики, что негативно сказывается на производительности. Когда это возможно, лучше использовать ExtendedStatus в течение определенного периода времени, чтобы провести сравнительный анализ, а затем отключить его.

Отключите поиск имени хоста

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

Используйте mod_gzip/mod_deflate

Перед отправкой содержимого зажимайте его, а затем клиент расжимает его при получении. Это позволит минимизировать размер передаваемых файлов и в целом улучшит работу пользователей.

Избегайте подстановочных знаков DirectoryIndex

Выберите конкретный DirectoryIndex, т.е. index.html или index.php, а не index.

Используйте mod_disk_cache НЕ mod_mem_cache

mod_mem_cache не будет разделять свой кэш между различными процессами apache. Это приводит к высокому использованию памяти при небольшом приросте производительности, поскольку mod_mem_cache редко будет обслуживать одну и ту же страницу дважды в одном и том же процессе apache.

Вместо этого используйте mod_disk_cache с плоской иерархией. Установите значения CacheDirLength=2 и CacheDirLevels=1, чтобы htcacheclean не занимал вечность при очистке каталога кэша.

Чтобы использовать ваш кэш, вы также должны убедиться, что установили соответствующие заголовки Expires, Etag и Cache-Control, т.е. вы должны знать, когда истекает срок действия файла, иначе вы не получите никаких преимуществ от кэширования.

Перенесите кэш на внешний диск

Разместите кэш на отдельном физическом диске, чтобы обеспечить быстрый доступ без замедления других процессов. Твердотельный диск обеспечивает самое быстрое время доступа.

Тестирование и перезапуск Apache

После сохранения файла обязательно выполните проверку конфигурации перед перезапуском Apache. Этот тест анализирует конфигурационные файлы и либо сообщает Syntax Ok, либо предлагает информацию о конкретной синтаксической ошибке.

или

Для перезапуска Apache введите:

Apache2Buddy

Apache2Buddy - это скрипт, похожий на MySQLTuner, который проверяет настройки Apache и делает предложения на основе памяти процесса Apache и общей оперативной памяти. Скрипт apache2buddy.pl проверяет следующее:

  • Ограничения памяти PHP
  • Memcache
  • MaxClients
  • Использование памяти
  • Максимальное потенциальное использование памяти
  • Процент от общего объема оперативной памяти, выделенной для Apache
  • MaxRequestWorkers

Вы можете запустить скрипт с помощью следующей команды:

ApacheBench

Apache Bench (ab) - это инструмент нагрузочного тестирования и бенчмаркинга, предназначенный для установки веб-сервера Apache (хотя он без проблем работает на любом HTTP-сервере, например, nginx).

Чтобы установить ab, выполните следующие команды:

CentOS/Fedora

Debian/Ubuntu

Синтаксис

чтобы проверить свой сервер, введите команду ниже, заменив yourdomain на имя вашего домена.

Запуск ApacheBench аналогичен направлению атаки типа "отказ в обслуживании" на ваш собственный сервер. Этот инструмент не рассчитан на то, чтобы быть отзывчивым к вашей инфраструктуре, и не предоставляет возможности увеличивать параллельность в измеряемых интервалах в течение периода тестирования.

Единственный вариант при проведении нагрузочного теста с помощью ab - залить веб-сервер произвольным количеством одновременных запросов в один момент.

Необязательные флаги

  • -n [значение]: Количество отправляемых запросов
  • -t [значение]: Продолжительность в секундах, в течение которой каждое соединение будет "живым".
  • -c [значение]: Количество одновременных запросов
  • -l: игнорировать проверку длины
  • -v 2: будет выводить тело и заголовок каждого ответа в stdout, чтобы вы могли определить успех или неудачу.
  • -k: HTTP Keep-Alive

Имейте в виду, что если вы используете флаги -t и -n, флаг -t всегда должен быть первым.

Инструменты бенчмаркинга

Некоторые дополнительные инструменты бенчмаркинга для веб-серверов HTTP.

SIEGE

Утилита нагрузочного тестирования HTTP, поддерживаемая в UNIX. Вы можете проверить несколько URL, создав текстовый файл для нагрузочного теста.

Установка

синтаксис

Необязательные флаги

  • -q: работать тихо (не показывать детали запроса)
  • -t: работать в течение 5 секунд
  • -c: 500 одновременных запросов

Gobench

Утилита нагрузочного тестирования для оценки производительности веб-сервера, написанная на языке Go. Поддерживает более 20 000 одновременных пользователей.

Apache JMeter

Один из самых популярных инструментов с открытым исходным кодом для измерения производительности веб-приложений. JMeter - это приложение на базе java. Оно поддерживает не только веб-серверы, но и позволяет оценивать производительность PHP, Java. ASP.net, SOAP, REST и т.д. ...

wrk

С помощью wrk вы можете указать запуск нагрузочного теста с определенным количеством потоков.

синтаксис

Необязательные флаги

  • -d: тестирование в течение 2 минут (120 секунд)
  • -t: 4 потока
  • -c: 100 одновременных пользователей

HTTPLoad

Httpload может считывать несколько URL из текстовых файлов, или вы можете указать их в аргументе команды. Httpload поддерживает шифрование SSL/TLS, что означает, что у вас есть возможность запрашивать веб-страницы с поддержкой HTTPS (SSL).

синтаксис

httperf

синтаксис

Понравилась статья? Поделиться с друзьями:
Добавить комментарий