Решение проблемы с маршрутизацией 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;
```
- Упрощение маршрутизации в 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 для маршрутизации
Следующие шаги
- ✅ Решить проблему с BigBlueButton (HTTP 502) - РЕШЕНО
- ⏳ Протестировать работу TURN протокола (может потребоваться отдельная настройка)
- ⏳ Настроить автоматическое обновление SSL сертификатов
- ⏳ Документировать финальную архитектуру
Файлы конфигурации
/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 решены. Все три домена работают корректно.