Оптимизация Apache

Сегодня я расскажу о том, как сделать Apache немного быстрее. Кто-то спросит — «зачем?.. есть же более быстрые решения!»….
Таким товарищам я отвечу что да, есть, что они быстрее, например на одной жестяной банке я использую связку Apache+Nginx (даже писал об этом), можно использовать Nginx с модулем FastCGI.. И об этом я напишу, не в этой статье, но напишу..

Но сейчас речь пойдет о том, как сделать Apache немного быстрее, адекватнее и безопаснее. Картинка, тег «more» и пошла статья…

Оптимизация Apache

Модули в Apache

Первое, самое основное, что-то типа «спасибо-кэп» — Apache нужно запускать с необходимыми модулями, чтобы уменьшить потребление памяти.

Для их отключения можно воспользоваться командами a2dismod <имя_модуля> а потом перезапустить конфигурацию сервера. Если вы отключите что-то не то, то включить модуль можно командой a2enmod <имя_модуля>. Опять же смотрите что отключайте, иначе какие-то функции ваших проектов могут перестать работать.

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

mod_alias
mod_authz_host
mod_deflate
mod_dir
mod_expires
mod_headers
mod_mime
mod_rewrite
mod_log_config
mod_autoindex
mod_negotiation
mod_setenvif

Подходящий MPM

В apache каждый запрос обрабатывается в своем процессе или потоке. При компиляции apache позволяет выбирать один из нескольким MPM (Multi-processing module), которые отвечают за прослушивание портов, прием запросов и раздачу этих запросов дочерним процессам или потокам, в которых эти запросы будут обработаны.

Если безопасность важна — выбирайте peruser MPM. Если важна производительность, то выбирайте prework или worker.

  • Worker — поточный MPM, т.е. в нем каждый запрос обслуживается в отдельном потоке одного из дочерних процессов. Потоки — более легкие для ОС объекты, чем процессы, они более эффективно используют память и переключения контекста для них происходят быстрее. Однако, из-за того что каждый поток имеет доступ ко всей памяти процесса, worker mpm более подвержен сбоям: сбой одного потока может повлечь падение всего процесса, в котором находился этот поток (именно поэтому worker mpm запускает несколько дочерних процессов с несколькими потоками в каждом).
  • Perfork — mpm использует несколько дочерних процессов, каждый дочерний процесс обрабатывает одно подключение. Из-за того что процесс — более тяжелая структура, он использует немного больше ресурсов, зато он менее подвержен сбоям — обработка каждого отдельного запроса не зависит от других процессов.

По мне так Worker — самый оптимальный вариант.

Чтобы узнать какой у вас MPM сейчас работает, есть два способа, первый — получить список модулей с помощью apachectrl (для CentOS):

apachectl -t -D DUMP_MODULES

Это пример для Debian систем:

apache2ctl -t -D DUMP_MODULES

Второй способ посмотреть подробную информацию о версии Apache. На CentOS:

httpd -V

На Debian:

apache2 -V

… далее там будет строка Server MPM..

Для смены MPM на некоторых ОС потребуется перекомпиляция apache, или установка соответствующего пакета apache (apache2-mpm-event, apache2-mpm-prefork, apache2-mpm-itk, apache2-mpm-worker).

В CentOS системах достаточно будет просто раскомментировать в файле /etc/sysconfig/httpd строку

HTTPD=/usr/sbin/httpd.worker

и перезагрузить apache…

DNS запросы

HostnameLookups — это директива, которая включает reverse DNS запросы, в результате в логи, вместо IP адресов будут попадать dns хосты. Эта директива будет тормозить запрос, пока не последует ответа от DNS сервера.

Поэтому в конфиг файле эта директива должна быть отключена: HostnameLookups Off

Если вам так необходимы dns адреса — пользуйтесь logresolve.

Так же убедитесь в том, что в директивах Allow from и Deny from использовались IP адреса, так как apache будет делать два запроса, чтобы убедиться в том что клиент — тот за кого себя выдает.

Content Negotiation

Если вам не Требуется, чтобы Apache
автоматически распознавал язык каждого посетителя и выдавал страницы на со ответствующем языке, то отключите данный модуль: a2dismod negotiation

Что такое Content Negotiation можно зачитать, например тут: http://adminbook.ru/index.php?men2=4-1/296

FollowSymLinks и SymLinksIfOwnerMatch

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

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

AllowOverride

Если директива AllowOverride не установлена в ‘None’, Apache будет искать файл .htaccess в каждой директории, которую он посещает. Вот пример:

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

Если будет запрошен файл /index.php, Apache будет пытаться открыть файлы /.htaccess, /var/.htaccess, /var/www/.htaccess, и /var/www/html/.htaccess, что увеличивает время запроса. Поэтому, если вам необходим этот файл только для одной директории, то включайте эту директиву только для нее:

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

MaxClients

Данная директива устанавливает максимальное количество запросов, которое будет обслуживать Apache. MaxCliets не должно быть много.  Значение выставляется большим, чтобы обрабатывать одновременно много запросов, а меньшим для снижения потребления памяти!

MinSpareServers, MaxSpareServers, и StartServers

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

Устанавливайте такие MinSpareServers и MaxSpareServers, чтобы apache не создавал более 4 процессов/потоков в секунду. Если он создаст более 4, в ErrorLog будет помещено сообщение об этом, что будет говорить о том что MinSpareServers слишком мало.

MaxRequestsPerChild

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

KeepAlive и KeepAliveTimeout

KeepAlive позволяет делать несколько запросов в одном TCP-подключении, что полезно для страниц с большим количеством изображений. Поэтому включайте KeepAlive и чтобы процессы не висели бесполезно ставьте KeepAliveTimeout в 5-10 секунд.

Пока это все. Возможно статья будет дополняться.

Ссылки/источники: