Входная поддержка для websocket - PullRequest
0 голосов
/ 01 мая 2020

У меня есть jetty веб-приложение, работающее под k8s. Это веб-приложение имеет конечную точку веб-сокета. Развернутая служба предоставляется через вход nginx на https.

Все работает нормально, у меня запущено веб-приложение и веб-сокеты работают нормально (сообщения ie отправляются и принимаются), но веб-сокеты закрыть с кодом ошибки 1006, который, честно говоря, не мешает моему коду работать, но тоже не выглядит хорошо.

Веб-сокет выставлен @ /notifications. В «нормальной» конфигурации, ie, а не k8s, просто программное обеспечение, установленное на виртуальной машине, мне нужно добавить следующее к nginx.conf

location /notifications {
   proxy_pass http://XXX/notifications;
   proxy_read_timeout 3700s;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Origin '';
}

Я попытался сделать это через вход

nginx .ingress.kubernetes.io / configuration-snippet: |

  location /notifications {
    proxy_pass http://webapp:8080/notifications;
    proxy_http_version 1.1;
    proxy_set_header Upgrade "websocket";
    proxy_set_header Connection "Upgrade";
  }

Но это не имеет никакого эффекта, ie Я проверил сгенерированный nginx.conf и нет добавлен такой блок ...

У кого-нибудь были подобные проблемы раньше? Любая подсказка о том, как решить проблему 1006?

1 Ответ

2 голосов
/ 02 мая 2020

1006 означает

Согласно RF C -6455 1006 означает Abnormal Closure:

Используется для указания того, что соединение было закрыто ненормально (то есть без отправки закрытого кадра), когда ожидается код состояния.

Также см. CloseReason.CloseCodes (Java (TM ) EE 7 Спецификации API)

Существует множество возможных причин на сервере или на клиенте.

Ошибки клиента: попробуйте websocket.org Echo Test

Чтобы изолировать и отладить клиентские ошибки, вы можете использовать websocket.org Echo Test

Что касается ошибки сервера

Jetty

Обсуждение, связанное с причалом, здесь: Вопрос относительно ненормального. · Проблема № 604 · eclipse / jetty.project . Но он не содержит никаких решений.

Детектор гонки для golang код сервера

Если ваш сервер написан на golang, вы можете попробовать Data Race Detector - The Go Язык программирования

Гонки данных являются одними из самых распространенных и трудных для отладки типов ошибок в параллельных системах. Гонка данных происходит, когда две программы одновременно обращаются к одной и той же переменной, и по крайней мере один из обращений является записью. Подробнее см. Модель памяти Go .

Вот пример гонки данных, которая может привести к сбоям и повреждению памяти:

func main() {
  c := make(chan bool)
  m := make(map\[string\]string)
  go func() {
      m\["1"\] = "a" // First conflicting access.
      c <- true
  }()
  m\["2"\] = "b" // Second conflicting access.
  <-c
  for k, v := range m {
      fmt.Println(k, v)
  }
}

Кейс для PHP кода

Кейс для PHP кода, обсуждаемого здесь: Очистка закрытого соединения методом close () websocket (1006) · Выпуск № 236 · walkor / Workerman

...