Решение проблемы с маршрутизацией HTTPS через HAProxy

Дата: 2026-01-08
Статус: ✅ Полностью решено

Проблема

HAProxy работал в режиме TCP и перенаправлял весь HTTPS трафик на порты 81/82 (BigBlueButton), минуя конфигурацию Nginx для denkart.cdto.life и docs.cdto.life. Это означало, что запросы на https://denkart.cdto.life/ попадали на BigBlueButton, а не на Cockpit.

Решение

1. Изменение HAProxy на HTTP режим

HAProxy был изменен с TCP режима на HTTP режим для возможности маршрутизации по Host заголовку:

frontend https_frontend
  bind *:443,:::443 ssl crt /etc/haproxy/certbundle.pem ssl-min-ver TLSv1.2 alpn h2,http/1.1
  mode http
  option httplog

  # Маршрутизация на основе Host заголовка
  acl host_denkart hdr(host) -i denkart.cdto.life
  acl host_docs hdr(host) -i docs.cdto.life
  acl host_school hdr(host) -i school.cdto.life
  acl is_h2 ssl_fc_alpn -i h2
  acl is_http11 ssl_fc_alpn -i http/1.1

  # Для denkart.cdto.life и docs.cdto.life - проксировать на Nginx на порту 8443
  use_backend nginx-8443 if host_denkart or host_docs

  # Для school.cdto.life - использовать порт 81 (HTTP/1.1) для всех запросов
  # Это решает проблему с "broken header" при использовании HTTP/2
  use_backend nginx if host_school

  # По умолчанию - BigBlueButton (для обратной совместимости)
  default_backend nginx

2. Настройка Nginx на порту 8443

Nginx был настроен для прослушивания на порту 8443 (HTTP, без SSL, так как HAProxy выполняет SSL терминацию):

# Домен: denkart.cdto.life - HTTP проксирование в docs-denkart
server {
    listen 127.0.0.1:8443;
    listen [::1]:8443;
    server_name denkart.cdto.life;

    location / {
        proxy_pass http://10.218.14.102:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

3. Backend для маршрутизации

# Backend для denkart.cdto.life и docs.cdto.life
backend nginx-8443
  mode http
  server localhost 127.0.0.1:8443 check

# Backend для BigBlueButton HTTP/1.1
backend nginx
  mode http
  server localhost 127.0.0.1:81 check

# Backend для BigBlueButton HTTP/2 (не используется, все запросы идут на порт 81)
# Оставлено для возможного использования в будущем

4. Исправление проблемы с BigBlueButton

Проблема: BigBlueButton требовал proxy_protocol на портах 81 и 82, но HAProxy в HTTP режиме не может отправлять proxy_protocol. Это вызывало HTTP 502 ошибку для school.cdto.life.

Решение:
1. Изменение конфигурации Nginx BigBlueButton: Убрано требование proxy_protocol и заменено на использование стандартных заголовков X-Forwarded-For:
```nginx
# Было:
listen 127.0.0.1:82 http2 proxy_protocol;
listen 127.0.0.1:81 proxy_protocol;
real_ip_header proxy_protocol;

# Стало:
listen 127.0.0.1:82 http2;
listen 127.0.0.1:81;
real_ip_header X-Forwarded-For;
set_real_ip_from 127.0.0.1;
set_real_ip_from ::1;
```

  1. Упрощение маршрутизации в HAProxy: Все запросы к BigBlueButton теперь идут на порт 81 (HTTP/1.1), независимо от того, HTTP/2 или HTTP/1.1 приходит от клиента. Это решает проблему с "broken header" при использовании HTTP/2.

Результаты

✅ Все домены работают

  • denkart.cdto.life - HTTPS работает, Cockpit доступен ✅
  • docs.cdto.life - HTTPS работает, документация доступна ✅
  • school.cdto.life - HTTPS работает, BigBlueButton доступен ✅

Файлы конфигурации

  • /home/cdto/DENKART/config/haproxy/haproxy-http-routing-full.cfg - полная конфигурация HAProxy
  • /home/cdto/DENKART/config/nginx/bbb-https-routing.conf - конфигурация Nginx для маршрутизации

Следующие шаги

  1. ✅ Решить проблему с BigBlueButton (HTTP 502) - РЕШЕНО
  2. ⏳ Протестировать работу TURN протокола (может потребоваться отдельная настройка)
  3. ⏳ Настроить автоматическое обновление SSL сертификатов
  4. ⏳ Документировать финальную архитектуру

Файлы конфигурации

  • /home/cdto/DENKART/config/haproxy/haproxy-http-routing.cfg - конфигурация HAProxy с HTTP режимом
  • /home/cdto/DENKART/config/nginx/bbb-https-routing.conf - конфигурация Nginx для маршрутизации на порту 8443
  • /etc/nginx/sites-enabled/bigbluebutton в контейнере BBB-CONT22-1 - конфигурация Nginx BigBlueButton (без proxy_protocol)

Статус: ✅ Все проблемы с маршрутизацией HTTPS решены. Все три домена работают корректно.