Настройка httpd.conf на VPS под Unix Apache.

Рубрика: Интернет штучки

27 марта 2009

nastrojka-httpdconf-na-vps-pod-unix-apache-pic1Обычно после покупки VPS наступает период эйфории – много ресурсов, много возможностей, по сравнению с виртуальным хостингом все работает быстро и хорошо. Но через некоторое время, по мере роста сайта, возникают проблемы. Чаще всего они выражены в нехватке оперативной памяти, либо в низкой скорости отклика сайта на действия пользователей. Не стоит сразу переходить на более высокий тариф, можно попробовать настроить Apache под свои нужды.

Для настройки нам понадобится файл httpd.conf, который расположен тут – etc/httpd/conf/.

Открываем – смотрим – видим:

# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to “Off” to deactivate.
#
KeepAlive off

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15

##
## Server-Pool Size Regulation (MPM specific)
##

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers    5
ServerLimit       10
MaxClients        10
MaxRequestsPerChild  4000
</IfModule>

Разберем по-порядку настройки.

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

MaxKeepAliveRequests – количество запросов в 1 соединении.

KeepAliveTimeout – Время жизни (в секундах) соединения. При больших значениях сервер не закрывает процесс слишком долго и он висит бесполезно занимая часть ресурсов.

Мы подошли к настройке MPM (модуль многопоточной обработки). В apache любой запрос обрабатывается в процессе или потоке. За многопоточность как раз и отвечает MPM. При установке сервера можно выбрать один из нескольких модулей. Почему prefork MPM, а не worker MPM? По умолчанию для unix используется именно prefork, но на всякий случай можно выполнить через SSH – подключение команду ‘httpd -V‘. В моем случае ответ – Server MPM: prefork. Работает prefork следующим образом – модуль создает несколько дочерних процессов, при этом в каждом процессе только один поток. В отличае от worker, который обрабатывает несколько потоков на процесс, prefork потребляет больше ресурсов, но более стабилен. В основном этим и обусловлен выбор, хотя многие считают, что worker работает быстрее.

Переходим непосредственно к настройке.

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

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

MaxSpareServers – задает максимально число неиспользуемых дочерних процессов, которые ожидают в готовности принят запрос. Опять же, если создано много дополнительных процессов, то система будет нагружаться сильно даже при минимальном количестве клиентов.

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

ServerLimit – эта директива устанавливает максимальное значение MaxClients. Рекомендуется устанавливать это значение равным значению в директиве Maxclients.

MaxClients - следует обратить внимание, что это самый важный параметр настройки Prefork MPM. Директива устанавливает максимальное количество параллельных процессов, создаваемых для обработки запросов. Чем больше значение, тем больше одновременно может быть обработано запросов и тем больше будет израсходовано памяти. При использовании динамических страниц с PHP на процесс может быть выделено 16-32МБ. Чтобы определить точнее необходимо через SSH-соединение выполнить команду ‘ps -ylC httpd –sort:rss‘ (между y и С находится строчная буква L!, а перед sort 2 минуса). На выходе мы получим табличку, где в колонке RSS и будут находится искомые значения занятой памяти, для получения значений в мегабайтах их нужно разделить на 1024. Для получения общей информации о памяти можно выполнить команду ‘free -m‘. Теперь можно рассчитать примерное значение самого параметра по любой из формул:

MaxClients ≈ (RAM – размер_загруженных_приложений)/(размер_процесса), либо
MaxClients ≈RAM* 70% / Max_размер_памяти_под_процесс.

Вторая формула чисто эмпирическая, и менее точная, расход памяти приложениями сервера заложен в 30% и, в зависимости от настроек, цифра может меняться в любую сторону. Полученное значение еще не гарантирует правильную работу сервера, следует понаблюдать некоторое время за распределением ресурсов. В случае если параметр установлен ниже оптимального значения, сервер под нагрузкой обслуживает MaxClients запросов, при этом память еще свободна, а следующие запросы уже отправляются в очередь, что приводит к замедлению работы сайта. Если же наоборот значение слишком высоко вся память будет занята, система залезет на диск и это приведет к резкому замедлению работы. Для оценки можно воспользоваться командой ‘top -p 30′ вверху можно будет увидеть значения памяти и загрузку процессора.

MaxRequestsPerChild – задает количество запросов, которые может обработать дочерний процесс до перезапуска. Значение должно быть достаточно большим, чтобы все время не создавать новые процессы. Но рекомендуется все же его ограничить (0 – неограниченно), чтобы при длительной работе Apache, в случае “утечки памяти”, процесс был принудительно завершен.

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

Статьи по теме

14 комментариев к статье: Настройка httpd.conf на VPS под Unix Apache.

Avatar

SeoMazzi

27 мая 2009 в 15:09

Вот сейчас как раз курю тему конфигов. Настроил nginx как frontend server? Как-то мало спасает хотя лучше стало.

Вопрос как много сайтов можно держать на оперативке равной в 128 метров, учитывая, что трафика на на них почти нет (max 10 уников), но каждый из них конектитсо к mysql?

Avatar

SeoMazzi

27 мая 2009 в 15:25

ps -ylC httpd -sort:rss
У меня sort только с двумя минусами работает

ps -ylC httpd –sort:rss

Avatar

xela

28 мая 2009 в 11:22

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

Avatar

xela

28 мая 2009 в 11:37

Минусов там 2, просто сливается. На всякий добавил в описание, чтобы не путались.

Avatar

tim71

24 декабря 2009 в 23:01

Спасибо. Настроил vds длагодоря статье. Полез искать от того что тормозить стало ужасно и в конце концов в пик (100-120 хостов одновременно) сервер умирал.
Поставил KeepAliveTimeout 1
StartServers 2
MinSpareServers 3
MaxSpareServers 5
ServerLimit 20
MaxClients 20
(1200 мгц, 400 рам)

На вдс 15 сайтов, с 50-200 хостов сутки, и 1 сайт с 4500-5000 хостов.
Сейчас (самый пик) общее по сайтам одновременно примерно 100 человек
проц 71% память примерно 70-75%, посравнению с тем что было – сайты летают )
при 60-70 одновременно посетителях время загрузки страницы (на большом сайте на dle) было 1200мс сейчас в районе 180-250
Стоит чтото еще подстраивать или показатели в норме? :)

(просто я в этом еще лол, раньше пользовался только вирт хостингом, так что особо на меня не кричите :) )

Avatar

xela

25 декабря 2009 в 9:02

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

Avatar

tik

31 января 2010 в 1:37

Приветствую всех.
Статья полезная, все доступно.
Мучает один вопрос:
поставил в конфиге
ServerLimit 30
MaxClients 30
НО,
ps aux | grep httpd |wc -l
127
Как такое может быть если они ограничены ?

Avatar

xela

31 января 2010 в 8:16

Сервер перегружали, в этом файле настройки продублировали /etc/httpd/conf.d/swtune.conf, настраивали правильную секцию?

Avatar

tik

31 января 2010 в 17:54

Дело в том, что апач собирался из исходников и конфиг один /usr/local/apache2/conf/httpd.conf
Серв не ребутили, только апач.
Собстенно теперь проребутил серв – вылезла ошибка:
root:~# /usr/local/apache2/bin/apachectl restart
WARNING: MaxClients of 250 exceeds ServerLimit value of 20 servers,
lowering MaxClients to 20. To increase, please see the ServerLimit
directive.
Собственно видно, что апач читает конфиг в правильном месте, но считывает 250 откуда-то…
Всё, нашёл, оказывается настройки для префорка у меня подгружались отдельным конф файлом.
Теперь (основываясь на первых 3-х минутах работы) создаётся не более 135ух хттпд-ов(в конфе 130 маклиентс + 5 макспаресерверс).

Насчёт
ServerLimit и MaxClients:
на сайтах с посещаемостью с 5к+ лучше ставить эти параметры в ранние трёх-значные числа(100-150). Ну если конечно не хотите чтобы пользовтаели загружали Ваш сайт мин 5 ;)
Автору спс за статью, с её помощью сбалансировал нагрузку на проц, озу, а главное на диск(теперь ва максимум до 70% прыгает).

Avatar

xela

31 января 2010 в 20:19

Хорошо, что помогла, удачи.

Avatar

DESCONECT

11 июня 2010 в 20:57

Здравствуйте у меня такая проблемам httpd едать 120 метров это раз
Второе я поставил StartServers 5
MinSpareServers 2
MaxSpareServers 10

MaxClients 32
MaxRequestsPerChild 512
У меня в течениии нескольких секунд после рестарт запущенно 33 демона апатча.
Для эксперимента ставил 64 и 128 параметр MaxClients одинаково в течении короткого промежутка времени сразу запускаются все.

По поводу первого я как бы новенький в администрировании но судя по запущеным модулям пхп такой объем не должен быть по прикидкам гдето порядка 30 метров на демона должно быть.
По второму случаю также не совсем ясно почему стратуют сразу все демоны.
Так и должно быть или что то нужно править.
Сервер работает без сбоев пользователи нежалются но меня беспокоит такой расход памяти и как бы куда столько пользователей в сутки около 500-800 больше нету.

Куда вы посоветуете обратить моее внимание ??? или это норма и беспокоиться не следует. Да нумдикс пока не запущен думаю пока нету в нем смысла (или всеже есть ??).

Avatar

xela

12 июня 2010 в 23:07

120 метров оперативки это еще не придел для апача. На мой взгляд все нормально, KeepAlive у вас включен?

Avatar

DESCONECT

13 июня 2010 в 20:34

120 метров это один демон httpd . А их сразу запускается штук 34 таких ореликов :)
Как найти функцию KeepAlive у апатча 2 ?? в конфиге не могу найти :(

Avatar

xela

24 июня 2010 в 17:22

DESCONECT, 120 на каждый – это слишком круто, что-то в настройках неверно. KeepAlive в httpd.conf должен быть, немного раньше, чем основные настройки.

Оставить комментарий к статье: Настройка httpd.conf на VPS под Unix Apache.

Хочу попросить вас ответить на несколько вопросов по развитию этого сайта в статье "Тысяча есть!". Всего несколько минут вашего времени помогут сделать этот сайт еще интереснее.

Музыкальная пауза


Скачайте флэш-плеер