API Sinatra/Nginx/ELBv2 генерирует ERR_SPDY_PROTOCOL_ERROR только для Chrome 58 или выше

У меня есть API со следующим стеком:

Sinatra <=HTTPS/TLS=> Nginx <=HTTPS/TLS=> ALB(ELBv2)

Это базовый сокращатель URL, который отправляет 301 перенаправление в браузер, чтобы перейти на более длинный URL. Это работало безупречно в течение года или двух, но начиная с Chrome 58, я теперь получаю ERR_SPDY_PROTOCOL_ERROR при перенаправлениях из API в Chrome. Обычные страницы возвращаются просто отлично, а другие браузеры работают нормально. Ответ определенно отправляется ALB, поскольку я вижу поток трафика, и в CloudWatch или в журналах не сообщается об ошибках ни для Nginx, ни для Sinatra.

Я открыл заявку с помощью службы поддержки AWS, но я не получил от нее особой пользы. Кто-нибудь еще видел нечто подобное? Я даже не уверен, что попытаться это исправить, так как мой nginx даже не настроен на использование SPDY или HTTP2.

РЕДАКТИРОВАТЬ: Вот пример журнала доступа ALB для неудачной попытки и работы (через curl):

h2 2017-06-21T15:30:01.438546Z app/aws-example-net/019315b3036f76ac 184.75.37.61:59367 10.252.14.202:443 0.000 0.004 0.000 301 301 30 1170 "GET https://aws.example.net:443/short/-OpLPG8h HTTP/2.0" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-1:XXXXXXXXXXXX:targetgroup/ecs-prod-e-urlshortener/7c6cddcc83c91aeb "Root=1-594a90f9-41b321bf039f142a083cb587"
h2 2017-06-21T15:30:06.928711Z app/aws-example-net/019315b3036f76ac 184.75.37.61:19376 10.252.14.202:443 0.000 0.004 0.000 301 301 46 1170 "GET https://aws.example.net:443/short/-OpLPG8h HTTP/2.0" "curl/7.50.1" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-1:XXXXXXXXXXXX:targetgroup/ecs-prod-e-urlshortener/7c6cddcc83c91aeb "Root=1-594a90fe-2f1b92043fe3030461e84219"

РЕДАКТИРОВАТЬ 2:

Пример обработанного вывода из curl -vvv:

https://pastebin.com/Ws553Mxj

1 ответ

Мы столкнулись с этой проблемой только сейчас. Наше приложение устанавливало заголовок "Content-Length" и использовало gzip. Очевидно, http/2 не нравится это комбо!

Убрал "Content-Length" и все работает.

Другие вопросы по тегам