Nginx 可以使用 SSL 终止进行 TCP 负载平衡吗?

Can Nginx do TCP load balance with SSL termination?

由于某些原因,我需要设置 Nginx TCP 负载平衡,但需要 SSL 终止。我不确定 Nginx 是否可以做到这一点。由于 TCP 是第 4 层,SSL 是第 5 层,SSL 直通绝对有效。但是有 SSL 终止?

Nginx 可以作为 L3/4 流模块的平衡器:https://www.nginx.com/resources/admin-guide/tcp-load-balancing/

因为 SSL 仍然是 tcp - Nginx 可以在不终止的情况下代理 SSL 流量。

流模块也可以终止 SSL 流量,但它是可选的。

示例 1:没有 SSL 终止的 IMAP over SSL 的 TCP 隧道

stream {
    upstream stream_backend {
        server backend1.example.com:993;
        server backend2.example.com:993;
    }
    server {
        listen 993;
        proxy_pass stream_backend;
    }
}

在这种情况下,SSL 终止由 backend1/2 处理。

示例 2:带有 SSL 终止的 IMAP 的 TCP 隧道。

stream {
    upstream stream_backend {
        server backend1.example.com:443;
        server backend2.example.com:443;
    }
    server {
        listen 993 ssl;
        proxy_pass stream_backend;
        ssl_certificate        /etc/ssl/certs/server.crt;
        ssl_certificate_key    /etc/ssl/certs/server.key;
    }
}

在这种情况下,nginx 和 backend1/2 之间的流量未加密(使用 IMAP 443 端口)。

示例 3:接收未加密的数据并对其进行加密

stream {
    upstream stream_backend {
        server backend1.example.com:993;
        server backend2.example.com:993;
    }
    server {
        listen 443;
        proxy_pass stream_backend;
        proxy_ssl  on;
        proxy_ssl_certificate     /etc/ssl/certs/backend.crt;
        proxy_ssl_certificate_key /etc/ssl/certs/backend.key;
    }
}

因此,客户端在没有 SSL 的情况下连接到我们的 nginx,并且此流量使用 SSL 加密代理到 backend1/2。