Поиск по сайту:

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


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

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

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

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

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

Само собой разумеется, что установка последней версии Apache — это, вероятно, одна из первых вещей, которые вам нужно учитывать. По состоянию на 19 ноября 2015 г. последней версией Apache, доступной в репозиториях CentOS 7, является 2.4.6, тогда как в Debian. >2.4.10.

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

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

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

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

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

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

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

uname -r

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

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

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

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

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

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

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

httpd -V

На изображении ниже показано, что этот конкретный веб-сервер использует prefork 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_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

В Дебиан/Убунту

systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

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

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

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

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

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

В 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. Один из них будет использовать событие, а другой — префорк:

Это 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

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

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

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

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

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

Например, следующий блок ограничит количество одновременных клиентов до 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, чтобы изменения вступили в силу.

Резюме

В этой статье мы рассмотрели 5 советов, которые помогут вам настроить веб-сервер Apache и повысить его производительность. Кроме того, вы должны помнить, что оптимизация и производительность без безопасности бессмысленны, поэтому вы можете обратиться к статье об установке mod_pagespeed для повышения производительности веб-сервера и статье с советами по усилению защиты Apache на linux-console.net.

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