Оптимизация Apache
Сегодня я расскажу о том, как сделать Apache немного быстрее. Кто-то спросит — «зачем?.. есть же более быстрые решения!»….
Таким товарищам я отвечу что да, есть, что они быстрее, например на одной жестяной банке я использую связку Apache+Nginx (даже писал об этом), можно использовать Nginx с модулем FastCGI.. И об этом я напишу, не в этой статье, но напишу..
Но сейчас речь пойдет о том, как сделать Apache немного быстрее, адекватнее и безопаснее. Картинка, тег «more» и пошла статья…
Модули в 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 секунд.
Пока это все. Возможно статья будет дополняться.
Ссылки/источники:
- http://linuxgazette.net/123/vishnu.html
- http://blog-ru.greenmice.info/2009/02/apache.html
- https://memoryhigh.ru/apache-mpm-itk-ispmanager/
- http://www.salex.ru/book/book.php?httpd_prefork
- https://www.ibm.com/developerworks/ru/library/l-tune-lamp…
- https://www.it-rem.ru/kak-uznat-kakoy-mpm-…
- https://ruhighload.com/index.php/2009/05/27/…
- https://www.opennet.ru/base/net/apache_tune.txt.html