基于 uri 路径的 Nginx SSL 直通

基于 uri 路径的 Nginx SSL 直通

我想知道是否可以配置 Nginx 以动态地向给定的微服务发送请求(不终止 SSL)?

在我的架构中,我有两个微服务。假设它们是 localhost:5000 和 localhost:5100。我想将所有以 localhost:5000 和 localhost:5100 开头的请求(发往 Nginx 代理)发送到/apilocalhost:5000 和/serviceslocalhost:5100。我已经在两个微服务上配置了 SSL,因此我不需要在 Nginx 上终止 SSL。

这可能吗?

答案1

您要求做的事情是不可能的。这不是 Nginx 的限制,而是 SSL 工作方式的结果。

如果在不终止 SSL 的情况下通过负载均衡器传递连接,则负载均衡器需要先选择后端,然后才能将 ServerHello 消息从服务器转发回客户端。然而,在早期阶段,客户端尚未发送 URI,因此无法将其用于选择后端。

您可选择的替代方案如下:

  • 终止负载均衡器上的 SSL。
  • 在两个不同的 IP 地址上托管服务。
  • 在两个不同的端口号上托管服务。
  • 在两个不同的域名上托管服务。

如果您严格要求 URL 使用特定域并且 URL 中不包含端口号,则大多数选项将被消除,终止负载均衡器上的 SSL 将是您唯一的选择。

我之所以区分使用两个不同的 IP 地址和使用两个不同的域名,是因为两个域名指向同一个 IP 地址是可能的,但前提是客户端支持 SNI。(在这种情况下,您只能让其中一个域为没有 SNI 的客户端工作)。

答案2

不,不是像你说的那样。不过还是有办法的。

Nginx 可以做TCP 负载均衡,没问题。这样就可以在不终止 SSL/TLS 的情况下传递连接。然而,在网络堆栈的这一层(第 4 层,运输) 不了解 URI。您不能使用 URL 来平衡 TCP 连接,您需要 Nginx 监听不同的端口。这对您来说可能是一个足够好的解决方案。

如果适合你的应用程序,更好的方法是从第 4 层移到第 7 层。Nginx 可以在负载均衡器上终止 SSL/TLS,然后让 Nginx 调用微服务。微服务调用可以是 http 或 https。有一个指南在这里

相关内容