#Симптом и границы применимости
При включении HTTP/2 на Apache крупные загрузки могут обрываться из-за тайм-аута, поведения потока, ограничений тела запроса или конфигурации внешнего прокси. Нельзя автоматически считать любой отказ «ошибкой HTTP/2»: нужно сравнить один и тот же разрешённый файл по HTTP/1.1 и HTTP/2, определив слой, где он отклонён.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Ограничение тела запросаЛимит размера не обязательно связан с HTTP/2. | Ответ 413 на большой файл независимо от протокола | Проверить LimitRequestBody и ограничения приложения |
| Тайм-аут запроса/потокаВ HTTP/2 ожидание данных может отличаться по ограничениям. | Отказ зависит от скорости передачи и появляется после паузы | Проверить mod_reqtimeout и при поддержке H2StreamTimeout |
| Отказ у промежуточного проксиВнешний прокси может отклонять запрос до Apache. | Прямой Apache загружает файл, внешний Nginx/CDN — нет | Сверить ограничения обоих слоёв |
#Пошаговая диагностика и исправление
- Убедитесь, что сайт действительно использует HTTP/2Откройте средства разработчика браузера → «Сеть» и включите столбец «Протокол» (если доступен). Альтернативно используйте curl -I --http2 -v, где сборка curl поддерживает HTTP/2. Отсутствие поддержки в curl не доказывает проблему сайта.Linux · Терминал (Bash)КомандаТерминал клиента с curl, собранным с HTTP/2; в выводе ищите HTTP/2.
curl -I --http2 -v https://example.com/
- Проверьте безопасную тестовую загрузкуИспользуйте только тестовый файл с разрешённым типом и известным размером, без личных данных. Сравните HTTP/1.1 и HTTP/2 на одном и том же тестовом загрузчике, если сервер допускает повторную загрузку. Не применяйте -X POST без понимания endpoint и побочных действий.
- Сравните коды и журнал ошибокВ инструментах браузера на вкладке «Сеть» сохраните HTTP-код и время обрыва. В Apache ErrorLog найдите запись на момент теста. 413, 408, 502 и обрыв TCP имеют разные причины; пользовательское приложение может отдавать собственные 4xx.
- Debian путь примерный; ориентируйтесь на ErrorLog VirtualHostLinux · Терминал (Bash)КомандаНужен sudoDebian путь примерный; ориентируйтесь на ErrorLog VirtualHost.
sudo tail -n 100 /var/log/apache2/error.log
- Найдите параметры mod_http2 и ограничения телаНа SSH выведите загруженные модули и директивы Protocols, LimitRequestBody, RequestReadTimeout, H2StreamTimeout. Последняя директива доступна только начиная с Apache 2.4.55 и не должна добавляться в более раннюю версию.
- Debian пример; отсутствие строки не значит отсутствие ограничения на внешнем проксиLinux · Терминал (Bash)КомандаНужен sudoDebian пример; отсутствие строки не значит отсутствие ограничения на внешнем прокси.
sudo apache2ctl -M | grep -E "http2|reqtimeout"; sudo grep -R -nE "Protocols|LimitRequestBody|RequestReadTimeout|H2StreamTimeout" /etc/apache2/
- Определите ограничение внешнего слояЕсли HTTPS завершается в Nginx или CDN, сравните лимиты и журналы их запросов. Пример: client_max_body_size у Nginx может дать 413 до передачи в Apache. Не поднимайте глобальные ограничения во всех слоях без лимита приложения и доступного места на диске.
- Исправьте подтверждённый параметр с пределомСохраните копию нужного VirtualHost, затем установите обоснованный предел размера/тайм-аута только для загрузочного маршрута, учитывая ограничения и защиту от медленных клиентов. Не отключайте RequestReadTimeout полностью. После изменения выполните Syntax OK и reload.
- Дополнительная команда по темеLinux · Терминал (Bash)С осторожностьюНужен sudoDebian пример, правила могут требовать согласования с другими прокси; у команды только после успешного теста.
sudo apache2ctl -t && sudo systemctl reload apache2Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Проверьте отсутствие побочных эффектовСнова загрузите маленький и большой тестовые файлы по поддерживаемым версиям протокола, проверьте контрольную сумму принятого файла (если приложение позволяет) и диск. Ограничения на тип и авторизацию должны остаться.
#Как проверить результат
Разрешённый тестовый файл проходит по HTTP/2, размер и контрольная сумма совпадают, соответствующая запись приложения подтверждает успех, а HTTP/1.1 продолжает работать. В журнале нет новых ошибок потока.
#Если проблема не устранена
Если только HTTP/2 ломается, соберите точную версию Apache/mod_http2, код и безопасный воспроизводимый сценарий; исследуйте mod_reqtimeout и взаимодействие с backend, не отключая HTTPS.