Apache Linux (Apache HTTP Server 2.4)

Apache — при переходе на HTTP/2 перестаёт работать загрузка больших файлов

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

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

При включении HTTP/2 на Apache крупные загрузки могут обрываться из-за тайм-аута, поведения потока, ограничений тела запроса или конфигурации внешнего прокси. Нельзя автоматически считать любой отказ «ошибкой HTTP/2»: нужно сравнить один и тот же разрешённый файл по HTTP/1.1 и HTTP/2, определив слой, где он отклонён.

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

#Симптом и границы применимости

При включении HTTP/2 на Apache крупные загрузки могут обрываться из-за тайм-аута, поведения потока, ограничений тела запроса или конфигурации внешнего прокси. Нельзя автоматически считать любой отказ «ошибкой HTTP/2»: нужно сравнить один и тот же разрешённый файл по HTTP/1.1 и HTTP/2, определив слой, где он отклонён.

#Возможные причины и как их отличить

Возможная причинаКак узнатьЧто делать
Ограничение тела запросаЛимит размера не обязательно связан с HTTP/2.Ответ 413 на большой файл независимо от протоколаПроверить LimitRequestBody и ограничения приложения
Тайм-аут запроса/потокаВ HTTP/2 ожидание данных может отличаться по ограничениям.Отказ зависит от скорости передачи и появляется после паузыПроверить mod_reqtimeout и при поддержке H2StreamTimeout
Отказ у промежуточного проксиВнешний прокси может отклонять запрос до Apache.Прямой Apache загружает файл, внешний Nginx/CDN — нетСверить ограничения обоих слоёв

#Пошаговая диагностика и исправление

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

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. Проверьте отсутствие побочных эффектовСнова загрузите маленький и большой тестовые файлы по поддерживаемым версиям протокола, проверьте контрольную сумму принятого файла (если приложение позволяет) и диск. Ограничения на тип и авторизацию должны остаться.

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

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

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

Если только HTTP/2 ломается, соберите точную версию Apache/mod_http2, код и безопасный воспроизводимый сценарий; исследуйте mod_reqtimeout и взаимодействие с backend, не отключая HTTPS.

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

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

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