#Симптом и границы применимости
После включения 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 падает | Сравнить протоколы с одним файлом |
#Пошаговая диагностика и исправление
- Определите характер сбояВо вкладке «Сеть» браузера выберите запрос загрузки. Запишите код HTTP, размер файла, длительность, протокол и текст ошибки. Не выкладывайте сам файл, если он содержит личные данные. Повторите с маленьким файлом такого же типа, чтобы увидеть порог.
- Сравните HTTP/1.1 и HTTP/2 на тестовом файлеЕсли вы владеете тестовым маршрутом загрузки, отправьте один и тот же безопасный небольшой файл двумя протоколами при одинаковой авторизации. Убедитесь, что ваша версия curl поддерживает HTTP/2; флаги --http1.1/--http2 влияют только на соединение клиента с публичной точкой, а не автоматически на соединение до приложения.Linux · Терминал (Bash)КомандаHEAD проверяет заголовки и согласованный протокол, но не воспроизводит саму загрузку.
curl -Vcurl -I --http1.1 https://example.com/uploadcurl -I --http2 https://example.com/upload
- Проверьте ошибку 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"
- Проверьте временный каталог и местоЕсли загрузка буферизуется, Nginx может писать тело во временные файлы. Посмотрите error_log на записи о невозможности записи и df -h для соответствующего раздела. Не удаляйте временные файлы вручную на работающем сервере.
- Только чтение; используйте фактические пути из журналаLinux · Терминал (Bash)КомандаНужен sudoТолько чтение; используйте фактические пути из журнала.
df -hsudo journalctl -u nginx -n 60 --no-pager
- Учитывайте версию HTTP/2В nginx -V проверьте сборку, в конфигурации — директиву http2 on для новых версий или старый синтаксис listen ... http2 для установленных старых. Не смешивайте синтаксис разных версий. Известное ограничение буферизации тел запросов относится к очень старым релизам до 1.9.14 и не должно применяться как универсальное объяснение.Linux · Терминал (Bash)КомандаСообщает установленную версию.
nginx -v
- Исправьте установленную причину и проверьте реальной загрузкойСохраните конфигурацию и настройку приложения. Если доказан 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 приводит к сбоям у отдельных клиентов, зафиксируйте версии и сетевую цепочку перед изменением протокола для всех.