Назад | Перейти на главную страницу

Nginx upstream keepalive с SNI

У меня есть настройка Nginx для прокси-сервера двух поддоменов. SNI используется, поэтому каждый поддомен имеет свой сертификат SSL. Настройка Nginx примерно такая:

upstream a_example_443 {
    server 1.2.3.4:443;
    keepalive 128;
    keepalive_timeout 180s;
}
upstream b_example_443 {
    server 1.2.3.4:443;
    keepalive 128;
    keepalive_timeout 180s;
}
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_ssl_server_name on;
server {
    listen 443 ssl;
    server_name aproxy.example.com;
    location / {
        proxy_pass https://a_example_443;
    }
}
server {
    listen 443 ssl;
    server_name bproxy.example.com;
    location / {
        proxy_pass https://b_example_443;
    }
}

Это работает, имена SNI a_example_443 и b_example_443 и у поддоменов есть псевдонимы для них. Однако разве плохо, что я использую два восходящих потока?

Я попытался настроить его на использование одного восходящего потока. После некоторых усилий это работает:

upstream example_443 {
    server 1.2.3.4:443;
    keepalive 128;
    keepalive_timeout 180s;
}
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_ssl_server_name on;
proxy_ssl_session_reuse off;
server {
    listen 443 ssl;
    server_name aproxy.example.com;
    location / {
        proxy_set_header HOST a.example.com;
        proxy_ssl_name a.example.com;
        proxy_pass https://example_443;
    }
}
server {
    listen 443 ssl;
    server_name bproxy.example.com;
    location / {
        proxy_set_header HOST b.example.com;
        proxy_ssl_name b.example.com;
        proxy_pass https://example_443;
    }
}

Сначала мне нужно было установить HOST и proxy_ssl_name к имени SNI. Это нормально, но кажется, когда я добавил proxy_set_header HOST, Я теряю все proxy_set_header У меня было в http уровень конфигурации (здесь не показан). Мне бы хотелось знать почему, но ладно, я помещаю их в файл и включаю в каждый server. Редактировать, узнал почему, proxy_set_header документы:

Эти директивы наследуются от предыдущего уровня тогда и только тогда, когда на текущем уровне не определены директивы proxy_set_header.

Далее мне нужно было установить proxy_ssl_session_reuse off. Каковы последствия использования этого? Я так понимаю, это отключает сокращенные рукопожатия, но когда это нужно? Я предполагаю, что при использовании keep alive не очень часто. Это правильно?

Keepalive - это то место, где мне становится неясно, как именно работают восходящие соединения. Nginx получает запрос, открывает SSL-соединение с восходящим потоком, отправляет имя SNI. Восходящий поток направляет его в нужный субдомен, использует сертификат этого субдомена и т. Д. Позже Nginx получает другой запрос - может ли он повторно использовать предыдущее SSL-соединение, которое все еще остается из-за поддержки активности? Если да, то что, если второй запрос касается другого имени SNI? Он просто отправляет запрос и позволяет восходящему потоку использовать Host заголовок для его маршрутизации?

В конечном итоге, следует ли использовать два восходящих потока или один?

Похоже, что приведенная выше конфигурация неверна: соединения SSL используются повторно, и если соединение не соответствует имени SNI, восходящий поток отклоняет его. Я полагаю, это означает, что ответ состоит в том, что требуются два восходящих потока, по одному для каждого имени SNI.