Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Apache Error: AH00161: server reached MaxRequestWorkers setting, consider raising Linux / DevOps

Apache Error AH00161: server reached MaxRequestWorkers — Тюнинг MPM

Обновлено: 18.08.2026  ·  Официальная база знаний

Под высокой нагрузкой веб-сервер перестает своевременно обрабатывать входящие HTTP-запросы, отдавая задержки или 504 Gateway Timeout. В error.log появляется предупреждение исчерпания пула потоков: [mpm_event:error] [pid 1234:tid 5678] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting.

Модуль MPMКлючевой лимитПоведение при достижении лимита
mpm_preforkMaxRequestWorkers 256Новые процессы не форкаются, запросы ставятся в очередь ListenBacklog
mpm_event / workerThreadsPerChild * ServerLimitИсчерпан пул рабочих потоков, задержка установки TCP-соединений
Клиентский опытTime to First Byte (TTFB)Рост времени ответа от сотен миллисекунд до десятков секунд
  • Apache утилизирует все выделенные воркеры и блокирует новые клиентские подключения.
  • При переполнении очереди подключений клиенты получают сетевую ошибку Connection refused.
  1. Определите активный модуль MPM в вашей системе:
    # Debian/Ubuntu:
    apache2ctl -M | grep mpm
    
    # RHEL/CentOS:
    httpd -M | grep mpm
  2. Если используется mpm_event (рекомендуется для Highload), скорректируйте лимиты в /etc/apache2/mods-available/mpm_event.conf или /etc/httpd/conf.modules.d/00-mpm.conf:
    <IfModule mpm_event_module>
        ServerLimit              32
        StartServers             4
        MinSpareThreads          64
        MaxSpareThreads          256
        ThreadsPerChild          64
        # MaxRequestWorkers = ServerLimit * ThreadsPerChild (32 * 64 = 2048):
        MaxRequestWorkers        2048
        MaxConnectionsPerChild   10000
    </IfModule>
  3. Если вы вынуждены использовать mpm_prefork, рассчитайте безопасное значение MaxRequestWorkers исходя из доступной RAM:
    # 1. Узнайте среднее потребление памяти одним процессом Apache:
    ps -ylC apache2 --sort:rss | awk '{sum+=$8; ++n} END {print "Avg RAM per worker (MB):", sum/(n-1)/1024}'
    
    # 2. Формула: MaxRequestWorkers = (Доступная RAM для Apache) / (Средний размер воркера)
  4. Пропишите рассчитанные значения для mpm_prefork.conf:
    <IfModule mpm_prefork_module>
        ServerLimit             150
        MaxRequestWorkers       150
        MaxConnectionsPerChild  3000
    </IfModule>
  5. Проверьте синтаксис и перезапустите веб-сервер:
    sudo apache2ctl configtest && sudo systemctl restart apache2
Опасность переполнения памяти (OOM): В mpm_prefork бездумное увеличение MaxRequestWorkers (например, до 1000) при среднем размере процесса PHP в 80 МБ потребует 80 ГБ оперативной памяти. Если памяти не хватит, система зависнет и Linux OOM Killer уничтожит MySQL или Apache.
Практический опыт инженера: Если сервер упирается в AH00161 из-за зависших PHP-скриптов, увеличение `MaxRequestWorkers` только ускорит падение сервера. Сначала оптимизируйте slow query в БД и уменьшите `Timeout` в Apache до 15-30 секунд.

Частые вопросы (FAQ)

Что такое MaxRequestWorkers?

Это директива Apache 2.4 (в Apache 2.2 называлась MaxClients), которая задает жесткий предел на максимальное количество одновременных запросов, которые веб-сервер способен обслуживать в единицу времени.

Чем MaxRequestWorkers отличается от ServerLimit?

ServerLimit задает максимальное число процессов Apache. В многопоточных MPM (event/worker) MaxRequestWorkers равен произведению ServerLimit на ThreadsPerChild.

Зачем нужна директива MaxConnectionsPerChild?

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

Почему mpm_event эффективнее mpm_prefork?

mpm_event использует выделенные потоки для удержания Keep-Alive соединений без блокировки тяжелых рабочих воркеров, требуя в 5-10 раз меньше оперативной памяти при аналогичном RPS.