среда, 17 ноября 2021 г.

Повышение производительности WEB-сервера Apache 2.4

Для увеличения производительности WEB-сервера можно предпринять ряд шагов.

1)    При приходе запроса на web-сервер, он обращается к DNS для того что бы по IP адресу узнать сетевое имя и красиво сделать запись в логах. Для того что бы заставить apache прекратить это делать, нужно в конец файла /etc/httpd/conf/httpd.conf добавить строчку
HostnameLookups off

2)    В конфигурации сервера в разделе описывающий доступ к директориям <Directory …> есть директива, заставляющая сервер каждый раз прочитывать каталог и искать файл .htaccess для получения дополнительных инструкций из этого файла. Это поведение можно прекратить и глобально запретить искать файл .htaccess и считывать его содержимое. Для этого нужно установить значение директивы AllowOverride в None глобально и во всех настройках виртуальных хостов. Для установки директивы глобально в файле /etc/httpd/conf/httpd.conf в разделе <Directory "/var/www/html"> нужно установить
AllowOverride None
Для тех директорий, где использование файла .htaccess необходимо нужно создать отдельный раздел в файлах конфигурации и прописывать там:
<Directory "/var/www/html/">
      AllowOverride All
      Require all granted
</Directory>


3)    Web-сервер Apache, по умолчанию установленный в Linux, работает с применением многозадачного модуля PreFork. Этот модуль создает несколько процессов Apache на сервере. Каждый процесс обслуживает в единицу времени только один входящий запрос. В этом и плюс и минут данного решения.
Убедиться в том, что на сервере работает модуль PreFork можно так:
# apachectl -t -D DUMP_MODULES | grep mpm
Пример вывода
mpm_prefork_module (shared)
Для того что бы задействовать возможности PreFork по максимому нужно вручную задать его конфигурацию, рассчитываемую под каждый сервер индивидуально. Для этого в конец файла /etc/httpd/conf/httpd.conf нужно добавить блок:
KeepAlive off
<IfModule prefork.c>
   StartServers            6
   MinSpareServers         5
   MaxSpareServers         10
   MaxClients              XX
   ServerLimit             XX
   MaxRequestsPerChild     10000
</IfModule>

KeepAlive off – Директива отключает использование KeepAlive. При включенном KeepAlive в одном соединении с сервером клиент может сделать несколько запросов. Обычно это помогает загружать множественные картинки на странице сайта. Если картинок на странице сайта не много, то в режиме PreFork эта функция будет только мешать.
StartServers – количество процессов, которые Apache будет стартовать при запуске сервера. По умолчанию – 5.
MinSpareServers и MaxSpareServers  - это диапазон количества простаиваемых процессов, которые не обрабатывают запросы. Обычно значения оставляют теми, что заданы по умолчанию – 5 и 10 соответственно.
MaxClients и ServerLimit устанавливаются равными и рассчитывается как объем памяти для сервера деленное на объем памяти на один процесс.
Например, выделим для Apache 1024 Мбайт памяти. А один процесс занимает 25 МБ, тогда
MaxClients  = ServerLimit  = 1024 Мб / 25 МБ = 40
Оценить сколько потребляет весь сервер и один процесс нужно во время высокой нагрузки сервера так:
# ps -ylC httpd | awk '{x += $8;y += 1} END {print "Apache(MB): "x/1024; print "Proccess(MB): "x/((y-1)*1024)}'
Пример вывода:
Apache(MB): 660.219
Proccess(MB): 55.0182

MaxRequestsPerChild – тут задается большое число, которое ограничивает количество запросов, отработанных одним процессом. Когда процесс выполнит это количество запросов, процесс перезапуститься. Ноль в этой директиве запретит перезапуск процессов. Обычно тут нужно устанавливать большое число, что бы процессы перезапускались не часто. Но установка в 0 может вызвать неконтролируемые утечки памяти при сбое в процессе.

4)    Для мониторинга того, какой запрос на сервере выполняется медленно, на сервере Apache нужно настроить логирование времени выполнения каждого запроса. Это делается в глобальном файле конфигурации и в файлах конфигурации виртуальных хостов.
За это отвечают две директивы – LogFormat и CustomLog. В глобальном файле конфигурации /etc/httpd/conf/httpd.conf директивы прописываются в разделе <IfModule log_config_module>.
Первой директивой добавляем новый формат вывода логов и устанавливаем ему псевдоним, например, servetime
LogFormat "%h %t \"%r\" %D" servetime
В строке формата "%h %t \"%r\" %D"
%h - IP адрес, с которого пришел запрос
%t - время запроса
\"%r\" – строка самого запрос к серверу
%D -время в микросекундах, которое потребовалось apache для     обслуживания запроса
Другие возможные параметры форматирования лога описаны тут - http://httpd.apache.org/docs/2.2/mod/mod_log_config.html
Вторая директива определяет файл куда будет записываться лог требуемого формата с псевдонимом servetime. Существующую директиву, которая обычно выглядит так
CustomLog /var/log/httpd/access_log combined
меняем на
CustomLog "logs/access_log " servetime
Для создания отдельного файла логов с новым форматом нужно добавить новую строчку CustomLog, например:
CustomLog "logs/access_log_servetime" servetime
После применения изменений конфигурации сервера, логи с вычисленным значением длительности отработки запросов будут складываться в файл /var/log/httpd/access_log_servetime.
Вот так потом можно отфильтровывать запросы, длительностью более 10 миллисекунд:
# cat /var/log/httpd/access_log_servetime | awk -F'"' '{if ($3 > 10000) print $2, $3/1000}'
Пример лога из файла access_log_servetime:
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /logo-uhotool-2.jpg HTTP/1.1" 200 326
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /index-foto-01.jpg HTTP/1.1" 200 224
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /index-foto-02.jpg HTTP/1.1" 200 256
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /loader.gif HTTP/1.1" 200 201
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /index-foto-03.jpg HTTP/1.1" 304 330
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /favicon.ico HTTP/1.1" 200 165
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /background/getVoIPoperator.php HTTP/1.1" 200 6442
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /background/getListSMSChannel.php HTTP/1.1" 200 7055
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /background/getListTftp.php HTTP/1.1" 200 9045
::1 [12/Nov/2021:13:06:33 +0300] "OPTIONS * HTTP/1.0" 200 493

Пример вывода запросов более 10 миллисекунд
GET / HTTP/1.1 10.901
GET /index-foto-02.jpg HTTP/1.1 16.727
GET /background/getListTftp.php HTTP/1.1 10.349


5)    Рестартуем сервер для применения настроек по всем описанным выше пунктам:
# systemctl http restart


Комментариев нет:

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