Рейтинг:1

Приложение работает локально, но выдает ошибку 502 при запуске в облаке — «ошибка восходящего подключения или отключение/сброс до заголовков. Причина сброса: ошибка протокола»

флаг cn

У меня есть приложение, созданное как образ Docker, который правильно работает локально, но не работает в Google Cloud Run с ошибкой восходящего подключения или отключением/сбросом перед заголовками. Причина сброса: ошибка протокола

Приложение прослушивает 0.0.0.0:8080 и не требует аутентификации.Я запускаю его в Docker локально с помощью

docker run --rm --name myapp -p 8080:8080 myapp:1.0

С помощью curl локально я получаю успешный ответ на /

$ curl -v локальный хост: 8080
* Попытка ::1...
* Установлен TCP_NODELAY
* Подключен к локальному хосту (::1) порт 8080 (#0)
> ПОЛУЧИТЬ/HTTP/1.1
> Хост: локальный: 8080
> Агент пользователя: curl/7.64.1
> Принять: */*
>
< HTTP/1.1 200 ОК
< Тип содержимого: приложение/json
< Варьировать: Происхождение
< Дата: суббота, 24 июля 2021 г., 13:54:11 по Гринвичу
< Длина содержимого: 2
<
* Соединение №0 с хостом localhost осталось нетронутым
OK* Закрытие соединения 0

Я развернул это в облаке Google, работающем как служба, и при выполнении первого запроса я вижу выходные данные журнала из моего приложения в журналах запуска облака, показывающие, что оно запущено и прослушивает порт 8080.

Однако запрос не выполняется с

«Ошибка восходящего подключения или отключение/сброс до заголовков. Причина сброса: ошибка протокола»

Полный вывод из curl -v https://cloudrun-srv-stuff.a.run.app/ составляет

* Попытка 216.239.36.53...
* Установлен TCP_NODELAY
* Подключено к порту cloudrun-srv-lz5wvvl32a-ez.a.run.app (216.239.36.53) 443 (#0)
* ALPN, предлагая h2
* ALPN, предлагающий http/1.1
* успешно установить места проверки сертификата:
* CA-файл: /etc/ssl/cert.pem
  CApath: нет
* TLSv1.2 (OUT), рукопожатие TLS, приветствие клиента (1):
* TLSv1.2 (IN), рукопожатие TLS, приветствие сервера (2):
* TLSv1.2 (IN), рукопожатие TLS, сертификат (11):
* TLSv1.2 (IN), рукопожатие TLS, обмен ключами сервера (12):
* TLSv1.2 (IN), рукопожатие TLS, сервер готов (14):
* TLSv1.2 (OUT), рукопожатие TLS, обмен ключами клиента (16):
* TLSv1.2 (OUT), изменение шифрования TLS, изменение спецификации шифрования (1):
* TLSv1.2 (OUT), рукопожатие TLS, Готово (20):
* TLSv1.2 (IN), изменение шифрования TLS, изменение спецификации шифрования (1):
* TLSv1.2 (IN), рукопожатие TLS, Готово (20):
* SSL-соединение с использованием TLSv1.2/ECDHE-ECDSA-CHACHA20-POLY1305
* ALPN, сервер принят для использования h2
*Сертификат сервера:
* Тема: C=США; ST=Калифорния; L = вид на горы; О = Google LLC; CN=*.a.run.app
* дата начала: 28 июня 01:08:46 2021 по Гринвичу
* срок действия: 20 сентября 01:08:45 2021 по Гринвичу
* subjectAltName: хост "cloudrun-srv-stuff.a.run.app" соответствует сертификату "*.a.run.app"
* эмитент: C=US; O=службы доверия Google; CN=ГТС СА 1O1
* Проверка сертификата SSL в порядке.
* Используя HTTP2, сервер поддерживает многократное использование
* Состояние соединения изменено (HTTP/2 подтверждено)
* Копирование данных HTTP/2 из буфера потока в буфер соединения после обновления: len=0
* Использование идентификатора потока: 1 (простой дескриптор 0x7f83b4810a00)
> ПОЛУЧИТЬ/HTTP/2
> Хост: cloudrun-srv-stuff.a.run.app
> Агент пользователя: curl/7.64.1
> Принять: */*
>
* Состояние соединения изменено (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 502
<длина содержимого: 87
<тип содержимого: текстовый/обычный
<дата: суббота, 24 июля 2021 г., 13:58:13 по Гринвичу
< сервер: Google Frontend
< x-cloud-trace-context: 1370fab1a02839b367048f855593cbef/5890123523738625787;o=1
<alt-svc: h3=":443"; ма=2592000,ч3-29=":443"; ма=2592000,h3-T051=":443"; ма=2592000,h3-Q050=":443"; ма=2592000,h3-Q046=":443"; ма=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ма=2592000; v="46,43"
<

Каковы следующие шаги в отладке этого?

John Hanley avatar
флаг cn
1) Включен ли у вас Cloud Run **сквозной** http2? 2) Показать команду развертывания gcloud. 3) Покажите код, который настраивает прослушиватель приложений. 4) Проверьте журналы Cloud Run для этой службы. 5) Добавьте параметр командной строки curl **--http1.1** и повторите попытку.
флаг cn
Ответ Джона выше был проблемой: сквозной http2 был включен, но мой код Go не поддерживает H2C.
Рейтинг:5
флаг cn

John Hanely's response to my question identified the issue. https://cloud.google.com/run/docs/configuring/http2#console allowed me to disable http/2 end-to-end, and this resolved the issue.

флаг za
Консоль GCP описывает этот параметр просто: «Включить подключения http/2: подключения HTTP/2 к этой версии будут включены». Там не сказано, что он сквозной, и мне интересно, сколько людей также столкнулись с этой проблемой из-за этого.
Reza avatar
флаг pk
У меня такая же проблема, изменение этой опции и повторное развертывание не решают проблему

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.