我已将 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 收到另一个请求 - 它是否可以重用由于 keepalive 而仍然存在的先前 SSL 连接?如果可以,那么如果第二个请求是针对另一个 SNI 名称的呢?它是否只发送请求并让上游使用标头来Host
路由它?
最终,我应该使用两个上游还是一个?
答案1
上面的配置似乎有误:SSL 连接被重用,如果连接与 SNI 名称不匹配,则上游会拒绝该连接。我猜这意味着答案是需要两个上游,每个 SNI 名称一个。