Apache перестаёт отвечать через некоторое время после активации HTTP/2.

Вопрос или проблема

У меня установлен apache 2.4.41 на Ubuntu 20.04, и я запускаю определенное приложение через PHP-FPM, с MPM, установленным на ‘event’. Недавно, чтобы ускорить приложение, я включил HTTP/2 в виртуальном хосте, добавив Protocols h2 http/1.1. Конечно, сначала я проверил, включен ли модуль HTTP2, используя apachectl -M. Я проверил ответ от сервера: HTTP/2 работает. Apache2 принимает рукопожатие протокола, и приложение заметно быстрее.

Теперь, спустя несколько дней (или иногда часов) использования, приложение перестает отвечать на запросы. Когда я проверяю htop, я не вижу высоких процессов ЦП или использования памяти. Проверка статуса процессов apache, php-fpm и mariadb также не выявляет ошибок.

Я удалил параметр h2 из директивы Protocols и перезагрузил apache, что решает проблему. Но, конечно, я хотел бы использовать HTTP/2. У кого-нибудь есть идеи, что может быть причиной этого? Какие логи я мог бы проверить, чтобы получить подсказку, или какие тесты я мог бы провести?

Мы сталкиваемся с точно такой же проблемой! На Debian 12 с немного более новой версией Apache 2.4.62…

Мы примерно запустили 100 серверов, все идентичные по оборудованию и конфигурации (развернутые с помощью Ansible). Не все показывают эту проблему, поэтому, похоже, она каким-то образом связана с активностью клиентов.

На серверах с проблемами мы видим в логах много таких сообщений:

[Птн Янв 03 14:32:30.748809 2025] [http2:warn] [pid 703547:tid 703596] [клиент 209.38.101.250:25760] h2_stream(703547-17-1,CLEANUP): started=1, scheduled=1, ready=0, out_buffer=0
[Птн Янв 03 14:33:30.749125 2025] [http2:warn] [pid 703547:tid 703596] [клиент 209.38.101.250:25760] h2_stream(703547-17-1,CLEANUP): started=1, scheduled=1, ready=0, out_buffer=0
[Птн Янв 03 14:34:30.749390 2025] [http2:warn] [pid 703547:tid 703596] [клиент 209.38.101.250:25760] h2_stream(703547-17-1,CLEANUP): started=1, scheduled=1, ready=0, out_buffer=0
[Птн Янв 03 14:35:30.749656 2025] [http2:warn] [pid 703547:tid 703596] [клиент 209.38.101.250:25760] h2_stream(703547-17-1,CLEANUP): started=1, scheduled=1, ready=0, out_buffer=0
[Птн Янв 03 14:37:30.749035 2025] [http2:warn] [pid 703547:tid 703586] [клиент 209.38.101.250:1324] h2_stream(703547-25-1,CLEANUP): started=1, scheduled=1, ready=0, out_buffer=0

Ответ или решение

Описание проблемы

Вы используете Apache 2.4.41 на Ubuntu 20.04 в комбинации с PHP-FPM и MPM, установленным в режим event, чтобы ускорить ваше приложение через активацию HTTP/2. После настройки и включения HTTP/2, сервер работает быстрее, но через некоторое время перестает отвечать на запросы. При этом ни использование процессора, ни памяти не дают поводов для беспокойства. Логи также не показывают ощутимых ошибок, но если убрать параметр h2 из директивы Protocols и перезагрузить Apache, проблема исчезает.

Возможные причины и решения

  1. Проблемы с конфигурацией HTTP/2:

    • Описание: HTTP/2 может иметь специфические ограничения на количество соединений и потока. Модуль HTTP/2 в Apache (mod_http2) может сталкиваться с ситуациями, когда некоторые потоки остаются открытыми без использования.
    • Решение: Проверьте настройки Apache в filehttp2.conf. Настройте параметры, такие как H2MaxSessionStreams и H2StreamMaxMemSize, чтобы убедиться, что потоки правильно обрабатываются и не приводят к зависанию потоков.
  2. Проблемы с MPM Event:

    • Описание: MPM Event, иногда, может неправильно обрабатывать открытие и закрытие потоков в режиме HTTP/2 из-за своей асинхронной природы.
    • Решение: Рассмотрите возможность перехода на другой MPM, например: MPM Worker, чтобы определить, исчезает ли проблема.
  3. Логи и анализ:

    • Описание: Логи содержат многократные предупреждения вроде h2_stream(CLEANUP): started=1, scheduled=1, ready=0, out_buffer=0. Это указывает на то, что некоторые потоки оставляют открытыми.
    • Решение: Убедитесь, что у вас включено максимально подробное логирование (LogLevel для HTTP/2 модуля), которое может дать больше информации о взаимодействиях потока. Проанализируйте журналы через journalctl, access.log и error.log, чтобы понять контекст появления этих сообщений.

Тестирование и дополнительные шаги

  1. Проверьте обновления Apache и модуля HTTP/2: Убедитесь, что ваш Apache и сопутствующие модули являются наиболее актуальными версиями, поскольку в более новых версиях могут быть поправки для подобных багов.

  2. Анализ клиентской активности: Хотя не все серверы испытывают эту проблему, она может быть связана с определенным паттерном запросов от клиентов. Примените анализатор трафика или используйтесь инструментами мониторинга для выявления аномальной активности.

  3. Увеличьте таймауты и лимиты: Попробуйте увеличить значения Timeout, KeepAliveTimeout, и MaxKeepAliveRequests, чтобы предотвратить "замораживание" соединений.

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

Оцените материал
Добавить комментарий

Капча загружается...