5 советов по повышению производительности веб-сервера Apache

Apache

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

Кроме того, Apache продолжает демонстрировать наибольший рост среди ведущих веб-серверов, за которым следуют Nginx и IIS. Таким образом, если вы являетесь системным администратором, отвечающим за управление установками Apache, вам необходимо знать, как обеспечить максимальную производительность вашего веб-сервера в соответствии с вашими потребностями (или потребностями вашего клиента).

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

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

 

СОВЕТ № 1: Всегда обновляйте Apache до последней версии

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

Однако может быть недавнее улучшение или исправление ошибки, которая была добавлена ​​к недавно выпущенной стабильной версии, которая затем становится доступной для загрузки и установки из исходного кода. Здесь также представлены инструкции по компиляции и установке — просто помните, что если вы выберете этот метод обновления, вы можете сделать резервную копию ваших текущих файлов конфигурации / сайтов / виртуальных хостов в качестве меры предосторожности.

В любом случае вы можете проверить установленную на данный момент версию следующим образом:

# httpd -v [On RedHat/CentOS based systems]
# apache2 –v [On Debian/Ubuntu based systems] 

 

Check-Apache-Version

 

Как правило, придерживайтесь метода обновления, предоставляемого менеджером пакетов выбранного вами дистрибутива (yum update httpd или aptitude safe-upgrade apache2, for CentOS or Debian, соответственно), если нет другого пути. Вы можете прочитать последние заметки о выпуске в разделе документации Apache на веб-сайте проекта HTTP-сервера Apache.

 

СОВЕТ № 2: Если вы используете ядро старше 2.4, рассмотрите возможность обновления

Зачем? В версиях ядра 2.4 и выше системный вызов ядра sendfile включен по умолчанию. Это, в свою очередь, облегчает высокопроизводительную сетевую передачу файлов (что желательно в контексте обмена данными между веб-сервером и клиентом) и позволяет Apache доставлять статический контент быстрее и с меньшим использованием ЦП, выполняя одновременные операции чтения и отправки.

Вы можете просмотреть ваше установленное ядро с помощью:

# uname -r

 

 

и сравните его с последним стабильным ядром на www.kernel.org.

 

Check-Linux-Kernel-Version

 

Хотя это процесс, не предназначенный для начинающих, обновление вашего ядра — интересное упражнение, чтобы узнать больше о внутренностях Linux.

 

СОВЕТ № 3: Выберите модуль мультиобработки (MPM), который лучше всего подходит для вашего случая

На практике MPM расширяют модульные функциональные возможности Apache, позволяя вам решать, как настроить веб-сервер для привязки к сетевым портам на машине, принимать запросы от клиентов и использовать дочерние процессы (и потоки, альтернативно) для обработки таких запросов.

Начиная с версии 2.4, Apache предлагает на выбор три разных MPM в зависимости от ваших потребностей:

  • Prefork MPM использует несколько дочерних процессов без потоков. Каждый процесс обрабатывает одно соединение за раз без создания отдельных потоков для каждого. Не вдаваясь в подробности, мы можем сказать, что вы захотите использовать этот MPM только при отладке приложения, которое использует, или если вашему приложению нужно иметь дело с не поточно-безопасными модулями, такими как mod_php.
  • Worker MPM использует несколько потоков на дочерние процессы, где каждый поток обрабатывает одно соединение за раз. Это хороший выбор для серверов с большим трафиком, поскольку он позволяет обрабатывать больше одновременных соединений с меньшим объемом оперативной памяти, чем в предыдущем случае.
  • Наконец, event MPM является MPM по умолчанию в большинстве установок Apache для версий 2.4 и выше. Он похож на Worker MPM в том, что он также создает несколько потоков для каждого дочернего процесса, но с преимуществом: он заставляет KeepAlive или незанятые соединения (пока они остаются в этом состоянии) обрабатываться одним потоком, освобождая память, которая может выделяться другим потокам. Этот MPM не подходит для использования с не поточно-ориентированными модулями, такими как mod_php, для которого вместо этого должна использоваться замена такого PHP-FPM.

Чтобы проверить MPM, используемый вашей установкой Apache, вы можете сделать:

# httpd -V

 

Изображение ниже показывает, что этот конкретный веб-сервер использует prefork MPM.

 

Check-Apache-MPM

 

Чтобы изменить это, вам нужно будет отредактировать:

# /etc/httpd/conf.modules.d/00-mpm.conf [On RedHat/CentOS based systems]
# /etc/apache2/mods-available/<mpm>.load [On Debian/Ubuntu based systems]

 

 

Где <mpm> может быть mpm_event, mpm_worker или mpm_prefork и раскомментируйте строку, которая загружает нужный модуль следующим образом:

LoadModule mpm_event_module modules/mod_mpm_event.so

 

 

Примечание. Чтобы событие MPM работало в Debian, вам может потребоваться установить пакет libapache2-mod-fastcgi из платных репозиториев.

Кроме того, для CentOS вам понадобится php-fpm (вместе с fcgi и mod_fcgid), тогда как в Debian он называется php5-fpm (вместе с apache2-mpm-event).

И последнее, но не менее важное: перезапустите веб-сервер и недавно установленную службу php-fpm (или php5-fpm):

 

На RedHat/CentOS
# systemctl restart httpd php-fpm && systemctl enable httpd php-fpm

 

 

В Debian / Ubuntu
# systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

 

 

Хотя вы можете настроить Apache на использование определенного MPM, эта конфигурация может быть переопределена для каждого виртуального хоста таким же образом, как указано ранее.

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

Наконец, обратите внимание, что независимо от выбранного вами дистрибутива, php-fpm зависит от реализации FastCGI, поэтому я рекомендовал установку дополнительных пакетов ранее. Для получения более подробной информации и примеров о php-fpm и о том, как он может вместе с событием MPM повысить производительность Apache, вам следует обратиться к официальной документации.

Вот что я вижу после изменения MPM по умолчанию с prefork на событие в том же окне, что и на предыдущем изображении:

 

Choose-Apache-MPM-Module

 

В CentOS 7 вам необходимо убедиться, что службы http и https включены через брандмауэр и что сетевой интерфейс (ы) правильно добавлен в зону по умолчанию.

Например:

# firewall-cmd --zone=internal --add-interface=tun6to4
# firewall-cmd --zone=internal --add-interface=tun6to4 --permanent
# firewall-cmd --set-default-zone=internal
# firewall-cmd --add-service=http
# firewall-cmd --add-service=https
# firewall-cmd --add-service=http --permanent
# firewall-cmd --add-service=https --permanent
# firewall-cmd --reload

 

 

Причина, по которой я это поднимаю этот впрос, заключается в том, что недавно я столкнулся с проблемой, когда настройки конфигурации firewalld по умолчанию в облачном VPS не позволяли php-fpm и Apache обрабатывать php-файлы.

В качестве базового теста (я уверен, что вы можете подумать о более сложных или стрессовых), я создам файл php, который проверяет наличие другого файла с именем test.php в том же каталоге двух серверов CentOS 7 с одинаковыми характеристиками оборудования и загружу, но с другим MPM. Один из них будет использовать event, а другой — prefork:

 

Compare-Apache-Event-and-Prefork-Module

 

Это код php, который я сохранил в файле с именем checkiffileexists.php:

<?php
$filename = 'test.php';

if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>

 

 

Затем мы запустим инструмент тестирования Apache (ab) с 200 одновременными запросами до 2000 запросов:

# ab -k -c 100 -n 2000 localhost/checkiffileexists.php

 

 

Давайте запустим тест и сравним результаты. Обратите внимание на статистику производительности:

 

Apache-Performance-Load-Testing

 

Как вы можете видеть, производительность сервера значительно превосходит его аналог prefork во всех аспектах этого теста.

 

СОВЕТ №4. Разумно распределяйте оперативную память для Apache

Возможно, самый важный аппаратный элемент, который необходимо принять во внимание — это объем ОЗУ, выделенный для каждого процесса Apache. Хотя вы не можете контролировать это напрямую, вы можете ограничить количество дочерних процессов с помощью директивы MaxRequestWorkers (ранее известной как MaxClients в Apache 2.2), которая налагает ограничения на использование ОЗУ Apache. Опять же, вы можете установить это значение для каждого хоста или виртуального хоста.

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

Например, следующий блок ограничит число одновременных клиентов до 30. Если большее количество клиентов попадет на хост, они могут столкнуться с задержкой или кратковременным отказом, который можно легко устранить путем обновления браузера. Хотя это может считаться нежелательным, это полезно для сервера и, в конечном счете, лучше всего подходит для вашего сайта.

Вы можете поместить этот блок в /etc/httpd/conf/httpd.conf или /etc/apache2/apache2.conf, в зависимости от того, используете ли вы CentOS или Debian.

Обратите внимание, что тот же принцип применяется ко всем MPM — я использую событие здесь, чтобы продолжить концепцию, изложенную в предыдущем совете:

<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 30
MaxConnectionsPerChild 1000
</IfModule>

 

 

В любом случае настоятельно рекомендуется обратиться к документации Apache 2.4, чтобы узнать, какие директивы разрешены для выбранного вами MPM.

 

СОВЕТ №5. Знайте свои приложения

Как правило, не следует загружать какие-либо модули Apache, которые не являются строго необходимыми для работы вашего приложения. Это потребует как минимум общих знаний о приложениях, запущенных на вашем сервере, особенно если вы системный администратор и есть другая команда, отвечающая за разработку.

Вы можете перечислить загруженные в данный момент модули с помощью:

# httpd -M [On RedHat/CentOS based systems]
# apache2ctl -M [On Debian/Ubuntu based systems]

 

 

Чтобы выгрузить/отключить модули в CentOS, вам необходимо закомментировать строку, начинающуюся с LoadModule (либо в основном файле конфигурации, либо во вспомогательном файле внутри /etc/httpd/conf.modules.d.).

С другой стороны, Debian предоставляет инструмент под названием a2dismod для отключения модулей и используется следующим образом:

# a2dismod module_name

 

 

Чтобы включить его обратно:

# a2enmod module_name

 

 

В любом случае, не забудьте перезапустить Apache, чтобы изменения вступили в силу.

 

Спасибо за уделенное время на прочтение статьи!

Если возникли вопросы, задавайте их в комментариях.

Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!

Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Ciscoкурсы по кибербезопасности,  полный курс по кибербезопасностикурсы DevNet (программируемые сети) от Академии Ciscoкурсы Linux от Linux Professional Institute на платформе SEDICOMM University (Университет СЭДИКОММ).

Курсы Cisco и Linux с трудоустройством!

Спешите подать заявку! Осталось пару мест. Группы стартуют 22 июля, а следующая 19 августа, 23 сентября, 21 октября, 25 ноября, 16 декабря, 20 января, 24 февраля.
Что Вы получите?
  • Поможем стать экспертом в сетевом администрировании и получить международные сертификаты Cisco CCNA Routing & Switching или Linux LPI.
  • Предлагаем проверенную программу и учебник экспертов из Cisco Networking Academy и Linux Professional Institute, сертифицированных инструкторов и личного куратора.
  • Поможем с трудоустройством и сделать карьеру. 100% наших выпускников трудоустраиваются.
Как проходит обучение?
  • Проводим вечерние онлайн-лекции на нашей платформе или обучайтесь очно на базе Киевского офиса.
  • Спросим у вас об удобном времени для практик и подстроимся: понимаем, что времени учиться мало.
  • Если хотите индивидуальный график — обсудим и осуществим.
  • Выставим четкие дедлайны для самоорганизации. Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
А еще поможем Вам:
  • отредактировать резюме;
  • подготовиться к техническим интервью;
  • подготовиться к конкурсу на понравившуюся вакансию;
  • устроим на работу в Cisco по программе Cisco Incubator, New Graduate и Experienced. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.
Чтобы учиться на курсах Cisco CCNA Routing & Switching и Linux LPI, подайте заявку или получите бесплатную консультацию.
Apache

Больше похожих постов

How-to-Enable-HTTP_2-in-Apache-on-Ubuntu

Как включить HTTP/2 в Apache в Ubuntu?

187
0
С момента создания Всемирной паутины (www) протокол HTTP на протяжении многих лет развивался для обеспечения безопасного и быстрого цифрового соединения…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Most Viewed Posts
Меню