Финальное исправление WebSocket 1002 для аудиоустройств
Проблема
При попытке установить аудиоустройства возникает ошибка "не удается установить WebSocket (ошибка 1002)".
Диагностика
Ошибки в логах:
-
Nginx error.log:
auth request unexpected status: 500 request: "GET /bbb-webrtc-sfu?sessionToken=co9ftgqf3ttlagjn" -
bbb-web logs:
NullPointerException occurred when processing request: [GET] /bigbluebutton/connection/checkAuthorization%3FsessionToken=$session_token
Корневая причина:
- Переменная не подставляется -
$session_tokenпередается буквально, а не подставляется - map не работает -
$session_token_from_argsможет быть пустой или недоступной - 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
Объяснение
set $session_token $arg_sessionToken;- ИзвлекаетsessionTokenиз query параметров оригинального запроса к/bbb-webrtc-sfuauth_request /bigbluebutton/connection/checkAuthorization?sessionToken=$session_token;- ПередаетsessionTokenявно вauth_requestproxy_pass ...$is_args$args;- Передает все query параметры (включаяsessionToken) в backend
Проверка
После применения исправления:
- ✅ Проверить, что nginx конфигурация валидна
- ✅ Попробовать подключиться к встрече и установить аудиоустройства
- ✅ Проверить логи nginx на отсутствие ошибок 500
- ✅ Проверить логи bbb-web на отсутствие
NullPointerException
Ожидаемый результат
После исправления:
- checkAuthorization должен получать sessionToken и возвращать 200 OK
- NullPointerException должен исчезнуть
- WebSocket соединение должно устанавливаться успешно
- Аудиоустройства должны подключаться без ошибки 1002
Если проблема сохраняется
Если проблема все еще возникает, возможно, нужно:
- Проверить версию BigBlueButton - возможно, есть известная проблема
- Временно отключить auth_request - для диагностики (небезопасно для продакшена)
- Использовать другой endpoint - например,
legacyCheckAuthorization - Изменить код 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 из заголовков