Nginx 上游使用 SNI 保持连接

Nginx 上游使用 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_443b_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_nameSNI 名称设置为。这很好,但似乎当我添加时,我丢失了配置级别的proxy_set_header HOST所有(此处未显示)。我很想知道原因,但好吧,我将它们放在一个文件中并将其包含在每个文件中。编辑,找出原因,文档:proxy_set_headerhttpserverproxy_set_header

当且仅当当前级别上没有定义 proxy_set_header 指令时,这些指令才会从上一级别继承。

接下来我必须设置proxy_ssl_session_reuse off。使用这个有什么后果?我知道它会禁用缩写握手,但什么时候需要呢?我猜是使用 keep alive 时,不太常见。对吗?

Keepalive 让我对上游连接的工作方式感到困惑。Nginx 收到请求,打开与上游的 SSL 连接,发送 SNI 名称。上游将其路由到正确的子域,使用该子域的证书等。稍后 Nginx 收到另一个请求 - 它是否可以重用由于 keepalive 而仍然存在的先前 SSL 连接?如果可以,那么如果第二个请求是针对另一个 SNI 名称的呢?它是否只发送请求并让上游使用标头来Host路由它?

最终,我应该使用两个上游还是一个?

答案1

上面的配置似乎有误:SSL 连接被重用,如果连接与 SNI 名称不匹配,则上游会拒绝该连接。我猜这意味着答案是需要两个上游,每个 SNI 名称一个。

相关内容