HPUNIX Сайт о ОС и не только!

Оптимизация производительности Apache

14 мая 2009 - unix
Оптимизация производительности Apache

Apache Server


Apache — популярный веб-сервер в интернет, он обслуживает неограниченное количество серверов и сайтов. Часто возникает необходимость прирастить производительность веб-сервера. Наверное лучший способ это сделать — перейти к схеме frontend+backend, но это может потребовать достаточно грозных конфигураций в приложении (например, у вас наверняка отвалятся всяческие индикаторы прогресса аплоада файлов
:)
.
Другой способ — просто прирастить производительность сервера — поставить более быстрый процессор и больше памяти.
Да и 1-ое и 2-ое просит много времени и ресурсов, так что на 1-ое время можно испытать ускорить apache способом оптимизации его конфигурации. Есть оптимизации, которые можно применить только при пересборке apache, другие же можно использовать без перекомпиляции сервера.

Загружайте только нужные модули

Оптимизация производительности Apache

Apache — модульная программа, большая часть функций которой реализуется в модулях. При всем этом эти модули могут быть как вкомпилированы, так и собраны в виде DSO — динамических библиотеках. Большая часть современных дистрибутивов поставляет apache с набором DSO, так что не нужные модули можно просто отключить без перекомпиляции.
Запускайте apache только с необходимыми модулями, чтобы уменьшить потребление памяти. Если вы решили скомпилировать apache без помощи других, то либо тщательно подходите к выбору списка модулей, которые вы включите, либо компилируйте их как DSO используя apxs в apache1 и apxs2 в apache2.

Для того чтобы отключить ненужные DSO-модули, достаточно закомментировать лишние строчки LoadModule в httpd.conf. Apache со статически скомпилированными модулями будет потреблять чуть меньше памяти, но для вас придется каждый раз его перекомпилировать для конфигурации списка модулей.

Выберете подходящий MPM

В apache каждый запрос обрабатывается в своем процессе или потоке. При компиляции apache позволяет выбирать один из нескольким MPM (Multi-processing module), которые отвечают за прослушивание портов, прием запросов и раздачу этих запросов дочерним процессам или потокам, в каких эти запросы будут обработаны.
Выбор MPM зависит от нескольких обстоятельств, таких как наличие поддержки потоков в ОС, количества свободной памяти, также требований стабильности и безопасности.
Если безопасность очень принципна, следует выбрать peruser MPM, пожертвовав производительностью.
Если принципна непосредственно производительность, то выбор ограничивается 2-мя mpm: prefork и worker.
Worker - поточный MPM, т.е. в нем каждый запрос обслуживается в отдельном потоке 1-го из дочерних процессов. Потоки — более легкие для ОС объекты, чем процессы, они более отлично употребляют память и переключения контекста для их происходят быстрее. Но, из-за того что каждый поток имеет доступ ко всей памяти процесса, worker mpm более подвержен сбоям: сбой 1-го потока может повлечь падение всего процесса, в каком находился этот поток (именно поэтому worker mpm запускает несколько дочерних процессов с несколькими потоками в каждом).

Perfork - mpm употребляет несколько дочерних процессов, каждый дочерний процесс обрабатывает одно подключение. Из-за того что процесс — более тяжелая структура, он употребляет малость больше ресурсов, зато он менее подвержен сбоям — обработка каждого отдельного запроса не зависит от других процессов.
К огорчению, для смены mpm требуется перекомпиляция apache. Тут проявляют свои плюсы source-based дистрибутивы: вы можете просто перекомпилировать apache и все зависимые от него пакеты, не превратив систему в свалку. Бинарные дистрибутивы выходят из этой ситуации по-разному.

Например в RHEL в apache rpm находится слету две версии apache — с worker и prefork mpm (prefork употребляется по умолчанию). Но worker mpm не поддерживает php. Так что если вы желаете php и worker mpm для вас придется компилировать его без помощи других либо отыскивать посторонние репозитории.

DNS lookup

Директива HostnameLookups включает reverse DNS запросы, так что в логи будут попадать dns-хосты клиентов вместо ip-адресов. Разумеется, что это существенно замедляет обработку запроса, т.к. запрос не обрабатывается пока не будет получит ответ от DNS-сервера. Поэтому смотрите чтобы эта директива всегда была выключена (HostnameLookups Off), а если для вас все-таки нужны dns-адреса, вы можете узнать их позже, прогнав лог в утилите logresolve (которая поставляется с apache).
Не считая того, смотрите чтобы в директивах Allow from и Deny From использовались ip-адреса а не доменные имена. По другому apache будет делать два dns запроса (обратный и прямой) чтобы убедиться что клиент-тот за кого себя выдает.

Встреча BAFPUG 2011-11-05

AllowOverride

Если директива AllowOverride не установлена в ‘None’, apache будет пробовать открыть .htaccess файлы в каждой директории которую он посещает и во всех директориях выше нее. Например:

DocumentRoot /var/www/html <Directory /var/www/html/> AllowOverride all </Directory>

Если будет запрошен /index.html, apache попробует открыть (и интерпретировать) файлы /.htaccess, /var/.htaccess, /var/www/.htaccess, и /var/www/html/.htaccess. Это увеличивает время обработки запроса. Так что, если для вас нужен .htaccess только для одной директории, разрешайте его только для нее:

DocumentRoot /var/www/html <Directory /> AllowOverride None </Directory> <Directory /var/www/html/> AllowOverride all </Directory>

FollowSymLinks и SymLinksIfOwnerMatch

Оптимизация производительности Apache

Если для директории включена функция FollowSymLinks, сервер будет следовать по символическим ссылкам в этой директории. Если для директории включена функция SymLinksIfOwnerMatch, apache будет следовать по символическим ссылкам только если владелец файла или директории, на которую указывает эта ссылка совпадает с владельцем обозначенной директории. Так что при включенной функции SymLinksIfOwnerMatch apache делает больше системных запросов.
Не считая того, дополнительные системные запросы требуются когда FollowSymlinks НЕ УСТАНОВЛЕН. Т.о. более наилучшая ситуация для производительности — когда функция FollowSymlinks включена.

Content Negotiatio

Пытайтесь избегать content negotiaion.

MaxClients

Директива MaxClients устанавливает наибольшее количество параллельных запросов, которые будет поддерживать сервер. Apache не будет порождать больше процессов/потоков чем MaxClients.

Значение MaxClient не долно быть очень маленьким (по другому много клиентов останутся необслуженными), ну и не стоит устанавливать очень неограниченное количество — лучше не обслужить часть клиентов чем исчерпать все ресурсы, залезть в своп и умереть под нагрузкой. Хорошим может быть значение MaxClients = количество памяти выделенное под веб-сервер / больший размер порожденного процесса или потока. Для статических файлов apache употребляет около 2-3 Мб на процесс, для динамики (php, cgi) — зависит от скрипта, но обычно около 16-32 Мб.

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

MinSpareServers, MaxSpareServers, и StartServers

Т.к. создание потока, и в особенности процесса — дорогая операция, apache делает их заранее. Директивы MaxSpareServers и MinSpareServers устанавливают как много процессов/потоков должны ожидать в готовности принять запрос (максимум и минимум).

Если значение MinSpareServers очень наимельчайшее и в один момент приходит много запросов, apache должен будет создавать много новых процессов/потоков, что создаст дополнительную нагрузку в этой стрессовой ситуации. С другой стороны, если MaxSpareServers очень велико, apache будет очень нагружать систему этими процессами, даже если количество клиентов не много.
Постарайтесь установить такие MinSpareServers и MaxSpareServers, чтобы apache не создавал более Четыре процессов/потоков в секунду. Если он создаст более 4, в ErrorLog будет помещено сообщение об этом. Это — сигнал того что MinSpareServers очень не довольно.

MaxRequestsPerChild

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

Рекомендую установить MaxRequestsPerChild равное какому-нибудь достаточно большому числу (несколько тысяч). Это не создаст излишней нагрузки, связаной с тем что apache будет должен создавать новые дочерние процессы, в то же время это поможет избавиться от заморочек с утечкой памяти в дочерних процессах (что очень может быть например если вы используете нестабильную версию php).

KeepAlive и KeepAliveTimeout

KeepAlive позволяет делать несколько запросов в одном TCP-подключении. Это в особенности полезно для html-страниц с множеством изображений.

Если KeepAlive установлен в Off, то для самой страницы и для каждого изображения будет создано отдельное подключение (которое нужно будет обработать master-процессу), что плохо и для сервера и для клиента. Так что для похожих случаев рекомендуется устанавливать KeepAlive в On.

Для других применений (например для download-сервера) KeepAlive может быть бесполезен и даже вреден, т.к. при включенном KeepAlive сервер закрывает соединение не слету, а ждет KeepAliveTimeout секунд нового запроса. Для того чтобы процессы не висели очень продолжительно в бесполезном ожидании, устанавливайте KeepAliveTimeout достаточно малым, около 5-10 секунд обычно достаточно.

Сжатие

HTTP-сжатие было определено в образце HTTP/1.1, и сейчас все современные клиентские программы и практически все сервера его поддерживают. Сервер может отдавать ответ в gzip или deflate, а клиентская программа незаметно для пользователя разжимает данные. Это уменьшает количество передаваемого трафика (до 75%), но естественно наращивает внедрение процессора.
Но если ваш сервер посещает много клиентов с медленным подключение, сжатие может снизить нагрузку с вашего сервера из-за того что сервер сможет быстрее передать сжатый ответ и вызволить ресурсы, занятые дочерним процессом. В особенности очень этот эффект может быть заметен если у вас быстрый процессор, но не довольно памяти.
Кеширование меняется директивами модуля mod_deflate. Имейте в виду, что не следует устанавливать степень сжатия gzip более 4-5 — это потребует существенно большего времени CPU, а эффект будет достаточно невелик. Ну и разумеется не нужно пробовать сжать изображения в jpg, gif и png, музыку, видео файлы и все другие бинарные файлы, которые уже и так отлично сжаты.

Кеширование на стороне клиента

Оптимизация производительности Apache

Не забывайте устанавливать Expires заглавия на статические файлы (см. модуль mod_expires). Если файл не изменяется, то его всегда следует испытать закешировать на клиенте. Тогда у клиента будут быстрее загружаться страницы, а сервер освободится от лишних запросов.

Отменная статья, перепечатал с сайта Highload Web.

Читаем еще:

  • Скрипт для оптимизация производительности Mysql
  • AWStats анализатор логов для статистики
  • FTP сервер на базе vsftpd и MySQL в Debian (Ubuntu)
  • Внедрение mod_macro для конфигурации виртуальных хостов Apache
  • Проверка Linux сервер на предмет взлома

Похожие статьи

  • Скрипт для оптимизации Mysql

    Скрипт, который может в выявлении проблемных мест конфигурации сервера mysql, и даст полезные советы по оптимизации. Скрипт написанный на языке perl и не просит установки. Его просто нужно ск...

  • Внедрение mod_macro для конфигурации виртуальных хостов Apache

    Лёгкое добавление новых виртуальных хостов в apache, в чём нам поможет модуль mod_macro.Установка для debian ubuntu mod_macro и включения.$ sudo apt-get install libapache2-mod-macro$ sudo a2enmod...

  • Установка и настройка сервера на базе Debian

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

  • SSH для обыденных смертных

    В сети много документов по настройке удалённого управления в Линукс и БСД-системах, но часто в их умалчиваются простые (после прокуривания мануалов и гуглежа) вещи. Непосредственно о их я расскаж...

  • Rsync утилита для быстрого удаленного или локального копирования файлов

    Rsync разработан для замены rcp – старенькой программы для удаленного копирования под Unix. Благодаря широким возможностям синхронизации и передачи файлов, rsync часто применяется для сотворения з...

Теги: ос
Рейтинг: +9 Голосов: 135 1561 просмотр
Комментарии (0)

Нет комментариев. Ваш будет первым!

Найти на сайте: параметры поиска

Windows 7

Среда Windows 7 на первых порах кажется весьма непривычной для многих.

Windows 8

Если резюмировать все выступления Microsoft на конференции Build 2013.

Windows XP

Если Windows не может корректно завершить работу, в большинстве случаев это

Windows Vista

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