Что означает ERR_SPDY_PROTOCOL_ERROR в nginx?
Я и несколько моих коллег получили net::ERR_SPDY_PROTOCOL_ERROR
ошибка.
Мы используем ngnix версии 1.8.0. Ошибка не является стабильной (трудно реплицируется), и журнал ошибок Ngnix не имеет этой ошибки.
Как бы вы посоветовали нам поймать и решить эту проблему?
11 ответов
Я сталкивался с этим вопросом, пытаясь найти помощь по проблеме, с которой столкнулся ERR_SPDY_PROTOCOL_ERROR
на хром. Думал, что это может принести пользу другим.
Наша ситуация / решение: Мы используем балансировщик нагрузки приложений AWS, подключенный к экземплярам EC2. Один из сценариев, которые мы запускаем на прокси-запросах EC2 из клиентского браузера. Недавно мы обновили скрипт - без соответствующих изменений - и заметили, что запросы Chrome и Safari к прокси-скрипту начали давать сбой. Хром показал ERR_SPDY_PROTOCOL_ERROR
ошибка и, когда мы копались в нем, мы могли видеть, что этот запрос использует HTTP/2. Запросы Firefox продолжали работать нормально.
Наше решение: мы отключили поддержку HTTP / 2 в ALB. Сразу решил проблему.
Команда AWS CLI:
aws elbv2 modify-load-balancer-attributes --load-balancer-arn <your_load_balancer_arn> --attributes Key=routing.http2.enabled,Value=false
У меня была такая же проблема, проверьте, достаточно ли у вас места в разделе / жестком диске Nginx, мы добавили немного, и это сработало для нас.
TL; DR: если вы кэшируете ресурсы, проверьте дисковое пространство на вашем сервере nginx.
Наш сценарий
Я не уверен, где разместить свой ответ на это, так как это может быть крайний случай при получении ERR_SPDY_PROTOCOL_ERROR
в Chrome (и эквивалентная ошибка "сбой загрузки ресурса" в Firefox). Но этот пост помог мне сузить преступника. Это не были заголовки, gzip, перенаправления или adblock/ublock.
У нас есть 2 веб-приложения, развернутые с компьютера, и оба работали отлично. Недавно мы развернули одно из приложений с изменениями в кэшированных ресурсах. После завершения развертывания мы сразу получили ERR_SPDY_PROTOCOL_ERROR
из хрома. Интересно, что он получал HTTP 200
и если вы перейдете к активу напрямую, Chrome отобразит его. Однако загрузка ресурса на страницу может привести к сбою.
Интересно, что другое веб-приложение было прекрасно. Исследуя внутренние сети в Chrome, мы обнаружили, что сервер закрывает соединение. Через несколько часов мы решили, что это потому, что на нашем сервере nginx не хватило места на диске. Я не знаю, почему это привело бы к тому, что ресурсы загружались правильно, когда вы переходите к ним напрямую, но не работали, когда вы загружали страницу, но очистка пространства мгновенно решала проблему.
Как вы можете судить по другим ответам, это может вызывать множество разных вещей. Для меня у меня был искаженный заголовок, который другие браузеры просто игнорировали (дополнительный :
). Единственный ответ на этот вопрос - подсказка по отладке, извлекающая события Chrome net-internals при загрузке испорченной страницы: chrome://net-internals/#events
Для меня, я знал, что это была проблема с заголовком, когда я увидел эту строку
t=65422 [st=53] HTTP_TRANSACTION_READ_HEADERS [dt=4]
--> net_error = -337 (ERR_SPDY_PROTOCOL_ERROR)
После удаления лишнего :
из ответа заголовка HTTP/2 начал работать в Chrome. Я предлагаю получить сырой ответ от вашего сервера и провести очень тщательную проверку, чтобы убедиться в отсутствии синтаксических ошибок.
Кажется, есть много потенциальных причин. Сегодня я ударил заголовок
add_header X-Frame-Options: отказать;
Текущий chrome почему-то откажется от этого с помощью ssl+http2. Другие заголовки X-Frame, похоже, не являются проблемой.
Для меня это была конфигурация Nginx, которая не позволяла использовать метод OPTIONS. У меня был только белый список GET|PUT|POST|DELETE, поэтому, когда Chrome пытался отправить метод OPTIONS, потому что Бог знает, почему **, ошибка воспроизводилась.
Откройте Firefox и повторите запрос, затем посмотрите на Инспектора сети, чтобы проверить, отправляются ли какие-либо OPTIONS-запросы.
** возможно, для проверки X-Frame-Options или проверки HSTS.
Это известная проблема, которая существует между браузерами Chromium и некоторыми антивирусными программами, такими как AVG и Avast, особенно при использовании соединения SSL. Это не может быть решено на стороне пользователя. Разработчики веб-сайтов должны предотвратить возникновение этой проблемы.
Документация для веб-разработчиков находится здесь: http://dev.chromium.org/spdy/spdy-best-practices
Вот несколько полезных советов для разработчиков, которые конкретно не упомянуты в этой статье:
- Будьте предельно осторожны при использовании заголовков и перенаправлений, особенно 301 и 302
- Храните все свои включения в том же каталоге, что и для доступа к имени домена, но не выше каталога на сервере. Антивирус не может получить к ним доступ там. Чтобы защитить файлы включения, создайте файл.htaccess в каталоге включений и просто напишите одну строку: Запретить все
- Включить сжатие Gzip. Если вы используете cPanel, это можно сделать в настройках оптимизации вашего сайта.
- Держите ваш файл.htaccess простым. Переключение выходов сервера для создания различных расширений файлов и перенаправление пользовательских клиентов создаст ненужный конфликт.
По моему опыту, эта проблема возникает только при использовании сеансов для хранения и передачи данных. Cookies, Get и Post, похоже, не пострадали.
Надеюсь это поможет.
Если вы получаете
ERR_HTTP2_PROTOCOL_ERROR
ИЛИ
ERR_SPDY_PROTOCOL_ERROR
в браузере Chrome или Safari с помощью Nginx Content-Security-Policy сначала проверьте эту проблему, открыв скрытый интерфейс Chrome: chrome://net-internals/#events
и выбрав кнопку "живые сеансы HTTP/2" на вкладке HTTP/2.
Если после обновления вы получите что-либо подобное нижеприведенному для вашего домена:
HTTP2_SESSION_RECV_INVALID_HEADER
-> error = "Недействительный символ в имени заголовка."
Вы должны написать заголовок CSP следующим способом:
add_header Content-Security-Policy "<values>";
У меня этот метод сработал.
ПРИМЕЧАНИЕ: Пробелы не допускаются в CSP. Используйте пробел, чтобы различать только параметр политики и его значение. Чтобы воспроизвести эту проблему в Chrome, вы можете использоватьadd_header Content-Security-Policy: "<values>";
которые имеют дополнительные :
который будет считаться недействительным.
У меня был сайт, который делал это, оказалось, что кто-то забыл поместить "Location: " в редиректе PHP на первую строку index.php, лишив заголовка недействительностью. Хотя, видимо, заботился только о Chrome, остальные браузеры по-прежнему загружали его нормально.
Как и в случае с OP, для меня это была проблема с перебоями, возникающая только при запросах AJAX размером более 2 МБ.
Проблема начала возникать после того, как мы перешли с классического ELB AWS на ALB.
Я решил это, удалив Chrome, удалив мой профиль пользователя (на Mac удалите содержимое ~/Library/Application Support/Google/Chrome
), затем переустановка.
Проверьте местоположение вашего кеша прокси - проверьте, существует ли он, есть ли место, и что разрешения и владелец позволяют nginx
Процесс записи в путь.
например, nginx.conf (фрагмент)
proxy_cache_path /proxy_cache levels=1:2 keys_zone=danger_zone:10m inactive=60m;
... тогда проверьте /proxy_cache
путь принадлежит и доступен для записи nginx
,
В моем случае я решил эту проблему, увеличив размер чанка:
http2_chunk_size 300k;
Я видел эту ошибку недавно после обновления сервера.
Я видел это для всех пользователей в Chrome, но только с перерывами.
Мне удалось решить эту проблему для всех пользователей, заставив их использовать функцию обновления Chrome "Очистить кэш и полная перезагрузка" для сайта. (F12 для инструментов Chrome, щелкните правой кнопкой мыши кнопку обновления)
Я подозреваю, что это связано с тем, что кешируется информация об используемых сертификатах SSL.
Наша нынешняя структура была
AWS ELB=>Nginx=>JBoss
Это вызвало ту же ошибку crome. ERR_SPDY_PROTOCOL_ERROR
Он работал нормально без http2, который по умолчанию включен в ELB, мы не хотели, чтобы он был отключен. При дальнейшем исследовании было замечено, что наш сервер JBoss сжимал ответ, мы отключили его, и все работало нормально.