#Что означает проблема
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. |
#Подробная диагностика и устранение
- Уточните, где завершается HTTPSИз схемы проекта выясните, идёт ли браузер непосредственно к Apache или к Nginx/CDN перед ним. Посмотрите HTTPS-ответ во вкладке «Сеть» браузера: в Chrome при необходимости добавьте столбец Protocol через контекстное меню заголовков списка. Если клиент видит h2 с Nginx, внутренний HTTP/1.1 до Apache не считается неисправностью сайта.
- Проверьте протокол через подходящий curlОткройте терминал компьютера и выполните
curl -V: в списке Features может присутствовать HTTP2. Если есть, запустите `curl --http2 -sS -o /dev/null -w "%{http_version} " https://example.com/`, подставив домен. Ожидаемый вывод 2 при выборе HTTP/2 либо 1.1, если договорились на старый протокол. Если curl пишет, что не поддерживает --http2, это недостаток клиента и не диагноз сервера. - Проверьте список модулей 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, но только если он установлен, совместим с вашей конфигурацией и изменения согласованы. - Проверьте настройку именно HTTPS-хостаВыполните
sudo apache2ctl -Sи найдите хост на порту 443. Посмотрите, какиеProtocolsустановлены для него и нет ли более специфичных правил. Для h2 поверх TLS требуетсяProtocols h2 http/1.1в подходящем контексте и работающая TLS-конфигурация с ALPN. Не вставляйте Protocols в .htaccess; директива для этого не предназначена. - Проверьте согласование 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; не копируйте весь вывод с личными данными. Сертификат должен оставаться действительным. - Оцените MPM прежде, чем его менятьПроверьте, используется ли PHP через mod_php на prefork или через PHP-FPM. Apache поддерживает mod_http2 с prefork, но официальная документация предупреждает об ограничении параллелизма; переход на event MPM требует проверки обработчика PHP и совместимости модулей. Не переключайте MPM на рабочем сервере только ради показателя h2, без тестового стенда и плана отката.
- Примените настройку на верном узлеСкопируйте файл конфигурации HTTPS-хоста. Если Apache принимает TLS, настройте
Protocols h2 http/1.1, убедитесь, что модуль доступен, и выполнитеsudo apache2ctl configtest. После Syntax OK выполните reload Apache. Если TLS завершается в Nginx, настраивайте и тестируйте HTTP/2 именно на нём; не меняйте Apache без причины. - Проверьте страницу, изображения и возврат настройкиПовторите curl с
--http2, откройте страницу и несколько ресурсов в браузере, проверьте error.log и отсутствие TLS-ошибок. Если HTTP/2 не выбирается, соберите версии Apache, OpenSSL и клиента, список модулей и цепочку прокси. Если после включения выросли ошибки или нагрузка, восстановите конфигурацию из копии и выполните configtest/reload. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Как проверить результат
Внешний TLS-сервер согласует h2 с поддерживающим клиентом, страницы и ресурсы возвращают правильные статусы, сертификат продолжает проверяться. HTTP/1.1 на внутреннем соединении Nginx → Apache может быть нормой.
#Если проблема не устранена
Если curl не поддерживает HTTP2, повторите проверку современным браузером. Если сервер поддерживает, но ALPN выбирает http/1.1, проверяйте Protocols, модуль, TLS-терминатор и ограничения MPM, а не отключайте проверку сертификата.