Оптимизация работы apache на Gentoo Linux

Буквально вчера вечером передо мной встала именно такая задача, при чём не то что-то супер тюнинг слабой машины на сверх посещаемом веб-сайте — а машина была довольно приличная, просто веб-сервер был настроен как попало — по принципу — чтобы Сайт отображался, а на остальное насрать. И при таком раскладе — каждый час приходилось пере запускать apache (то есть он просто вис, фактический при малейшей нагрузки).
Сервер давно мой, правда настраивал его не я. И вот сейчас дошли руки и до этой машины.

 Оптимизация работы apache в gentoo linux


После просмотра httpd.conf выяснилось, что ни каких директив в нём не прописано, только подгружаются модули и виртуал-хосты.
При том не использовался не один MPM (Multi-processing module). Что, соответственно уже являлось одной из главных причин зависания apache. Так как настраивал я отдельный сервер,а не VDS/VPS то лучшем вариантом MPM для меня стал mpm-prefork (при mpm-prefork используется несколько дочерних процессов и каждый дочерний процесс обрабатывает одно подключение).
Посмотреть с каким MPM собран Ваш apache вы можете командой:

 emerge -pv apache2

У меня не был использован не один mpm. То есть мне нужно было пересобрать apache с модулем mpm-prefork. Поступаем так:

APACHE2_MPMS="prefork" emerge -av apache

И чтобы в следующий раз не прописывать APACHE2_MPMS=»prefork»:

echo "APACHE2_MPMS=\"prefork\"" >> /etc/make.conf

Если у Вас установлен другой модуль, например mpm-worker, а Вы хотите использовать prefork — то Вам так же придётся пересобрать apache, что к счастью в нашем любимом gentoo делается на Ура, и чаще всего, без последствий (после пересборки — Ваши config файлы сохраняются)

После того как пересобрали apache, переходим к редактированию httpd.conf. Вообще, даже только-что установленный apache имеет практический готовый к работе конфиг — Вам лишь остаётся прописать virtual hosts. Но, как я писал выше, мой конфиг, по не понятным мне причинам ничего стандартного не содержал. Так, что в конце httpd.conf мне пришлось дописать все параметры:

#My config
HostnameLookups Off
TimeOut  300
KeepAlive  On
MaxKeepAliveRequests  100
KeepAliveTimeout  15
 
     StartServers       5
     MinSpareServers    5
     MaxSpareServers    10
     ServerLimit        256
     MaxClients         256
     MaxRequestsPerChild        10000

Теперь разберём, за что отвечает каждая директива:
HostnameLookups off — Директива HostnameLookups включает reverse DNS запросы, так, что в логи попадают dns-имена клиентов вместо ip-адресов. Это замедляет обработку запроса, так как запрос не обрабатывается пока не будет получен ответ от DNS-сервера. Рекомендуется эту директиву отключить.

TimeOut 300 (по умолчанию)
Время ожидания (в секундах), прежде чем попытки приема или отправления выдают сообщение о тайм-ауте.

KeepAlive On (по умолчанию)
Допускаются ли персистентные соединения. Для запрета укажите Off.

MaxKeepAliveRequests 100(по умолчанию)
Максимальное количество запросов при одном персистентном соединении.
Значение 0 снимает ограничения (разрешено неограниченное количество запросов).
Для максимального быстродействия рекомендуется высокое значение.

KeepAliveTimeout 15(по умолчанию)
Время ожидания (в секундах) следующего запроса от того же клиента в рамках одного персистентного соединения.

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

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

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

ServerLimit 256
Для prefork MPM эта директива устанавливает максимальное значение MaxClients на протяжении всей жизни процесса сервера Apache.
Используя эту директиву будьте особенно осторожны!
Если значение ServerLimit установить намного выше необходимого, то свободная совместно используемая память будет занята (ассигнована, allocated).

Если ServerLimit и MaxClients установить выше, чем система может обрабатывать, то Apache может не запустится или система станет нестабильной. Используйте эту директиву с prefork MPM, только если Вы хотите установить MaxClients выше чем 256 (default).
Не устанавливайте значение этой директивы ни на сколько выше чем значение, установленное в MaxClients.
У ServerLimit предельное значение 20000, даже, если указать больше (для избежания нежелательных эффектов, вызванных опечатками).

MaxClients 256
Это самый важный параметр prefork MPM, задающий максимальное число дочерних процессов, которым разрешено запустится (которые будут созданы для обработки запросов).
Значение выставляется большим, чтобы обрабатывать одновременно много запросов, а меньшим для снижения потребления памяти!
Сколько Вы укажите в этой диррективе, столько и будет у Вас процессов вставать в очередь на выполнение.

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

После того, как я хоть как-то настроил работу apache, потребление памяти сократилось на 40% . До этого все 2 гигабайта забивались и сервер «вставал». Теперь значение потребляемой памяти колеблется от 1гб до 1,5гб — в зависимости от загрузки. Сайт стал работать лучше, сервер перестал виснуть, быстродействие явно улучшилось. Но это не конец, впереди оптимизация Mysql.

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

В разрешении этой задачи мне помогли статьи:

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>