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

Как оптимизировать производительность веб-сервера Apache


Статус: устарело

В этой статье рассматривается версия Ubuntu, которая больше не поддерживается. Если вы в настоящее время используете сервер под управлением Ubuntu 12.04, мы настоятельно рекомендуем обновить или перейти на поддерживаемую версию Ubuntu:

  • Обновите Ubuntu до версии 14.04.
  • Обновление Ubuntu 14.04 до Ubuntu 16.04
  • Перенесите данные сервера в поддерживаемую версию.

Причина:

Смотрите вместо этого:

Введение

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

Что меня впервые привлекло в DigitalOcean, так это низкая начальная стоимость. Самые маленькие и дешевые дроплеты имеют 512 МБ ОЗУ, что не так много в современном мире больших фреймворков. Однако вы будете удивлены, что вы можете сделать с таким небольшим сервером, если вы потратите немного времени на настройку параметров.

Если вы используете Apache на одном из дроплетов меньшего размера или если вы хотите максимизировать производительность на больших дроплетах, вот несколько вещей, которые вы должны сделать. В примерах я буду использовать Ubuntu 12.04, но демонстрируемые принципы применимы и к другим версиям Linux.

Выгрузить ненужные модули

В системах на основе Ubuntu и Debian вы увидите папку с именем /etc/apache2/mods-enabled и папку с именем /etc/apache2/mods-available/. Папка с доступными модами — это список всех модулей, установленных на конкретном сервере, а с включенными модами — модули, которые в данный момент активны.

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

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

В Ubuntu и Debian вы отключаете модуль с помощью команды (на примере автоиндекса):

sudo a2dismod autoindex

Некоторые модули, которые особенно требовательны к ресурсам, которые вы должны отключить, если они вам не нужны:

  • PHP
  • SSL
  • Переписать
  • Перл
  • Питон
  • Багажник/Рубин/Пассажирский

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

Небольшое примечание о «перезаписи»: часто этот модуль включается, когда модуль «псевдоним» на самом деле работает одинаково хорошо. Если вы можете обойтись псевдонимом, отключите перезапись. Rewrite — один из самых обременительных модулей, но он также наделяет Apache замечательными возможностями.

Переключение с «перезаписи» на «псевдоним» — это сложная тема (с некоторой полезной документацией). Однако, даже если вы не можете полностью отключить перезапись, но можете преобразовать некоторые из ваших правил перезаписи в псевдонимы, получу преимущество.

После отключения модуля и перезагрузки конфигурации Apache вы можете проверить наличие сообщений в журнале ошибок Apache. В Ubuntu и Debian проверьте /var/log/apache2/error.log.

Я получаю ошибку, которая выглядит так:

Syntax error on line 6 of /etc/apache2/sites-enabled/site1:
Invalid command 'DAVLockDB', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.

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

sudo a2enmod dav_fs

Затем я перезапустил Apache и искал следующую ошибку. Может потребоваться несколько попыток, прежде чем вы разберетесь с минимальным списком. Потерпите, оно того стоит.

Переместить код из Apache

Если вы запускаете сайт PHP, велика вероятность, что вы используете знаменитый файл mod_php. Если вы используете рубиновый сайт, простым решением будет Passenger Phusion, он же mod_rails или mod_rack.

Проблема в том, что код C для интерпретатора этого языка встроен в Apache, поэтому при каждом просмотре страницы используется больше памяти. Если популярная страница на вашем сайте вызывает 30 HTTP-запросов, один из них будет для динамической страницы, а остальные 29, скорее всего, для статических ресурсов, таких как изображения, css и javascript. Зачем использовать раздутый Apache для тех 29 запросов, которые не обслуживают никакого динамического контента?

Разница может быть драматичной. Включение mod_php может привести к тому, что он будет использовать более 100 МБ ОЗУ на дочерний процесс Apache! Учитывая, что по умолчанию на вашем сервере Apache может быть запущено 25 или более процессов, вы можете понять, почему это может стать проблемой.

Вот некоторые инструменты, которые вы можете использовать для этого:

  • PHP может извлечь выгоду из php-fpm, который представляет собой отдельный процесс, использующий протокол fastcgi.
  • Для Python используйте эту замечательную статью здесь, в DigitalOcean).
  • Для Rails используйте эту статью здесь, на DigitalOcean, посвященную Unicorn).

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

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

Вы будете поражены тем, насколько это меняет дело. После удаления mod_php с моего виртуального сервера размер моих процессов Apache уменьшился с 90-120 МБ каждый до менее 10 МБ. Я смог обслуживать весь свой динамический контент с помощью всего двух серверных процессов php, каждый из которых использовал всего 60 МБ.

Ограничьте количество процессов Apache и дочерних элементов

Конфигурации Apache по умолчанию для большинства операционных систем плохо подходят для небольших серверов — обычно используется 25 дочерних процессов или более. Если каждый из ваших дочерних процессов Apache использует 120 МБ ОЗУ, то вашему VPS потребуется 3 ГБ только для Apache.

Веб-браузер одного посетителя может одновременно запрашивать 4 элемента с веб-сайта, поэтому, когда только 7 или 8 человек пытаются загрузить страницу одновременно, ваш облачный сервер может быть перегружен. Это приводит к тому, что веб-страница зависает в состоянии постоянной загрузки, что кажется вечностью.

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

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

Например, если у вас есть три процесса php-fpm, обрабатывающие динамический контент, и каждый из них может использовать до 70 МБ ОЗУ, а ваш сервер MySQL может использовать до 120 МБ ОЗУ, в сумме получается 330 МБ, используемых приложением. Это позволяет выделить около 150 МБ для Apache.

Во время работы Apache откройте команду top на сервере. Я вставлю немного того, что вы увидите, удалив большую часть неуместных строк:

top -bn 1
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                    
[...]
15015 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.02 apache2                    
15016 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.01 apache2                    
15017 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.02 apache2                    

Обратите внимание на столбец RES для дочернего процесса Apache и запишите его значение RES. Например, на моем виртуальном сервере, который был хорошо оптимизирован, значение составляет 9644, что означает, что он использует не совсем 10 МБ ОЗУ. Если я ограничу Apache максимум 15 дочерними процессами, то он должен иметь максимум около 150 МБ ОЗУ.

Отредактируйте файл конфигурации apache вашего облачного сервера, который в Ubuntu и Debian называется /etc/apache2/apache2.conf, и найдите раздел для конфигурации mpm_prefork_module. Найдите строку MaxClients и установите для нее значение 15, затем сохраните и перезапустите Apache.

Вот пример того, что вы будете искать в Ubuntu:

<IfModule mpm_prefork_module>
    StartServers          3
    MinSpareServers       3
    MaxSpareServers       5
    MaxClients           30
    MaxRequestsPerChild   0
</IfModule>

Видите там строчку MaxClients? Нам нужно изменить это значение на меньшее число.

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

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

Например, сайт Wordpress, которым я управляю, размещен на дроплете объемом 1 ГБ с использованием 4 процессов php-fpm и может одновременно обслуживать более 950 пользователей. Это соответствует пиковой пропускной способности около 42 миллионов просмотров страниц в день, если этот веб-сайт когда-либо станет достаточно популярным!

Рассмотрите альтернативную конфигурацию MPM

Большинство конфигураций Apache исторически использовали prefork mpm, который является потокобезопасным и поэтому подходит для использования с PHP и другими встроенными языками.

Если вы избавитесь от внешних модулей, таких как PHP или Rails, вы можете рассмотреть рабочий MPM, который часто работает быстрее, чем prefork.

Чтобы включить рабочий модуль, его необходимо установить.

sudo apt-get install apache2-mpm-worker

Который покажет вам сообщение вроде этого:

The following packages will be REMOVED:
  apache2-mpm-prefork libapache2-mod-php5
The following NEW packages will be installed:
  apache2-mpm-worker
0 upgraded, 1 newly installed, 2 to remove and 2 not upgraded.
Need to get 2,284 B of archives.
After this operation, 8,718 kB disk space will be freed.
Do you want to continue [Y/n]? 

Обратите внимание: в Ubuntu, если вы установите рабочий mpm, он удалит prefork mpm и mod_php и другие несовместимые дополнительные модули.

Здесь мы обсудили четыре оптимизации, которые вы можете сделать для Apache, которые должны значительно повысить производительность вашего приложения, даже если у вас есть небольшая капля.

Я настоятельно рекомендую попробовать это на тестовом дроплете, а не на рабочем сервере. Прелесть сервиса DigitalOcean в том, что вы можете запустить новый дроплет ровно на то время, которое вам нужно для проверки изменений, и закрыть его, когда закончите. Почасовая оплата — это недорогой и безопасный способ найти идеальную конфигурацию для вашего VPS.

Предоставлено: Мэттью Нузумом