Финальное исправление WebSocket 1002 для аудиоустройств

Проблема

При попытке установить аудиоустройства возникает ошибка "не удается установить WebSocket (ошибка 1002)".

Диагностика

Ошибки в логах:

  1. Nginx error.log:
    auth request unexpected status: 500 request: "GET /bbb-webrtc-sfu?sessionToken=co9ftgqf3ttlagjn"

  2. bbb-web logs:
    NullPointerException occurred when processing request: [GET] /bigbluebutton/connection/checkAuthorization%3FsessionToken=$session_token

Корневая причина:

  1. Переменная не подставляется - $session_token передается буквально, а не подставляется
  2. map не работает - $session_token_from_args может быть пустой или недоступной
  3. URL encoding - %3F вместо ? указывает на неправильную обработку query параметров

Решение

Упростить конфигурацию и использовать прямую передачу sessionToken из оригинального запроса:

1. /usr/share/bigbluebutton/nginx/webrtc-sfu.nginx:

location /bbb-webrtc-sfu {
    set $session_token $arg_sessionToken;
    auth_request /bigbluebutton/connection/checkAuthorization?sessionToken=$session_token;
    # ... остальные настройки
}

2. /usr/share/bigbluebutton/nginx/web.nginx:

location = /bigbluebutton/connection/checkAuthorization {
    internal;
    proxy_pass http://127.0.0.1:8090/bigbluebutton/connection/checkAuthorization$is_args$args;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}

Применение исправления

# 1. Упростить webrtc-sfu.nginx
lxc exec BBB-CONT22-1 -- sed -i 's|set \$session_token \$session_token_from_args;|set $session_token $arg_sessionToken;|' /usr/share/bigbluebutton/nginx/webrtc-sfu.nginx

# 2. Упростить web.nginx
lxc exec BBB-CONT22-1 -- sed -i 's|proxy_pass.*http://127.0.0.1:8090/bigbluebutton/connection/checkAuthorization?sessionToken=\$auth_session_token;|proxy_pass               http://127.0.0.1:8090/bigbluebutton/connection/checkAuthorization\$is_args\$args;|' /usr/share/bigbluebutton/nginx/web.nginx

# 3. Удалить лишние проверки
lxc exec BBB-CONT22-1 -- sed -i '/set \$auth_session_token/,/set \$auth_session_token \$http_x_session_token;/d' /usr/share/bigbluebutton/nginx/web.nginx

# 4. Проверить конфигурацию
lxc exec BBB-CONT22-1 -- nginx -t

# 5. Перезагрузить nginx
lxc exec BBB-CONT22-1 -- systemctl reload nginx

Объяснение

  1. set $session_token $arg_sessionToken; - Извлекает sessionToken из query параметров оригинального запроса к /bbb-webrtc-sfu
  2. auth_request /bigbluebutton/connection/checkAuthorization?sessionToken=$session_token; - Передает sessionToken явно в auth_request
  3. proxy_pass ...$is_args$args; - Передает все query параметры (включая sessionToken) в backend

Проверка

После применения исправления:

  1. ✅ Проверить, что nginx конфигурация валидна
  2. ✅ Попробовать подключиться к встрече и установить аудиоустройства
  3. ✅ Проверить логи nginx на отсутствие ошибок 500
  4. ✅ Проверить логи bbb-web на отсутствие NullPointerException

Ожидаемый результат

После исправления:
- checkAuthorization должен получать sessionToken и возвращать 200 OK
- NullPointerException должен исчезнуть
- WebSocket соединение должно устанавливаться успешно
- Аудиоустройства должны подключаться без ошибки 1002

Если проблема сохраняется

Если проблема все еще возникает, возможно, нужно:

  1. Проверить версию BigBlueButton - возможно, есть известная проблема
  2. Временно отключить auth_request - для диагностики (небезопасно для продакшена)
  3. Использовать другой endpoint - например, legacyCheckAuthorization
  4. Изменить код bbb-web - для поддержки чтения sessionToken из заголовков

Дополнительная информация

Почему это должно работать:

  • $arg_sessionToken извлекает значение параметра sessionToken из query строки оригинального запроса
  • Переменная $session_token сохраняет это значение
  • В auth_request мы явно передаем sessionToken через query параметр
  • checkAuthorization получает sessionToken через $is_args$args и может его обработать

Альтернативные решения:

Если это решение не работает, можно попробовать:
1. Передать sessionToken через заголовки HTTP
2. Использовать map для глобального извлечения sessionToken
3. Изменить код bbb-web для извлечения sessionToken из заголовков