marathon-lb上添加多证书并实现泛解析代理域名-1

marathon-lb上添加多证书并实现泛解析代理域名 之 nginx实现marathon-lb的vhosts泛域名代理

marathon-lb代理https域名, 需要将证书当道lb上。nginx不需要开启443端口,nginx需要配置 vhost 才能访问。

marathon添加证书连接: marathon-lb上添加多个证书

域名都是通过 vhost 虚拟主机方式访问。这样nginx才能拿到 x_forwarded_for 客户端的IP地址。LB才会通过HTTP方式代理,否则会走TCP代理。

nginx上回有很多个域名,我们不能添加一个域名就修改一次 vhosts ,所以我们尝试添加 泛域名。

nginx 发布的json文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
{
"id": "/lb-nginx/nginx-shining-test1,
"cmd": null,
"cpus": 0.1,
"mem": 4096,
"disk": 0,
"instances": 1,
"constraints": [
[
"nginx",
"LIKE",
"true"
]
],
"container": {
"type": "DOCKER",
"volumes": [
{
"containerPath": "/etc/nginx",
"hostPath": "/home/nginx-conf/conf",
"mode": "RW"
}
],
"docker": {
"image": "nginx:1.13",
"network": "BRIDGE",
"portMappings": [
{
"containerPort": 80,
"hostPort": 0,
"servicePort": 0,
"protocol": "tcp",
"labels": {}
}
],
"forcePullImage": false
}
},
"env": {
"TZ": "Asia/Shanghai"
},
"healthChecks": [
{
"gracePeriodSeconds": 60,
"intervalSeconds": 10,
"timeoutSeconds": 5,
"maxConsecutiveFailures": 3,
"portIndex": 0,
"protocol": "TCP"
}
],
"labels": {
"HAPROXY_0_BACKEND_WEIGHT": "-1",
"HAPROXY_GROUP": "lbgroupname",
"HAPROXY_0_HTTP_FRONTEND_ACL_ONLY": " acl host_{cleanedUpHostname} hdr(host) -m end .{hostname}\n",
"HAPROXY_0_HTTPS_FRONTEND_ACL": " use_backend {backend} if {{ ssl_fc_sni -m end .{hostname} }}\n",
"HAPROXY_0_VHOST": "shiningtest1.com,shiningtest2.com"
}
}

其中参数说明:

1
"HAPROXY_0_HTTP_FRONTEND_ACL_ONLY": "  acl host_{cleanedUpHostname} hdr(host) -m end .{hostname}\n",

这个是http的默认解析。因为http会有很多二级域名,所以配置默认解析。

1
"HAPROXY_0_HTTPS_FRONTEND_ACL": "  use_backend {backend} if {{ ssl_fc_sni -m end .{hostname} }}\n",

这个是配置https的泛解析,会在LB的配置的vhosts域名前面加“.”点, “end .{hostname} ” 那个点。

验证

可以查看LB的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 curl 192.168.53.200:9090/_haproxy_getconfig 

......
frontend marathon_http_in
bind *:80
mode http
acl host_shiningtest1_com_lb-nginx_nginx-shining-test1 hdr(host) -m end .shiningtest1.com
acl host_shiningtest1_com_lb-nginx_nginx-shining-test1 hdr(host) -m end .shiningtest2.com
use_backend lb-nginx_nginx-shining-test1_10111 if host_shiningtest1_com_lb-nginx_nginx-shining-test1

......

frontend marathon_https_in
bind *:443 ssl crt /mnt/mesos/sandbox/shiningtest1.com.pem crt /mnt/mesos/sandbox/shiningtest2.com.pem
mode http
use_backend lb-nginx_nginx-shining-test1_10111 if { ssl_fc_sni -m end .shiningtest1.com }
use_backend lb-nginx_nginx-shining-test1_10111 if { ssl_fc_sni -m end .shiningtest2.com }
.......
  • 可以看到 http 的 use_backend 是marathon上nginx的id

  • https 的end 后面的二级域名前面都添加了 “.”

这样 shiningtest1.com 和 shiningtest2.com 所有的域名都会转发到nginx上了。

相关参考文档:https://docs.mesosphere.com/services/marathon-lb/1.13/mlb-configuration/

感谢您的支持!