Как оптимизировать Apache на Ubuntu 14.04 и 16.04
В данной инструкции я расскажу, как оптимизировать производительность веб-сервера Apache, запущенном на ОС Ubuntu 14.04. Информация будет работать также и на других версиях Ubuntu, например, 16.04, и ОС Debian.
Что требуется сделать:
- Запустите в консоли команду1apachectl -t -D DUMP_MODULES
и убедитесь, что в Ubuntu 14.04 используется Apache 2 с PHP, запущенным с помощью модуля mpm_prefork. Настройки этого модуля лежат в /etc/apache2/mods-enabled/mpm_prefork.conf. Также, имейте ввиду, что начиная с Apache 2.4, значение MaxClients было переименовано в MaxRequestWorkers, и поэтому любая документация, относящаяся к MaxClients должна быть отнесена к MaxRequestWorkers. - Временно остановите веб-сервер Apache следующей командой:1sudo service apache2 stop
- Подождите 5 секунд, и затем запустите следующую команду, чтобы выяснить, сколько у Вас есть на сервере свободной виртуальной памяти:1sudo free -ht
Найдите линию Mem: и посмотрите на столбец free. Рассматривайте это, как объем RAM, который Вы можете выделить для Apache. Хотя я обычно люблю вычитать из него 2GB на мощном сервере (когда памяти > 4GB), или 1GB на более слабом. Поэтому, если столбец free говорит, что было свободно 13GB, я бы рекомендовал выделять Apache 11GB. Это базовый уровень. Если у нас возникнут проблемы в логах (больше 3 раз за 3 дня), то потребуется больше памяти. В таком случае мы можем рассмотреть 10GB для работы вместо 11GB. Если в логах Apache обнаружится, что серверу нужно больше MaxRequestWorkers, настройку этого случая я приведу ниже. - Запустите вебсервер Apache.1sudo service apache2 start
- Откройте около 10 вкладок (табов) браузера. Загрузите в них какие-нибудь ресурсоемкие и медленно загружающиеся страницы с вашего вебсайта. Перезапустите 3-4 раза каждый таб.
- После этого быстро запустите следующую команду:1sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}'
Быстро запустите ее 5 раз.Посмотрите на значение Average Process Size и вычислите среднее арифметическое за 5 раз запуска этой команды.
Сейчас сделайте следующее вычисление, и удостоверьтесь, что преобразовали GB в MB, поскольку необходимо, чтобы все значения были в MB (в мегабайтах). Поэтому, умножайте (1 GB = 1024 MB) или делите (1MB = 1/1024 GB), для получения нужной единицы.
MaxRequestWorkers = Baseline Free (с местом для буфера) / Avg Process Size
К примеру, у меня есть сервер с 14GB памяти. Когда Apache на нем был остановлен, сервер показывал, что в режиме ожидания используется 1GB RAM. Затем я выделил еще 1GB для некоего дополнительного буфера ОС на всякий случай. Это значит, что у меня было бы Baseline Free — 12GB. Сейчас я должен преобразовать его из GB в MB. Поэтому я умножаю 12 x 1024 и получаю 12288. 12288 MB — это мое значение Baseline Free. В моем случае я вижу, что Average Process Size был 21MB. Поэтому, я взял 12288 / 21 и получил примерно 585. Теперь, вполне логично, что округлив это значение, я получил 580.
- Отредактируйте файл /etc/apache2/mods-enabled/mpm_prefork.conf и решите относительно установки предложенных значений, заменив XXX вычисленными значениями MaxRequestWorkers:123456StartServers 2MinSpareServers 2MaxSpareServers 5MaxRequestWorkers XXXServerLimit XXXMaxConnectionsPerChild 0
Замечу, что Вы можете не увидеть параметр ServerLimit в конфиге. Добавьте его. Этот параметр по-умолчанию равен 256, если не указан. При этом он должен быть таким же, как и MaxRequestWorkers. Иначе Вы получите ошибку.
- Другой критический фактор в вашей конфигурации Apache — переменная Timeout, измеряемая в секундах, в файле /etc/apache2/apache2.conf. Она означает, как долго Вы можете посылать или получать с сервера данные перед тем, когда время ожидания выйдет. Вы должны также держать в уме возможность загрузки или скачивания файлов на сайте. Например, если у Вас вебсайт, где люди могут отправлять и скачивать CSV или другие большие файлы. Также Вам нужно держать в уме загруженность сервера баз данных, и возможно закладывать на это время, прежде чем таймаут страницы закончится. Чем меньше Вы сделаете переменную Timeout, тем больше вебсервер будет доступен для получения новых соединений. Заметим, однако, что установка этого значения слишком маленьким может вызывать очистку переменных сессий PHP, не затрагивая сеансовые кукисы браузера. Поэтому, например, значение 300 (5 минут) может быть хорошим для вебсервера, который полагается на переменные сессий PHP в рабочем потоке веб приложения вместо сеансовых кукисов браузера. Значение 45 может быть хорошим для вебсервера, который ничего не обслуживает, кроме статических рекламных лендингов. Но может быть ужасным для сервера, которому нужно использовать много сессионных переменных PHP. Поэтому, установите Timeout в этом файле согласно Вашим потребностям. Чтобы увидеть, не стоит ли слишком маленькое значение, может потребоваться тестирование всех страниц Вашего сайта. Это возможно хорошая идея, но все равно, не ставьте значение больше 300 до тех пор, пока не увидите проблем с отправкой или скачиванием больших файлов.
- Сейчас перезапустите вебсервис Apache. Если Вы сделали что-то неправильно, Apache, вероятно, скажет Вам об этом в момент, когда Вы снова его запустите. И Вы сможете это исправить.1sudo service apache2 restart
- Сейчас повторите трюк с 10 табами браузера, как Вы уже это делали. И Вы увидите, появились ли ошибки конфигурации Apache в логе ошибок веб-сервера:1sudo tail -f /var/log/apache2/error.log
…нажмите CTRL+C, чтобы выйти, если захотите.
Поищите жалобы о необходимости MaxRequestWorkers (и недавние, после перезагрузки сервера). Если Вы увидите их даже с оптимальными настройками MaxRequestWorkers, тогда, вероятно, Вам нужно большая мощность для Ваших вебсайтов или веб-приложений. Рассмотрим варианты:
- Использование CDN для возможности скачивания больших файлов, картинок и скриптов.
- Использование сервисов кэширования типа CloudFlare или похожих.
- Переработка стратегии работы Вашего вебсайта или веб-приложения по использованию нескольких вебсерверов в качестве единого «веб-приложения», в котором сервера связываются балансировщиком нагрузки.
- Добавление большего объема памяти RAM на сервер, и, потому новый перерасчет.
- Сейчас Ваш сервер Apache настроен и оптимизирован. Вам нужно будет проверять его на протяжении 2-3 недель и искать проблемы с MaxRequestWorker в логах ошибок Apache. На основе этого Вы сможете принять решение об оптимизации (смотрите шаг 10). Вы можете также установить Munin с помощью утилиты apt на Ubuntu, посмотреть на производительность Apache во времени и предположить рост, прежде чем оптимизировать количество трафика, которым управляет веб-сервер.
По материалам сайта https://serverfault.com