【问题标题】:How to use SNI correctly? (Two Different Nginx SNI Writing Style)如何正确使用 SNI? (两种不同的 Nginx SNI 编写风格)
【发布时间】:2021-07-29 03:55:19
【问题描述】:

这两种不同的 SNI 写作风格有什么区别?有人能从原理、性能等方面判断他们的差异吗?

样式1

stream{
    map $ssl_preread_server_name $backend_name{
        A.example.com A;
        B.example.com B;
    }
    upsteam A{
        server 127.0.0.1:10086
    }
    upsteam B{
        server 127.0.0.1:10087
    }
}

http{
    server{
        listen 10086 ssl http2;
        server_name A.example.com
        ...
    }
}

风格2

server {
    listen 127.0.0.1:443 ssl;
    server_name A.example.com;
    ...
}
server {
    listen 127.0.0.1:443 ssl;
    server_name B.example.com;
    ...
}

【问题讨论】:

    标签: nginx sni


    【解决方案1】:

    从您尝试在 443 端口上侦听不同主机名的问题看来。带有主机名A.example.com 的请求应转发到127.0.0.1:10086,而带有主机名B.example.com 的请求将转发到127.0.0.1:10087。让我解释一下这两种风格的幕后情况。

    样式 1

    stream 块允许您通过 TCP/UDP 进行负载平衡。 ngx_stream_ssl_preread_module 模块允许您从请求中提取信息,而无需 ssl/tls 终止。您正在使用map,因此以A.exammple.com 形式出现的连接在变量$backend_name 中设置A,而以B.example.com 形式出现的连接在变量$backend_name 中设置B。根据您的upstream 块,请求将被转发到127.0.0.1:10086127.0.0.1:10087。由于有一个 http 块,其中服务器块分别在端口 10086 和 10087 上侦听,因此每次满足这些请求时它都会创建一个新连接。 ssl 终止也发生在 http 块内。

    样式 2

    两个服务器块都在侦听 443,并且根据请求的主机名,它要么通过 server 块之一。 ssl 终止发生在请求到达应用程序实际运行的端口之前。

    两种样式都可以很好地实现这一点,但我个人更喜欢Style 2,因为 ssl 终止是在转发请求之前处理的。此外,在我看来,Style 1 中创建了一个额外的连接,这会带来轻微的性能开销。

    【讨论】:

    • 感谢您的回复。您的回答让我更好地理解了 Nginx 的 SSL 方面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多