Как увеличить память apache на windows

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

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

  • Что замедляет сервер?
  • Как ускорить работу Apache?
  • 5 шагов для ускорения работы Apache
    • Настройки для ускорения Apache во время компиляции
      • Загружайте только нужные модули
      • Выберите правильный MPM
  • Ускорение работы Apache изменениями во время выполнения
    • Поиск DNS
    • Настройка AllowOverride
    • Настройки FollowSymLinks и SymLinksIfOwnerMatch
    • Согласование содержимого (Content Negotiation)
    • Настройка MaxClients
    • Настройки MinSpareServers, MaxSpareServers и StartServers
    • Настройка MaxRequestsPerChild
    • Настройка KeepAlive и KeepAliveTimeout
    • Timeout
  • Сжатие и кэширование HTTP
  • Разные серверы для статического и динамического контента
  • Тонкая настройка MySQL и PHP
  • Заключение

Работа веб-серверов может замедляться из-за вредоносных программ, больших объемов трафика или из-за неправильного распределения ресурсов. Есть два пути ускорения работы веб-сервера Apache:

Круглосуточный мониторинг производительности и экстренные исправления.

Отслеживание производительности, завершение процесса-нарушителя и установление лимитов выделенных ресурсов, чтобы в будущем предотвратить возникновение подобных проблем.

Периодический аудит производительности и настройка Apache.

Позволяет найти уязвимости сервера и защитить их.

Настроить производительность Apache таким образом, чтобы она соответствовала объемам получаемого трафика. Таким образом можно добиться 50% ускорения работы.

Ускорить работу Apache можно на двух основных стадиях:

  • Во время компиляции – настройки при установке сервера.
  • Во время выполнения — установка параметров, влияющих на сервер во время его работы.

Нужно выбирать вариант установки Apache, исходя из ваших требований. Это поможет создать быстрый и эффективный веб-сервер.

В Apache функциональность реализуется путем добавления модулей. Они бывают двух типов: статические и динамические (общие).

Чтобы посмотреть список модулей, поддерживаемых вашим сервером, используйте команду apachectl -M. Статические модули компилируются в бинарные файлы httpd, а динамические загружаются непосредственно во время выполнения.

Статические и динамические модули: ключевые различия

Статические модули Динамические модули
Компилируются в бинарные файлы Добавляются во время выполнения
Требуют перекомпиляции кода Перекомпиляция не требуется
Быстро загружаются Замедляют веб-сервер

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

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

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

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

MPM бывают двух типов: Prefork и Worker. В MPM Prefork каждый процесс httpd обрабатывает один сетевой запрос. Это более безопасно по сравнению с MPM Worker, но требует большего количества памяти и ресурсов.

MPM Prefork и Worker

MPM Prefork MPM Worker
Один поток Несколько потоков
Использует больше ресурсов Использует меньше памяти
Отказоустойчив Справляется с большим трафиком

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

По умолчанию большинство установок Apache используют модуль Prefork. Он применяется для обработки больших объемов трафика. Вы можете проверить, какой модуль MPM использует ваш сервер при помощи следующей команды:

Выберите правильный MPM

Определение типа MPM на вашем вебсервере Apache

В Apache 2.4 появилась поддержка э MPM модуля Event, который может обрабатывать множественные запросы внутри одного потока. Поэтому он работает даже быстрее, чем модуль Worker.

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

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

При настройке директив Allow from или Deny from используйте IP-адреса вместо доменных имён. Иначе будет осуществляться двойной поиск имени DNS, который уменьшит производительность сервера.

Если задана опция AllowOverride, то Apache попытается открыть файл .htaccess в каждой папке, которую он посещает. Эти дополнительные запросы к файловой системе увеличивают время отправки ответа с сервера.

Поэтому лучше отключить эту опцию. Если переопределение настроек в файлах .htaccess необходимо в определённой папке, нужно разрешить это только для данного каталога.

Настройка Apache FollowSymLinks сообщает серверу, что нужно проверять символические ссылки и проходить по ним. Если она имеет значение Off, Apache придётся выполнять дополнительные проверки, что замедлит его работу.

Если установлена директива SymLinksIfOwnerMatch, сервер будет проходить по символическим ссылкам, только если владелец целевого файла тот же, что и владелец ссылки. Это также влияет на скорость работы Apache.

Лучше всего активировать директиву FollowSymLinks и выключить директиву ‘SymLinksIfOwnerMatch’. Но это может привести к проблемам с безопасностью, поэтому окончательное решение остается за вами.

Согласование содержимого позволяет клиентам выбирать формат данных, получаемых от сервера. Рекомендуется избегать согласования содержимого для быстрого ответа.

Если согласование содержимого необходимо для сайта, можно снизить задержки, используя файлы type-map вместо директивы Options MultiViews. Ее применение увеличивает задержку.

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

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

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

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

Значение MaxSpareServers не должно быть слишком большим. Так как стоящие в очереди на обработку дочерние процессы потребляют лишние серверные мощности. Нужно установить эти значения в оптимальном диапазоне, чтобы сбалансировать использование ресурсов и производительность.

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

Директива MaxRequestsPerChild устанавливает лимит количества запросов, которое будет обрабатывать каждый дочерний процесс. Слишком малое значения может привести к перегрузке сервера при создании новых процессов. Поэтому нужно установить это значение в диапазоне нескольких тысяч, чтобы ускорить работу Apache.

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

KeepAliveTimeout определяет время ожидания следующего запроса. Если значение большое, дочерние процессы могут расходовать ресурсы, ожидая следующего запроса. Оптимальное значение – 2-5 секунд для небольших объемов трафика и 10 секунд для высоконагруженных серверов.

Устанавливает время ожидания запроса от посетителя. При больших объемах трафика значение параметра должно быть не менее 120 секунд. Но лучше держать это значение минимальным. Это позволяет предотвратить излишнее расходование ресурсов.

Сжатие HTTP применяется для ускорения работы серверов Apache. Сервер применяет к телу ответа шифрование gzip или deflate перед тем, как отправить его клиенту. Затем клиент распаковывает полученные данные. Данные сжимаются только если браузер запрашивает сжатие. Сжатие HTTP включается в Apache с помощью модуля ‘mod_deflate’.

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

Модули mod_expires и mod_headers для настройки кэша через HTTP- заголовки, присылаемые с сервера. С помощью директив cache-control можно управлять правилами кэширования, чтобы ускорить работу Apache.

Также можно использовать кэширование на стороне сервера, когда часто запрашиваемый контент хранится в памяти. Для настройки данного типа кэширования используется модуль mod_cache.

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

Что приводит к расходам памяти и замедлению работы сервера. Поэтому рекомендуется разделить серверы на управляющие статическим контентом и динамическим контентом.

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

Для подобного перенаправления запросов используются модули mod_proxy и mod_rewrite. Клиент не заметит разницы, и будет считать, что все запросы выполняются одним сервером.

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

Не менее важно оптимизировать сервер баз данных, чтобы избежать задержек в его работе. Также необходимо улучшить производительность PHP-страниц, используя механизм кэширования, такой как Zend OPcache.

Сервер MySQL оптимизируется путем настройки фрагментации таблиц, максимального количества подключений, размеров буфера, кэша запросов, пула и т.п.

Настройка производительности Apache – нелёгкое дело. Поэтому важно иметь чёткое понимание технических требований веб-сервера и принципа его работы.

I’m getting the error when I run my PHP script….

Fatal error: Out of memory (allocated 1827405824) (tried to allocate 88800 bytes)

I’ve added this line to my PHP script..

ini_set("memory_limit","3000M");

This statement does seem to correctly control the memory usage, but I dont seem to be able to get it above about 1.8GB.
Its as if the upper memory limit is being restricted somewhere else.
I’ve also added to the php.ini…

memory_limit = 3000M

Does anyone know if the memory is restricted elsewhere?

I’m running a local server with Xampp.
I have Windows 7, 64-bit with 4GB RAM.
My script uses PHP’s GD image library and I get the error when trying to allocate an image reference with ImageCreateTrueColor().

(I know this is a huge amount of memory — but this is just a one-of script, and its just a lot easier to do it this way.)

Thanks.

Update….

@elusive @Orbling
I expect everybody’s bored whith this question, but here is the simplified code which illustrates the problem.

<?php
    ini_set("memory_limit","4000000000");
    echo "ini_get = " . ini_get('memory_limit') . "<br>n";
    echo "memory_get_usage = " . memory_get_usage(true) . "<br>n";
    $bigImageHandle = imagecreatetruecolor(22200, 24800);  //this is line 5
?>

Browser output…

ini_get = 4000000000
memory_get_usage = 524288

Fatal error: Out of memory (allocated 1843396608) (tried to allocate 88800 bytes) in
E:UserMy_WebsexperimentshouseshuntingtemposMapst1.php on line 5

I tested this out with a smaller set of tiles and the memory used by imagecreatetruecolor() and I estimate I need 2.7GB

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

Apache

Содержание

  1. Выбор правильного MPM
  2. Нахождение файла Apache.conf
  3. Директивы MPM
  4. StartServers (Prefork, Event, Worker MPM)
  5. MinSpareServers (Prefork MPM)
  6. MaxSpareServers (Prefork MPM)
  7. ServerLimit (Prefork, Event, Worker MPM)
  8. MaxRequestWorkers.
  9. ThreadLimit (Event, Worker MPM)
  10. ThreadsPerChild (Event, Worker MPM)
  11. MaxRequestWorkers / MaxClients (Prefork, Event, Worker MPM)
  12. MaxConnectionsPerChild (Prefork, Event, Worker MPM)
  13. Основные директивы Apache
  14. Timeout
  15. KeepAlive
  16. MaxKeepAliveRequests
  17. KeepAliveTimeout
  18. Другие улучшения производительности
  19. Удаление неиспользуемых модулей
  20. Установите ExtendedStatus Off
  21. Отключите поиск имени хоста
  22. Используйте mod_gzip/mod_deflate
  23. Избегайте подстановочных знаков DirectoryIndex
  24. Используйте mod_disk_cache НЕ mod_mem_cache
  25. Перенесите кэш на внешний диск
  26. Тестирование и перезапуск Apache
  27. Apache2Buddy
  28. ApacheBench
  29. Инструменты бенчмаркинга
  30. SIEGE
  31. Gobench
  32. Apache JMeter
  33. wrk
  34. HTTPLoad
  35. httperf

Выбор правильного MPM

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

Одновременно может быть активен только один MPM, и он должен быть скомпилирован статически с:

—with-mpm=(worker|prefork|event).

Традиционная модель одного процесса на запрос называется prefork. Более новая, потоковая модель называется worker, которая использует несколько процессов, каждый из которых имеет несколько потоков, чтобы получить лучшую производительность при меньших накладных расходах. Наконец, событийный MPM — это модуль, который хранит отдельные пулы потоков для различных задач.

Чтобы определить, какой MPM вы используете в настоящее время, выполните команду

Вы можете посмотреть, какие модули Apache были скомпилированы, выполнив

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

Prefork является более безопасным выбором; вы должны провести тщательное тестирование, если вы выберете worker. Прирост производительности также зависит от библиотек, поставляемых с вашим дистрибутивом, и вашего оборудования.

  • Worker MPM — использует несколько дочерних процессов, каждый из которых может иметь несколько потоков. Каждый поток обрабатывает одно соединение за раз. Worker обычно является хорошим выбором для серверов с высоким трафиком, работающих под управлением Apache версий до 2.4, поскольку он занимает меньше памяти, чем prefork MPM. Однако он страдает из-за несовместимости с непотокобезопасными библиотеками.
  • Event MPM — работает по потокам, как и Worker MPM, но предназначен для одновременного обслуживания большего количества запросов путем передачи части работы по обработке вспомогательным потокам, освобождая основные потоки для работы с новыми запросами. Event MPM функционирует идентично рабочему MPM в случае SSL-соединений. Apache имеет самые низкие требования к ресурсам при использовании под Event MPM. Event MPM доступен только начиная с версии Apache 2.4.
  • Prefork MPM использует несколько дочерних процессов с одним потоком в каждом. Каждый процесс обрабатывает одно соединение за раз. На многих системах prefork сравним по скорости с worker, но потребляет больше памяти. Безпоточная конструкция prefork имеет преимущества перед worker в некоторых ситуациях: Prefork является самым безопасным модулем и может использоваться с непотокобезопасными сторонними модулями. Prefork MPM также легче отлаживать на платформах с плохой поддержкой отладки потоков.

Независимо от того, какой MPM вы выберете, вы должны настроить его соответствующим образом. В целом, настройка или оптимизация MPM подразумевает указание Apache, как управлять активными и неактивными рабочими, а также тем, являются ли они потоками или процессами. Начиная с Apache 2.2 Prefork является MPM по умолчанию.

Другие опции MPM

Дополнительный модуль Apache mod_mpm_itk заставляет процесс Apache переключаться на идентификатор пользователя (UID) и идентификатор группы (GID) владельца домена, прежде чем ответить на запрос. Это позволяет каждому пользователю изолировать свои файлы от других с помощью стандартных параметров разрешения файлов. По сути, это позволяет изолировать каждый vhost непосредственно в его конфигурационном файле.

Основное ограничение ITK заключается в его производительности, поскольку он создает и затем уничтожает процесс для каждого запроса, что снижает производительность, особенно по сравнению с Prefork или Worker MPM.

  • mod_mpm_itk не функционирует как отдельный MPM. Вы должны установить prefork MPM для того, чтобы использовать модуль MPM ITK, который должен быть установлен отдельно.
  • mpm_winnt является частью интеграции Apache в операционную систему Microsoft Windows. Использование этого MPM является обязательным условием при использовании Apache в системах этого типа.

Существуют и другие экспериментальные MPM, но мы не рекомендуем использовать их в производственной среде.

Нахождение файла Apache.conf

Для начала найдите и откройте файл конфигурации Apache и найдите раздел директив MPM:

  • CentOS / RHEL / Fedora: /etc/httpd/conf/httpd.conf
  • Ubuntu / Debian: /etc/apache2/httpd.conf
  • DirectAdmin: /etc/httpd/conf/extra/httpd-mpm.conf
  • cPanel: /etc/apache2/conf.d/httpd.conf
  • Plesk: /etc/httpd/conf/

Если вы используете nano, vi или vim: после открытия файла вы можете найти директивы, прокрутив файл. Используя VI или VIM, вы также можете выполнить поиск, набрав прямую косую черту ‘/’ и введя точную строку, которую вы ищете (поиск зависит от регистра).

Ниже приведен пример конфигурации модуля MPM prefork:

<IfModule mpm_prefork_module>
    StartServers 4
    MinSpareServers 20
    MaxSpareServers 40
    MaxRequestWorkers 200
    MaxConnectionsPerChild 4500
</IfModule >

Для изменения MPM в простых системах на базе RHEL или Debian замените mpm_prefork_module на mpm_worker_module или mpm_event_module, соответственно.

В DirectAdmin модуль MPM может быть выбран с помощью Custombuild или путем редактирования /usr/local/directadmin/custombuild/options.conf

Администраторы cPanel могут изменить MPM, пройдя в WHM > Home > Software > EasyApache EasyApache 4

Директивы MPM

Ниже вы можете найти ссылки на документацию Apache для всех 3 модулей MPM:

  • Apache Prefork MPM
  • Apache Event MPM
  • Apache Worker MPM

StartServers (Prefork, Event, Worker MPM)

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

Подсказка: зеркально отразите это значение на то, которое установлено в MinSpareServers.

MinSpareServers (Prefork MPM)

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

Если количество простаивающих дочерних процессов меньше, чем задано этим значением, то родительский процесс создает новые дочерние процессы с максимальной скоростью 1 в секунду. Начиная с Apache 2.4, эта скорость увеличивается экспоненциально, начиная с 1 и заканчивая 32 дочерними процессами в секунду.

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

Рекомендуется изменить значение этого параметра следующим образом. Эти значения основаны на общем объеме установленной памяти (RAM):

  • Виртуальный выделенный сервер 5
  • Выделенный сервер с 1-2 ГБ ОЗУ 10
  • Выделенный сервер с 2-4 ГБ ОЗУ 20
  • Выделенный сервер с 4+ ГБ ОЗУ 25

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

MaxSpareServers (Prefork MPM)

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

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

Если значение MaxSpareServers меньше MinSpareServers, Apache автоматически подгонит MaxSpareServers к MinSpareServers плюс один.

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

ServerLimit (Prefork, Event, Worker MPM)

В Prefork MPM директива ServerLimit представляет собой верхний предел MaxRequestWorkers. Эта настройка обычно используется как защита или потолок от ошибок ввода при изменении MaxRequestWorkers.

В Prefork MPM ServerLimit используется только в том случае, если вам нужно установить MaxRequestWorkers больше 256 (по умолчанию). В этом случае вы должны соответствовать значению, которое вы установили для MaxRequestWorkers, но вы не должны устанавливать значение этой директивы выше, чем то, на которое вы, возможно, захотите установить

MaxRequestWorkers.

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

Для рабочих и событийных MPM эта директива в сочетании с ThreadLimit устанавливает максимальное значение MaxRequestWorkers на время жизни процесса Apache httpd.

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

ThreadLimit (Event, Worker MPM)

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

При использовании этой директивы следует соблюдать особую осторожность. Если ThreadLimit установлен в значение, значительно превышающее ThreadsPerChild, будет выделена дополнительная неиспользуемая общая память. Если и ThreadLimit, и ThreadsPerChild установлены в значения, превышающие возможности системы, Apache httpd может не запуститься или система может стать нестабильной.

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

ThreadsPerChild (Event, Worker MPM)

Эта директива устанавливает количество потоков, создаваемых каждым дочерним процессом. Каждый запущенный поток может обрабатывать один запрос. Дочерний процесс создает эти потоки при запуске.

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

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

Для этой директивы также существует верхний предел, который контролируется директивой ThreadLimit, по умолчанию равной 64 потокам.

Для увеличения ThreadsPerChild свыше 64 потоков также необходимо внести изменения в ThreadLimit.

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

MaxRequestWorkers / MaxClients (Prefork, Event, Worker MPM)

MaxRequestWorkers назывался MaxClients до версии Apache 2.3.13. Однако старое название все еще поддерживается. Он устанавливает ограничение на количество одновременно обслуживаемых запросов. Любые попытки соединения, превышающие лимит MaxRequestWorkers, обычно ставятся в очередь, до числа, определяемого директивой ListenBacklog. Как только дочерний процесс будет освобожден по завершении другого запроса, соединение будет обслужено.

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

Для непоточных серверов (т.е. prefork) MaxRequestWorkers означает максимальное количество дочерних процессов, которые будут запущены для обслуживания запросов. Значение по умолчанию равно 256; чтобы увеличить его, необходимо также поднять ServerLimit.

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

Дополнительную информацию о том, как определить директиву MaxRequestWorkers, смотрите ниже.

Формула для определения директивы MaxRequestWorkers: (Общая память — память критических служб) / Размер на процесс Apache

Я определяю критические службы как службы, такие как mySQL, Plesk, DirectAdmin; любые службы, которые необходимы для правильной работы вашего сервера.

Я использовал следующие команды через shell для определения значений общей памяти, памяти ОС, памяти MySQL и размера процесса Apache:

Общая память

free -m
total used free shared buffers cached Mem:
1002 599 402 0 28 337
-/+ buffers/cache: 233 769
Swap: 2047 124 1922

Выделенная память MYSQL

ps aux | grep 'mysql' | awk '{print $6}'
408
21440
704

Память Apache

ps aux | grep 'httpd' | awk ‘{print $6}’
22468
11552
41492
40868
41120
41696
39488
41704
15552
16076
16084
728

В этом случае серверу выделено 1002 Мб памяти, xx используется самой ОС, 21 Мб используется mySQL, а каждый поток Apache в среднем использует около 30 Мб. MaxClients = (1002 — 21) / 30, поэтому MaxClients = 32,7

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

free -mps aux | grep 'mysql' | awk '{print $6}'ps aux | grep 'postgresql' | awk '{print $6}'ps aux | grep 'httpd' | awk '{print $6}'

MaxConnectionsPerChild (Prefork, Event, Worker MPM)

MaxConnectionsPerChild устанавливает ограничение на количество соединений, которые будет обрабатывать отдельный дочерний серверный процесс. По истечении MaxConnectionsPerChild соединений дочерний процесс умрет. Если MaxConnectionsPerChild равно 0, то процесс никогда не завершится.

Установка MaxconnectionsPerChild в ненулевое значение ограничивает объем памяти, который процесс может израсходовать в результате (случайной) утечки памяти. Код, выполняемый через Apache, может содержать ошибки, которые приводят к утечке памяти. Эти утечки со временем увеличиваются, делая все меньшую часть общего пула памяти дочернего процесса пригодной для использования. Способ восстановления после утечки памяти — это переработка пострадавшего дочернего процесса Apache.

Как определить оптимальное значение для MaxConnectionsPerChild:

Формула для определения директивы MaxConnectionsPerChild: (общее количество ежедневных запросов / общее количество ежедневных процессов).

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

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

Основные директивы Apache

Основные директивы для Apache можно редактировать в файлах ниже:

На сервере на базе DirectAdmin они будут расположены в: /etc/httpd/conf/extra/httpd-default.conf
На сервере cPanel, он будет расположен в /etc/apache2/conf.d/httpd.conf
На сервере Plesk он будет находиться в /etc/httpd/conf/

Если вы используете nano, vi или vim: открыв файл, вы можете найти директивы, прокручивая файл. Используя VI или VIM, вы также можете выполнить поиск, набрав прямую косую черту ‘/’ и введя точную строку, которую вы ищете (поиск зависит от регистра).

Timeout

Параметр Timeout — это количество секунд до истечения времени «отправки» или «получения» данных (на или от клиента). По умолчанию установлено значение 60 секунд.

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

Большие тайм-ауты заставляют посетителей сайта «ждать в очереди», что создает дополнительную нагрузку на сервер. Это также открывает сервер для DOS-атак в стиле SlowLoris и может привести к длительному ожиданию в браузере, когда он столкнется с проблемой.

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

Необходимо найти баланс между этими двумя крайностями.

Разумное значение 100-120 для виртуальных частных серверов с ограниченными ресурсами или высоконагруженных выделенных серверов. Для серверов с нормальной нагрузкой рекомендуется более низкое значение, предпочтительно менее 60.

KeepAlive

Директива KeepAlive может обеспечить снижение задержки на 50% при одновременном снижении загрузки процессора. Это значительно повышает производительность Apache. Значение по умолчанию — ON.

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

В большинстве ситуаций KeepAlive следует устанавливать на On.

Однако KeepAlive увеличивает потребление памяти и должен быть отключен на серверах с ограниченным объемом оперативной памяти.

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

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

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

MaxKeepAliveRequests и KeepAliveTimeout. Обсуждаемые в следующем разделе, играют важную роль в тонкой настройке директивы KeepAlive.

MaxKeepAliveRequests

Этот параметр ограничивает количество запросов, разрешенных для одного постоянного соединения при включенном KeepAlive. Если установить значение 0, то будет разрешено неограниченное количество запросов. Значение по умолчанию равно 100.

Как правило, необходимо, чтобы это значение было не меньше, чем наибольшее количество элементов (HTML, текст, CSS, изображения и т.д.), обслуживаемых наиболее посещаемыми страницами на сервере.

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

KeepAliveTimeout

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

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

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

Другие улучшения производительности

Удаление неиспользуемых модулей

Для экономии памяти отключите загрузку ненужных модулей, включая, но не ограничиваясь, mod_php, mod_ruby, mod_perl и т.д. Помните, что вы можете посмотреть, какие модули Apache были скомпилированы, введя httpd -l

Установите ExtendedStatus Off

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

Отключите поиск имени хоста

Избегайте выполнения поиска DNS, который всегда требует дополнительных затрат процессорного времени. Вам редко понадобится HostnameLookups, а если понадобится, вы сможете найти их уже после того, как это произойдет. Если вы отключили HostnameLookups, избегайте использования имен хостов в конфигурациях, так как это избавит вас от необходимости ждать разрешения DNS имен хостов в ваших конфигурациях. Вместо этого следует использовать IP-адреса.

Используйте mod_gzip/mod_deflate

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

Избегайте подстановочных знаков DirectoryIndex

Выберите конкретный DirectoryIndex, т.е. index.html или index.php, а не index.

Используйте mod_disk_cache НЕ mod_mem_cache

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

Вместо этого используйте mod_disk_cache с плоской иерархией. Установите значения CacheDirLength=2 и CacheDirLevels=1, чтобы htcacheclean не занимал вечность при очистке каталога кэша.

Чтобы использовать ваш кэш, вы также должны убедиться, что установили соответствующие заголовки Expires, Etag и Cache-Control, т.е. вы должны знать, когда истекает срок действия файла, иначе вы не получите никаких преимуществ от кэширования.

Перенесите кэш на внешний диск

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

Тестирование и перезапуск Apache

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

service httpd configtest
Syntax OK

или

Для перезапуска Apache введите:

service httpd restart 
Stopping httpd: [ OK ] 
Starting httpd: [ OK ]

Apache2Buddy

Apache2Buddy — это скрипт, похожий на MySQLTuner, который проверяет настройки Apache и делает предложения на основе памяти процесса Apache и общей оперативной памяти. Скрипт apache2buddy.pl проверяет следующее:

  • Ограничения памяти PHP
  • Memcache
  • MaxClients
  • Использование памяти
  • Максимальное потенциальное использование памяти
  • Процент от общего объема оперативной памяти, выделенной для Apache
  • MaxRequestWorkers

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

curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | sudo perl

ApacheBench

Apache Bench (ab) — это инструмент нагрузочного тестирования и бенчмаркинга, предназначенный для установки веб-сервера Apache (хотя он без проблем работает на любом HTTP-сервере, например, nginx).

Чтобы установить ab, выполните следующие команды:

CentOS/Fedora

Debian/Ubuntu

apt-get update
apt-get install -y apache2-utils

Синтаксис

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

ab -t 60 -n 20 -kc 5 http://yourdomain.com/

Запуск ApacheBench аналогичен направлению атаки типа «отказ в обслуживании» на ваш собственный сервер. Этот инструмент не рассчитан на то, чтобы быть отзывчивым к вашей инфраструктуре, и не предоставляет возможности увеличивать параллельность в измеряемых интервалах в течение периода тестирования.

Единственный вариант при проведении нагрузочного теста с помощью ab — залить веб-сервер произвольным количеством одновременных запросов в один момент.

Необязательные флаги

  • -n [значение]: Количество отправляемых запросов
  • -t [значение]: Продолжительность в секундах, в течение которой каждое соединение будет «живым».
  • -c [значение]: Количество одновременных запросов
  • -l: игнорировать проверку длины
  • -v 2: будет выводить тело и заголовок каждого ответа в stdout, чтобы вы могли определить успех или неудачу.
  • -k: HTTP Keep-Alive

Имейте в виду, что если вы используете флаги -t и -n, флаг -t всегда должен быть первым.

Инструменты бенчмаркинга

Некоторые дополнительные инструменты бенчмаркинга для веб-серверов HTTP.

SIEGE

Утилита нагрузочного тестирования HTTP, поддерживаемая в UNIX. Вы можете проверить несколько URL, создав текстовый файл для нагрузочного теста.

Установка

синтаксис

siege -q -t 5S -c 500 http://yourdomain.com

Необязательные флаги

  • -q: работать тихо (не показывать детали запроса)
  • -t: работать в течение 5 секунд
  • -c: 500 одновременных запросов

Gobench

Утилита нагрузочного тестирования для оценки производительности веб-сервера, написанная на языке Go. Поддерживает более 20 000 одновременных пользователей.

Apache JMeter

Один из самых популярных инструментов с открытым исходным кодом для измерения производительности веб-приложений. JMeter — это приложение на базе java. Оно поддерживает не только веб-серверы, но и позволяет оценивать производительность PHP, Java. ASP.net, SOAP, REST и т.д. …

wrk

С помощью wrk вы можете указать запуск нагрузочного теста с определенным количеством потоков.

синтаксис

wrk -t4 -c100 -d120s http://yourdomain.com

Необязательные флаги

  • -d: тестирование в течение 2 минут (120 секунд)
  • -t: 4 потока
  • -c: 100 одновременных пользователей

HTTPLoad

Httpload может считывать несколько URL из текстовых файлов, или вы можете указать их в аргументе команды. Httpload поддерживает шифрование SSL/TLS, что означает, что у вас есть возможность запрашивать веб-страницы с поддержкой HTTPS (SSL).

синтаксис

httpload -cipher AES256-SHA -parallel 200 -seconds 120 URL_LIST.txt

httperf

синтаксис

httperf --server yourdomain.com --port 80 --num-conns 1000 --rate 100

I have an problem increasing memory limit for PHP as Apache module.

If I put following directive in Apache configuration, that work OK:

php_value memory_limit 1.99G

But over 2GB do not work, it’s restore this value back to 128MB.

What is the problem here? I need more memory for some PDF related tasks.

Server is Debian 2.6.32-5-amd64 #1 SMP, PHP 5.3.3-7+squeeze13 with 12GB physical RAM.

asked Aug 9, 2012 at 14:01

mikikg's user avatar

9

Have you tried using the value in MB ?

php_value memory_limit 2048M

Also try editing this value in php.ini not Apache.

Amit Bera's user avatar

Amit Bera

7,5717 gold badges31 silver badges57 bronze badges

answered Aug 9, 2012 at 14:04

Claudiu Claw's user avatar

4

I would suggest you are looking at the problem in the wrong light. The questtion should be ‘what am i doing that needs 2G memory inside a apache process with Php via apache module and is this tool set best suited for the job?’

Yes you can strap a rocket onto a ford pinto, but it’s probably not the right solution.

Regardless, I’ll provide the rocket if you really need it… you can add to the top of the script.

ini_set('memory_limit','2048M');

This will set it for just the script. You will still need to tell apache to allow that much for a php script (I think).

answered Aug 9, 2012 at 14:11

Ray's user avatar

RayRay

39.4k20 gold badges94 silver badges134 bronze badges

5

For unlimited memory limit set -1 in memory_limit variable:

ini_set('memory_limit', '-1');

scrowler's user avatar

scrowler

24.1k9 gold badges63 silver badges92 bronze badges

answered May 7, 2014 at 9:52

Indrajeet Singh's user avatar

3

You should have 64-bit OS on hardware that supports 64-bit OS, 64-bit Apache version and the same for PHP. But this does not guarantee that functions that are work with PDF can use such big sizes of memory. You’d better not load the whole file into memory, split it into chunks or use file functions to seek on it without loading to RAM.

answered Aug 9, 2012 at 14:10

Timur's user avatar

TimurTimur

6,6381 gold badge27 silver badges37 bronze badges

2

Input the following to your Apache configuration:

php_value memory_limit 2048M

answered Aug 9, 2012 at 14:04

Florent's user avatar

FlorentFlorent

12.3k10 gold badges47 silver badges58 bronze badges

You can also try this:

ini_set("max_execution_time", "-1");
ini_set("memory_limit", "-1");
ignore_user_abort(true);
set_time_limit(0);

answered Sep 24, 2018 at 15:30

kishan Radadiya's user avatar

I had the same problem with commandline php even when ini_set("memory_limit", "-1"); was set, so the limit is in php not from apache.

You should check if you are using the 64bit version of php.

Look at this question about Checking if code is running on 64-bit PHP to find out what php you are using.

I think your php is compiled in 32 bit.

answered Feb 4, 2020 at 21:59

Radon8472's user avatar

Radon8472Radon8472

3,9231 gold badge31 silver badges40 bronze badges

I have an problem increasing memory limit for PHP as Apache module.

If I put following directive in Apache configuration, that work OK:

php_value memory_limit 1.99G

But over 2GB do not work, it’s restore this value back to 128MB.

What is the problem here? I need more memory for some PDF related tasks.

Server is Debian 2.6.32-5-amd64 #1 SMP, PHP 5.3.3-7+squeeze13 with 12GB physical RAM.

asked Aug 9, 2012 at 14:01

mikikg's user avatar

9

Have you tried using the value in MB ?

php_value memory_limit 2048M

Also try editing this value in php.ini not Apache.

Amit Bera's user avatar

Amit Bera

7,5717 gold badges31 silver badges57 bronze badges

answered Aug 9, 2012 at 14:04

Claudiu Claw's user avatar

4

I would suggest you are looking at the problem in the wrong light. The questtion should be ‘what am i doing that needs 2G memory inside a apache process with Php via apache module and is this tool set best suited for the job?’

Yes you can strap a rocket onto a ford pinto, but it’s probably not the right solution.

Regardless, I’ll provide the rocket if you really need it… you can add to the top of the script.

ini_set('memory_limit','2048M');

This will set it for just the script. You will still need to tell apache to allow that much for a php script (I think).

answered Aug 9, 2012 at 14:11

Ray's user avatar

RayRay

39.4k20 gold badges94 silver badges134 bronze badges

5

For unlimited memory limit set -1 in memory_limit variable:

ini_set('memory_limit', '-1');

scrowler's user avatar

scrowler

24.1k9 gold badges63 silver badges92 bronze badges

answered May 7, 2014 at 9:52

Indrajeet Singh's user avatar

3

You should have 64-bit OS on hardware that supports 64-bit OS, 64-bit Apache version and the same for PHP. But this does not guarantee that functions that are work with PDF can use such big sizes of memory. You’d better not load the whole file into memory, split it into chunks or use file functions to seek on it without loading to RAM.

answered Aug 9, 2012 at 14:10

Timur's user avatar

TimurTimur

6,6381 gold badge27 silver badges37 bronze badges

2

Input the following to your Apache configuration:

php_value memory_limit 2048M

answered Aug 9, 2012 at 14:04

Florent's user avatar

FlorentFlorent

12.3k10 gold badges47 silver badges58 bronze badges

You can also try this:

ini_set("max_execution_time", "-1");
ini_set("memory_limit", "-1");
ignore_user_abort(true);
set_time_limit(0);

answered Sep 24, 2018 at 15:30

kishan Radadiya's user avatar

I had the same problem with commandline php even when ini_set("memory_limit", "-1"); was set, so the limit is in php not from apache.

You should check if you are using the 64bit version of php.

Look at this question about Checking if code is running on 64-bit PHP to find out what php you are using.

I think your php is compiled in 32 bit.

answered Feb 4, 2020 at 21:59

Radon8472's user avatar

Radon8472Radon8472

3,9231 gold badge31 silver badges40 bronze badges

13 ноября, 2017 12:19 пп
9 751 views
| Комментариев нет

Ubuntu, VPS

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

  • Обновление Ubuntu 12.04 LTS до Ubuntu 14.04 LTS
  • Как обновить Ubuntu до 16.04 LTS
  • Миграция виртуального сервера Linux: подготовка системы

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

Это руководство поможет увеличить производительность Apache на вашем виртуальном сервере.

1: Отключите ненужные модули

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

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

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

В Ubuntu и Debian модули отключаются с помощью этой команды:

sudo a2dismod autoindex

Отдельные модули потребляют очень много ресурсов; если вы не используете следующие модули, просто отключите их:

  • PHP
  • SSL
  • Rewrite
  • Perl
  • Python
  • Rack / Ruby / Passenger

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

Примечание: Обычно Apache по умолчанию включает модуль rewrite, хотя его можно заменить модулем alias. Если вашему приложению подходит alias, отключите rewrite – это один из самых тяжелых модулей. Чтобы перейти с rewrite на alias, обратитесь к документации модуля. Даже если вы не сможете полностью отключить rewrite, вы сможете оптимизировать отдельные правила модуля.

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

К примеру, вы можете получить такую ошибку:

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.

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

sudo a2enmod dav_fs

2: Переместите код

На сайтах PHP часто используется популярный модуль mod_php, а на сайтах ruby – Passenger Phusion (модули mod_rails или mod_rack).

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

Включение модуля mod_php может привести к тому, что на обслуживание одного дочернего процесса Apache будет требоваться 100 Мб RAM. Чем больше процессов Apache будет запущено на сервере, тем сложнее их будет обрабатывать.

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

  • Для PHP можно установить php-fpm, который является отдельным процессом на основе протокола fastcgi.
  • В Python используйте uWSGI или gnunicorn
  • Для Rails используйте Unicorn.

Читайте также: Сравнение веб-серверов приложений на основе Python

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

После удаления модуля mod_php размер процессов Apache может измениться с 90-120 Мб до всего 10 Мб. Весь динамический контент обслуживается всего двумя процессами на бэкэнде.

3: Ограничьте количество процессов Apache

Многие операционные системы используют конфигурации по умолчанию, которые не очень подходят маленьким серверам – 25 дочерних процессов. Если каждый дочерний процесс Apache требует 120 Мб RAM, то сервер будет тратить 3 Гб только на Apache.

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

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

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

К примеру, у вас есть три процесса php-fpm для обработки динамического контента, где каждый процесс использует до 70 Мб памяти, а также сервер MySQL, который берет до 120 Мб RAM. В результате получается, что приложение использует 330 Мб памяти. Если у вас маленький сервер, вы можете выделить для Apache около 150 Мб памяти.

Когда веб-сервер 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 (например, 9 644) и запишите его. На данный момент веб-сервер использует почти 10 Мб памяти. Если ограничить количество дочерних процессов Apache до 15, 150 Мб выделенной памяти будет вполне достаточно.

Отредактируйте конфигурационный файл Apache (в Ubuntu и Debian это /etc/apache2/apache2.confand) и найдите раздел mpm_prefork_module. Найдите строку MaxClients и введите 15, а затем сохраните файл и перезапустите веб-сервер.

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

По умолчанию значение MaxClients может быть очень большим. Его нужно уменьшить.

Когда количество клиентов достигает предела, новые клиенты получат ошибку. Перезагрузив страницу, они смогут получить доступ к сайту.

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

В некоторых ситуациях меньшее количество дочерних процессов помогает увеличить производительность сервера.

4: Рассмотрите альтернативные конфигурации mpm.

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

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

Чтобы включить этот модуль, введите:

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 при установке модуля worker удаляется prefork mpm, mod_php и другие несовместимые модули.

Попробуйте применить эти рекомендации в комплексе на своем сервере производства.

Tags: Apache

Понравилась статья? Поделить с друзьями:
  • Как увеличить производительность компьютера в играх на windows 10
  • Как увеличить производительность компьютера windows 7 максимальная 64 bit
  • Как увеличить оценку производительности компьютера windows 7 windows
  • Как увеличить производительность компьютера windows 7 x64
  • Как увеличить оценку графики рабочего стола для windows aero