如何不在NginX负载均衡器上ssl终止

时间:2013-10-31 05:00:16

标签: nginx

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

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

这是我当前的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卸载,但我想做其他事情。

感谢。

3 个答案:

答案 0 :(得分:1)

这需要在NGINX的部分进行第4层监听/路由,这显然不是entirely supported。 NGINX似乎支持SNI,但出于某种原因,我无法阻止它终止TLS连接。

我最终使用了HAProxy。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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