Обратные порты TCP-прокси 80 и 443 по имени хоста сервера

Обратные порты TCP-прокси 80 и 443 по имени хоста сервера

У меня есть один публичный IP-адрес. Я пытаюсь разрешить доступ через публичный IP на портах 80 и 443 к нескольким службам, различающимся по запрошенному имени сервера.

ОДНАКО, одна услуга требуетТКПобратный прокси на портах 80 и 443 на публичном IP для работы. Другому требуется обратный прокси TCP, но только на порту 443. Остальные — это просто веб-сайты, и им достаточно обратного прокси http, но я хочу, чтобы веб-сайты были общедоступны на портах 80 и 443, чтобы упростить это для посетителей и для letsencrypt.

Я могу создать столько виртуальных машин и частных IP-адресов, сколько необходимо для простоты, но при этом ограничиваюсь одним публичным IP-адресом.

Могу ли я сделать это с настройкой nginx как обратного прокси с использованием SNI? Теоретически я думаю, что я должен иметь возможность передавать все по tcp-потоку по имени хоста с использованием SNI, направленного на соответствующий сервер, со вторым веб-сервером, который имеет необходимые настройки веб-сайтов для прослушивания на разных портах. Например, nginx.conf:

stream {

    map $ssl_preread_server_name $name {
            serviceone.domain.tld serviceone;
            servicetwo.domain.tld servicetwo;
            website1.domain.tld website1;       
            website2.domain.tld website2;   
    }

    upstream serviceone {
            server 10.1.99.7:443;
    }

    upstream servicetwo {
            server 10.1.99.20:443;
    }

    upstream website1 {
            server 10.1.99.30:10443;
    }

    upstream website2 {
            server 10.1.99.30:10444;
    }


    server {
            listen 443;
            listen 80;
            resolver 8.8.8.8;

            proxy_pass $name;
            ssl_preread on;
    }

}

У меня в nginx.conf есть что-то похожее на то, что работает выше, но мне немного сложно понять, как запросы порта 80 попадают в уравнение (я просто добавил listen 80 в блок сервера, но не смог объяснить, как обрабатываются запросы с точки зрения различия между 443 и 80, если запрашивается одно и то же имя сервера).

Я открыт для лучших способов сделать это, в том числе с использованием nginx или haproxy и т. д. Спасибо!

решение1

Просто используйте отдельные блоки server{...} для каждого имени хоста.

Он выполняет работу без зависимости от дополнительного модуля и избавит вас от МНОГО проблем, если вышестоящие серверы будут отличаться по конфигурации, требуемой для прокси-сервера.

Связанный контент