Nginx Linux (Nginx)

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

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

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

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

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

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

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

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

Возможная причинаКак узнатьЧто делать
Лимит тела запросаОграничение может быть на стороне Nginx, PHP или приложения.Ошибка 413 Request Entity Too LargeПроверить client_max_body_size и лимиты приложения
Тайм-аут/буферизацияБольшой объём дольше передаётся по сети и через прокси.Соединение прерывается по времени, в журнале есть client timed outСопоставить время и точку обрыва
Проблема конкретного HTTP/2-клиента или проксиСетевая цепочка может различаться для протоколов.HTTP/1.1 проходит, HTTP/2 падаетСравнить протоколы с одним файлом

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

  1. Определите характер сбояВо вкладке «Сеть» браузера выберите запрос загрузки. Запишите код HTTP, размер файла, длительность, протокол и текст ошибки. Не выкладывайте сам файл, если он содержит личные данные. Повторите с маленьким файлом такого же типа, чтобы увидеть порог.
  1. Сравните HTTP/1.1 и HTTP/2 на тестовом файлеЕсли вы владеете тестовым маршрутом загрузки, отправьте один и тот же безопасный небольшой файл двумя протоколами при одинаковой авторизации. Убедитесь, что ваша версия curl поддерживает HTTP/2; флаги --http1.1/--http2 влияют только на соединение клиента с публичной точкой, а не автоматически на соединение до приложения.
    Linux · Терминал (Bash)Команда
    HEAD проверяет заголовки и согласованный протокол, но не воспроизводит саму загрузку.
    curl -V
    curl -I --http1.1 https://example.com/upload
    curl -I --http2 https://example.com/upload
  1. Проверьте ошибку Nginx и лимитыЧерез SSH найдите error_log и действующие client_max_body_size, client_body_timeout, proxy_request_buffering или fastcgi_request_buffering. Для 413 отдельно сравните лимиты приложения PHP (upload_max_filesize и post_max_size). Не устанавливайте чрезмерный размер без оценки места временного хранилища.
    Linux · Терминал (Bash)КомандаНужен sudo
    Конфигурация может содержать закрытые параметры.
    sudo nginx -T 2>&1 | grep -nE "client_max_body_size|client_body_timeout|proxy_request_buffering|fastcgi_request_buffering|error_log"
  1. Проверьте временный каталог и местоЕсли загрузка буферизуется, Nginx может писать тело во временные файлы. Посмотрите error_log на записи о невозможности записи и df -h для соответствующего раздела. Не удаляйте временные файлы вручную на работающем сервере.
  2. Только чтение; используйте фактические пути из журнала
    Linux · Терминал (Bash)КомандаНужен sudo
    Только чтение; используйте фактические пути из журнала.
    df -h
    sudo journalctl -u nginx -n 60 --no-pager
  1. Учитывайте версию HTTP/2В nginx -V проверьте сборку, в конфигурации — директиву http2 on для новых версий или старый синтаксис listen ... http2 для установленных старых. Не смешивайте синтаксис разных версий. Известное ограничение буферизации тел запросов относится к очень старым релизам до 1.9.14 и не должно применяться как универсальное объяснение.
    Linux · Терминал (Bash)Команда
    Сообщает установленную версию.
    nginx -v
  1. Исправьте установленную причину и проверьте реальной загрузкойСохраните конфигурацию и настройку приложения. Если доказан 413, согласуйте допустимый размер на каждом слое и выделите место; если time-out, исследуйте пропускную способность/скорость чтения backend; если сбой только HTTP/2, проверьте промежуточные прокси и журнал. Запустите nginx -t, после успешного теста — reload.
    Linux · Терминал (Bash)С осторожностьюНужен sudo
    Не повышайте лимиты бесконтрольно; после изменений выполнить проверку.
    sudo nginx -t

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

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

Отправьте тестовые файлы ниже и выше прежнего порога; сравните ответ в HTTP/1.1 и HTTP/2, запись Nginx и факт появления файла в приложении. Возврат 200 от страницы загрузки не гарантирует, что файл действительно сохранён.

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

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

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

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

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