Не работают именованные захваты в регулярных выражениях

angie -v
Angie version: Angie/1.7.0

Привет!

Такую странную проблему обнаружили для секции stream - не работают именованные захваты в регулярных выражениях (в http секции такой пролемы нет)

stream {
        upstream my_upstream_servers_admin {
                server        admin-server.my_domain.ru:9022;
        }

        upstream my_upstream_servers {
                server        server.my_domain.ru:9022;
        }

        map $my_subdomain                              $my_upstream {
                default                                0;
                "my-subdomain-admin"                      "my_upstream_servers_admin";
                "my-subdomain"                            "my_upstream_servers";
        }

        server {
                listen                                 9022;
                server_name                            ~^(www\.)?(?<my_subdomain>[a-zA-Z0-9-.]+)\.(?<domain>my-domain\.ru)$;
                proxy_pass                             $my_upstream;
        }
}

При попытке идти на my-subdomain.my-domain.ru и на my-subdomain-admin.my-domain.ru не задается переменная my_subdomain

2025/02/18 17:41:09 [error] 3709464#3709464: *1078255574 no port in upstream "0", client: 10.10.134.138, server: 0.0.0.0:9022, bytes from/to client:0/0, bytes from/to upstream:0/0

А где у вас в конфигурации TLS настроен?

тут для примера нет tls, внутренний домен
но я тут еще кое что прочитал: stream не может слушаться на 1 порту, т.е. нет смысла делать регулярку, в любом случае 1 порт - 1 server_name (поправьте, если ошибаюсь)

Как по вашему “server_name” должен без TLS в stream работать? Модуль “stream” манипулирует TCP-соединениями - это L4-прокси, он ничего не знает про протокол внутри. Откуда он может домен взять? Только из SNI. А для этого должен быть настроен обработчик TLS.

а почему TLS тут обязателен?
вот мы идем

sftp -P 9022 my-subdomain.my-domain.ru       
The authenticity of host '[my-subdomain.my-domain.ru]:9022 ([10.10.12.2]:9022)' can't be established.
ED25519 key fingerprint is SHA256:*****.

ответ есть, но вот описанный тут сопособ не работает Потоковый модуль

Потому, что “server_name” берет имя хоста только из SNI.

1 Like

У вас sftp устанавливает TCP соединение по IP-адресу и порту - никакого имени домена при этом на сервер не передается, а далее работает по протоколу SSH.

1 Like

понял, спасибо