Как устранить ошибку ERR_HTTP2_PROTOCOL_ERROR в браузере

3 мин чтения

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

  • Очистить кэш браузера;
  • Отключить расширения;
  • Отключить QUIC;
  • Отключить средства защиты, типа антивирус или брандмауэр;
  • Проверить корректную время и дату;
  • Включить VPN;
  • Обновить браузер;
  • и др.

Конечно, можно прибегнуть к стандартным советам, которые предлагаются на многих сайтах и могут помочь обычному пользователю решить проблему. Однако, если вы являетесь разработчиком или DevOps-инженером и столкнулись с проблемой после деплоя приложения на сервере, такие действия могут не принести желаемого результата. В подобной ситуации можно предпринять следующие шаги:

В конфиге вашего виртуального хоста nginx есть такие директивы (или определены по умолчанию):

fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;

fastcgi_buffer_size определяет размер буфера, в который будет считываться первая часть ответа от FastCGI-сервера. Обычно в этой части ответа содержится небольшой заголовок. По умолчанию размер буфера равен размеру страницы памяти, который на различных платформах составляет либо 4K, либо 8K. Однако, его можно уменьшить в зависимости от требований.

fastcgi_buffers определяет поведение при включенной буферизации, когда nginx принимает ответ от FastCGI-сервера как можно быстрее, сохраняя его в буферы, заданные директивами fastcgi_buffer_size и fastcgi_buffers.

Если ответ не вмещается целиком в память, то его часть может быть записана на диск во временный файл. Этот процесс контролируется следующими директивами:

  • fastcgi_max_temp_file_size: задает максимальный размер временного файла.
  • fastcgi_temp_file_write_size: определяет размер порции данных, записываемой во временный файл перед сбросом на диск.

Эти параметры позволяют эффективно управлять памятью и дисковым пространством при обработке ответов от FastCGI-сервера, обеспечивая стабильную работу приложения.

Если буферизация выключена, то ответ синхронно передаётся клиенту сразу же по мере его поступления. nginx не пытается считать весь ответ FastCGI-сервера. Максимальный размер данных, который nginx может принять от сервера за один раз, задаётся директивой fastcgi_buffer_size.

Буферизация может быть также включена или выключена путём передачи значения “yes” или “no” в поле “X-Accel-Buffering” заголовка ответа. Эту возможность можно запретить с помощью директивы fastcgi_ignore_headers.

Нехватка размера буфера может приводить к ошибке ERR_HTTP2_PROTOCOL_ERROR при запросе ресурсов. Следовательно, увеличение размера буфера, например, в два раза, может помочь решить эту проблему.

Вот как это можно настроить в конфигурационном файле nginx:

fastcgi_buffer_size 16k; # Увеличиваем размер буфера до 16KB
fastcgi_buffers 4 16k; # Устанавливаем количество буферов и их размер

# Запрещаем использование заголовка для включения буферизации
fastcgi_ignore_headers "X-Accel-Buffering";

Эти изменения позволят nginx обрабатывать более крупные порции данных, что может устранить ошибку ERR_HTTP2_PROTOCOL_ERROR. Убедитесь, что обновляете значения параметров в соответствии с требованиями вашего приложения и конфигурацией сервера.

Вероятность решения проблемы будет 99%. Повторять увеличивать, если проблема будет возвращаться.

Как узнать параметры fastcgi_buffer_size и fastcgi_buffers

Если вы хотите сделать более точную настройку данных директив, то можно узнать максимальный и средний размер пакетов поступающих на nginx и отталкиваясь от данной информации выставить правильные значения.

Максимальный размер: awk '($9 ~ /200/)' access.log | awk '{print $10}' | sort -nr | head -n 1

Обратите внимание, что мы принимаем во внимание только ответ HTTP 200 OK.

Средний размер: echo $(( `awk '($9 ~ /200/)' access.log | awk '{print $10}' | awk '{s+=$1} END {print s}'` / `awk '($9 ~ /200/)' access.log | wc -l` ))

Предположим у вас получились такие значения:

Максимальный 31345 байт (31К и округляем в ближайшую большую сторону 32К)

Средний 6251 байт (6К и округляем до 8К)

Следовательно ваши значения будут такими:

fastcgi_buffer_size 8k; #это значение закрывает среднюю потребность
fastcgi_buffers 4 8k; #это максимальную т.к. 4 * 8К = 32К

Вернуться к блогу