5

我想知道如何让 NginX(负载均衡器)接受 443 上的流量并将其转发到负载均衡 Web 服务器节点上的端口 443。

我使用 NginX 作为负载均衡器,SSL 终止发生在 NginX 级别。然后 NginX 在端口 80 向我的 Web 服务发送未加密的流量。

这是我当前的 ngnx 配置:

upstream appserver {
    server 10.0.1.132;
    server 10.0.1.243;
}

server {
    listen       443 ssl;
    server_name  localhost;

    ssl_certificate      /etc/nginx/cert.pem;
    ssl_certificate_key  /etc/nginx/cert.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_pass http://appserver;
    }
}

我经历过:Nginx load balance with upstream SSL

我真正的问题是,如果我想让 NginX 监听 443 上的流量,那么我需要在 nignx 上配置 ssl 终止。否则 nginx 服务将无法启动,并且会抱怨缺少 ssl 证书/密钥。

简而言之,我希望 Nginx 简单地接受 443 上的流量并将其转发到负载平衡 Web 服务器节点上的 443。然后让我的网络服务器完成 SSL 工作。

最佳实践是在负载均衡器级别进行 SSL 卸载,但我想不这样做。

谢谢。

4

3 回答 3

2

这需要 NGINX 的第 4 层侦听/路由,显然不完全 支持。NGINX 似乎支持 SNI,但由于某种原因,我无法阻止它终止 TLS 连接。

我最终使用了 HAProxy。

于 2016-05-29T09:43:58.363 回答
1

为此,您需要使用而不是 http。

于 2018-03-27T22:17:31.950 回答
0

这是可能的,但这需要一个额外的模块,即ngx_stream_ssl_preread_module它从 Nginx 1.11.5 开始可用

它允许访问 SNI,您可以从中ClientHello通过变量提取在客户端消息中找到的服务器名称,$ssl_preread_server_name基于您可以将 TCP(“流”)连接路由到另一个端点。缺点是您只能依靠主机名进行路由。

该模块的文档提供了如何执行此操作的示例。

于 2020-07-16T17:11:24.163 回答