Apache LinuxApache HTTP Server 2.4

Apache: HTTP/2 не включается при работающем HTTPS

  • Обновлено
  • Чтение ≈ 4 минуты
  • Нужны права администратора

Краткий ответ

При корректном сертификате Apache продолжает отдавать HTTP/1.1: как отличить отсутствие mod_http2, ALPN, настройку Protocols и внешний TLS-прокси.

В этой статье
  1. Что означает проблема
  2. Как различить причины
  3. Подробная диагностика и устранение
  4. Как проверить результат
  5. Если проблема не устранена

#Что означает проблема

HTTPS сам по себе не означает HTTP/2. Браузер обычно выбирает h2 через согласование ALPN при установлении TLS. Если клиент подключается к Nginx, а тот перенаправляет запрос в Apache по HTTP/1.1, внешний протокол определяет Nginx, а не внутренний Apache. В Apache mod_http2 работает с разными модулями многопроцессной обработки (MPM), но режим prefork имеет ограничения одновременных потоков.

#Как различить причины

Возможная причинаКак узнатьЧто делать
HTTPS завершает другой серверNginx/CDN принимает соединение и определяет внешнюю версию HTTP.Настройка Apache Protocols не меняет ответ браузеру.Настраивать HTTP/2 на входном TLS-сервере.
Не включён mod_http2 или ProtocolsВ загруженных модулях нет http2_module либо для хоста не задано h2.TLS исправен, но сервер выбирает http/1.1.Проверить загрузку модуля и Protocols для правильного VirtualHost.
ALPN или особенности клиентаКлиентская сборка curl не поддерживает HTTP/2 либо TLS-терминатор не предлагает h2.Разные клиенты сообщают разный протокол; curl --http2 не поддерживается.Проверить возможности клиента и согласование ALPN, не отключая TLS.

#Подробная диагностика и устранение

  1. Уточните, где завершается HTTPSИз схемы проекта выясните, идёт ли браузер непосредственно к Apache или к Nginx/CDN перед ним. Посмотрите HTTPS-ответ во вкладке «Сеть» браузера: в Chrome при необходимости добавьте столбец Protocol через контекстное меню заголовков списка. Если клиент видит h2 с Nginx, внутренний HTTP/1.1 до Apache не считается неисправностью сайта.
  2. Проверьте протокол через подходящий curlОткройте терминал компьютера и выполните curl -V: в списке Features может присутствовать HTTP2. Если есть, запустите `curl --http2 -sS -o /dev/null -w "%{http_version} " https://example.com/`, подставив домен. Ожидаемый вывод 2 при выборе HTTP/2 либо 1.1, если договорились на старый протокол. Если curl пишет, что не поддерживает --http2, это недостаток клиента и не диагноз сервера.
  3. Проверьте список модулей ApacheНа сервере с Debian/Ubuntu через SSH выполните sudo apache2ctl -M и найдите http2_module, ssl_module, а также MPM (mpm_event_module, mpm_worker_module или mpm_prefork_module). Если http2_module отсутствует, узнайте, установлен ли mod_http2 из пакетов ОС. Для типичной системы Debian модуль можно включить через sudo a2enmod http2, но только если он установлен, совместим с вашей конфигурацией и изменения согласованы.
  4. Проверьте настройку именно HTTPS-хостаВыполните sudo apache2ctl -S и найдите хост на порту 443. Посмотрите, какие Protocols установлены для него и нет ли более специфичных правил. Для h2 поверх TLS требуется Protocols h2 http/1.1 в подходящем контексте и работающая TLS-конфигурация с ALPN. Не вставляйте Protocols в .htaccess; директива для этого не предназначена.
  5. Проверьте согласование ALPN, не ослабляя шифрованиеНа компьютере с OpenSSL выполните openssl s_client -connect example.com:443 -servername example.com -alpn h2,http/1.1 </dev/null. Найдите строку ALPN protocol: h2; если выбрана http/1.1, исследуйте настройки входного сервера. Команда не проверяет готовность приложения и может вывести много сведений о TLS; не копируйте весь вывод с личными данными. Сертификат должен оставаться действительным.
  6. Оцените MPM прежде, чем его менятьПроверьте, используется ли PHP через mod_php на prefork или через PHP-FPM. Apache поддерживает mod_http2 с prefork, но официальная документация предупреждает об ограничении параллелизма; переход на event MPM требует проверки обработчика PHP и совместимости модулей. Не переключайте MPM на рабочем сервере только ради показателя h2, без тестового стенда и плана отката.
  7. Примените настройку на верном узлеСкопируйте файл конфигурации HTTPS-хоста. Если Apache принимает TLS, настройте Protocols h2 http/1.1, убедитесь, что модуль доступен, и выполните sudo apache2ctl configtest. После Syntax OK выполните reload Apache. Если TLS завершается в Nginx, настраивайте и тестируйте HTTP/2 именно на нём; не меняйте Apache без причины.
  8. Проверьте страницу, изображения и возврат настройкиПовторите curl с --http2, откройте страницу и несколько ресурсов в браузере, проверьте error.log и отсутствие TLS-ошибок. Если HTTP/2 не выбирается, соберите версии Apache, OpenSSL и клиента, список модулей и цепочку прокси. Если после включения выросли ошибки или нагрузка, восстановите конфигурацию из копии и выполните configtest/reload.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1На компьютере без sudo: сначала проверьте наличие поддержки HTTP2 в curl.
    Linux · Терминал (Bash)Команда
    На компьютере без sudo: сначала проверьте наличие поддержки HTTP2 в curl. Домен замените на свой.
    curl -V
    curl --http2 -sS -o /dev/null -w "%{http_version}\n" https://example.com/
    Вариант 2На сервере Debian/Ubuntu с sudo; -M читает список модулей, configtest проверяет синтаксис.
    Linux · Терминал (Bash)КомандаНужен sudo
    На сервере Debian/Ubuntu с sudo; -M читает список модулей, configtest проверяет синтаксис.
    sudo apache2ctl -M
    sudo apache2ctl configtest
    Вариант 3Фрагмент для иллюстрации: сам по себе неполный VirtualHost и не готовая конфигурация сертификата.
    Текст
    Фрагмент для иллюстрации: сам по себе неполный VirtualHost и не готовая конфигурация сертификата.
    <VirtualHost *:443>
        # Сохраните остальные действующие параметры TLS и сайта.
        Protocols h2 http/1.1
    </VirtualHost>

#Как проверить результат

Внешний TLS-сервер согласует h2 с поддерживающим клиентом, страницы и ресурсы возвращают правильные статусы, сертификат продолжает проверяться. HTTP/1.1 на внутреннем соединении Nginx → Apache может быть нормой.

#Если проблема не устранена

Если curl не поддерживает HTTP2, повторите проверку современным браузером. Если сервер поддерживает, но ALPN выбирает http/1.1, проверяйте Protocols, модуль, TLS-терминатор и ограничения MPM, а не отключайте проверку сертификата.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.