Устранение проблем с WebSocket в BigBlueButton

Проблема: Ошибка WebSocket 1002

Симптомы

  • После авторизации и создания комнаты появляется ошибка: "Не удалось установить WebSocket соединение (ошибка 1002)"
  • HTML5 клиент не может подключиться к серверу
  • Аудио/видео не работает

Причины

Ошибка 1002 (Protocol Error) в WebSocket обычно возникает из-за:
1. Неправильной конфигурации Nginx для проксирования WebSocket
2. Отсутствия заголовков Upgrade и Connection
3. Неправильных таймаутов для WebSocket соединений
4. Проблем с SSL/TLS при использовании wss://

Решение

Шаг 1: Проверка конфигурации Nginx

Убедитесь, что в конфигурации Nginx для BigBlueButton присутствуют следующие настройки:

# WebSocket поддержка
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

# Увеличенные таймауты
proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;

# Отключение буферизации
proxy_buffering off;
proxy_cache off;

Шаг 2: Использование правильного шаблона конфигурации

Используйте шаблон templates/nginx-bigbluebutton.conf для настройки Nginx:

  1. Скопируйте шаблон:
sudo cp /home/cdto/DENKART/templates/nginx-bigbluebutton.conf /etc/nginx/sites-available/school.cdto.life
  1. Отредактируйте файл:
sudo nano /etc/nginx/sites-available/school.cdto.life
  1. Замените:
  2. school.cdto.life на ваш домен (если отличается)
  3. 10.218.14.37 на IP адрес контейнера BBB-CONT22-1
  4. Пути к SSL сертификатам (если используются)

  5. Активируйте конфигурацию:

sudo ln -s /etc/nginx/sites-available/school.cdto.life /etc/nginx/sites-enabled/
  1. Проверьте конфигурацию:
sudo nginx -t
  1. Перезагрузите Nginx:
sudo systemctl reload nginx

Шаг 3: Проверка проброса портов LXD

Убедитесь, что порты правильно проброшены из контейнера на хост:

# Проверка проброса портов
lxc config device list BBB-CONT22-1

# Если порты не проброшены, добавьте их:
lxc config device add BBB-CONT22-1 http proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80
lxc config device add BBB-CONT22-1 https proxy listen=tcp:0.0.0.0:443 connect=tcp:127.0.0.1:443

Шаг 4: Проверка логов

Проверьте логи Nginx на наличие ошибок:

# Логи ошибок
sudo tail -f /var/log/nginx/school.cdto.life.error.log

# Логи доступа
sudo tail -f /var/log/nginx/school.cdto.life.access.log

Ищите ошибки, связанные с:
- upstream prematurely closed connection
- upstream timed out
- SSL handshake failed

Шаг 5: Проверка BigBlueButton в контейнере

Проверьте, что BigBlueButton работает внутри контейнера:

# Вход в контейнер
lxc exec BBB-CONT22-1 -- bash

# Проверка статуса сервисов
systemctl status bbb-web
systemctl status bbb-html5

# Проверка логов
journalctl -u bbb-web -n 50
journalctl -u bbb-html5 -n 50

Шаг 6: Проверка сетевого подключения

Проверьте доступность BigBlueButton из контейнера Nginx:

# Из контейнера с Nginx
curl -I http://10.218.14.37
curl -I http://10.218.14.37/html5client

Шаг 7: Проверка SSL/TLS

Если используется HTTPS, убедитесь, что SSL сертификаты корректны:

# Проверка сертификата
sudo certbot certificates

# Проверка SSL соединения
openssl s_client -connect school.cdto.life:443 -servername school.cdto.life

Дополнительные настройки

Увеличение лимитов Nginx

Если проблемы сохраняются, увеличьте лимиты в /etc/nginx/nginx.conf:

http {
    # Увеличение буферов
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

    # Увеличение таймаутов
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    proxy_read_timeout 600;

    # Размер тела запроса
    client_max_body_size 100M;
}

Проверка файрвола

Убедитесь, что порты открыты:

# Проверка UFW
sudo ufw status

# Если нужно, откройте порты
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 16384:32768/udp
sudo ufw allow 16384:32768/tcp

Диагностика

Тест WebSocket соединения

Используйте браузерную консоль для проверки WebSocket:

// В консоли браузера (F12)
const ws = new WebSocket('wss://school.cdto.life/ws');
ws.onopen = () => console.log('WebSocket connected');
ws.onerror = (error) => console.error('WebSocket error:', error);
ws.onclose = (event) => console.log('WebSocket closed:', event.code, event.reason);

Проверка заголовков

Проверьте заголовки ответа сервера:

curl -I -H "Upgrade: websocket" -H "Connection: Upgrade" https://school.cdto.life/ws

Должны присутствовать:
- Upgrade: websocket
- Connection: upgrade

Полезные ссылки

Контакты и поддержка

Если проблема не решена:
1. Проверьте логи BigBlueButton: /var/log/bigbluebutton/
2. Проверьте логи Nginx: /var/log/nginx/
3. Проверьте документацию BigBlueButton
4. Создайте issue с подробным описанием проблемы