Заметки 5545 ~ 3 мин.

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

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

Если у вас на сайте периодически стали выдаваться ошибки ERR_HTTP2_PROTOCOL_ERROR по запросу ресурса, то милости прошу под кат

Посты для категории Заметки это наверное мои самые любимые посты) Потому что, обычно в них я пишу то, с чем сталкиваюсь периодически раз в год или два и сам забываю что сделал в прошлый раз для решения проблемы. 

Так, ну раз вы сюда пришли из поисковика или просто читаете вышедший пост, как постоянный читатель :) то скорее всего имеете проблему возникновения ошибки ERR_HTTP2_PROTOCOL_ERROR в браузере, на сайте данная проблема выливается в неподгрузке ресурсов, будь то стили или скрипты, соотвественно визуально вы сразу понимаете, что что-то нето.

Идентифицировать ошибку можно в консоли браузера, для примера вот как-то так:

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

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

Сделать это, конечно можно, и проблема как пользователя возможно будет решена, но если вы разработчик/девопс и после деплоя приложения на сервере у вас возникает данная проблема (что как раз актуально в моем случае), то одними такими действиями вы себе не поможете, что в таком случае можно сделать:

В конфиге вашего виртуального хоста 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.

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

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

Вот как раз нехватка размера буфера и приводит к данной ошибке ERR_HTTP2_PROTOCOL_ERROR в ответ на запрос ресурсов.

Следовательно увеличив размера буфера, например x2:

 fastcgi_buffer_size 16k;
 fastcgi_buffers 8 16k;

вероятность решения проблемы будет 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К и округляем до

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

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


Надеюсь этот пост вам помог решить вашу проблему, буду рад комментариям и вопросам.



Кстати, если вы еще не в нашем уютном телеграм канале "Делаем из мухи слона", то можете присоединиться к нам, ведь можно читать те же посты, но в вашем удобном мессенджере

 

Что думаешь?

Категории
  • PHP 67
  • Заметки 18
  • Безопасность 4
  • Флуд 2
  • Nginx 2
  • ИТ новости 2
  • Видео 1
  • Docker 1
  • Roadmap 1
  • Архитектура 0

Хочешь поддержать сайт?

Делаем из мухи слона

sergeymukhin.com

персональный блог о веб-разработке от Сергея Мухина. Блог был основан в 2018 году, и собирался уделять основное внимание последним тенденциям, учебным пособиям, а также советам и рекомендациям, позволяющим начинающим девелоперам встать быстрее на правильную дорогу веб разработки, но что-то пошло не так 😃

Релизы PHP 8.4

Дата Релиз
4 Июля 2024 Альфа 1
18 Июля 2024 Альфа 2
1 Августа 2024 Альфа 3
13 Августа 2024 Feature freeze
15 Августа 2024 Бета 1
29 Августа 2024 Бета 2
12 Сентября 2024 Бета 3
26 Сентября 2024 RC 1
10 Октября 2024 RC 2
24 Октября 2024 RC 3
7 Ноября 2024 RC 4
21 Ноября 2024 GA

Что нового?