У меня есть настройка 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.