关于 HTTPS 负载均衡问题

2020-09-25 10:20:24 +08:00
 imherer

以前做 HTTPS 都是在负载均衡这一层做的

最近看 golang 发现 gin 框架有 HTTPS 的支持,官方代码如下:

package main

import (
	"log"

	"github.com/gin-gonic/autotls"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	// Ping handler
	r.GET("/ping", func(c *gin.Context) {
		c.String(200, "pong")
	})

	log.Fatal(autotls.Run(r, "example1.com", "example2.com"))
}

那么问题来了,如果应用本身起来就是一个 HTTPS,像上面这样,那我负载均衡那一层应该怎么做?

2288 次点击
所在节点    程序员
9 条回复
Judoon
2020-09-25 10:44:54 +08:00
没什么差别啊,
负载均衡向 upstream server 转发的协议从 http 换成 https 而已
顺带如果 upstream server 的证书是自签的就加上不验证证书的选项
chendy
2020-09-25 11:07:52 +08:00
那么问题来了,已经有一层反代做 https 了,应用为啥还需要 https
darrh00
2020-09-25 11:16:20 +08:00
如果第一层到 upstream 的链路是不安全的,就应该用 https
imherer
2020-09-25 12:32:03 +08:00
@chendy 可能是我没表述清楚。
我的意思是应用层已经是 HTTPS 了,而且看它这个 demo 是直接绑定了域名了
负载均衡怎么做呢? 因为域名已经绑在应用这一层了
imherer
2020-09-25 12:32:39 +08:00
@Judoon
@darrh00
谢谢 我再研究研究
suconghou
2020-09-25 13:09:24 +08:00
这样负载均衡可以用 nginx sni proxy 来做,但一般的做法都是流量到达集群后解密,而不是交给应用层解密;在集群解密抓包 debug,路径分流,服务拆分都更方便些
goodryb
2020-09-25 13:15:19 +08:00
@imherer #4 负载均衡可以做 4 层 tcp 的啊, 只是纯流量转发,https 应用侧来处理就好了
xuanbg
2020-09-25 13:17:04 +08:00
负载均衡不是一般都用 Nginx 的 upstream 吗?
Judoon
2020-09-27 11:45:31 +08:00
@imherer #4
"我的意思是应用层已经是 HTTPS 了,而且看它这个 demo 是直接绑定了域名了
负载均衡怎么做呢? 因为域名已经绑在应用这一层了"

我粗看了 go-ginic 的 autotls,好像用的是 acme 来自动申请证书。他这个 demo 传域名是为了申请证书,而如果你在应用启动前又没有证书,那前面的负载均衡就做不了 7 层的,会陷入先有鸡先有蛋的问题。你可以做 4 层的负载均衡。

如果你已经有了证书,域名的 ip 是指向到前置的负载均衡的,负载均衡再向后端转发时就必须配置 ip 端口,外加 sni 域名
#6 说的 nginx sni proxy 大概就是如下


proxy_pass https://1.2.3.4;
proxy_read_timeout 60;
proxy_ssl_name $host;
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_session_reuse off;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/710318

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX