mesosphere
已经基本搭建完成,安装了marathon-lb
做请求分发,最后需要将所有的请求转为https
处理。由于不准备做全局的证书,所以只能针对每个应用单独进行证书配置。
- 起初没在意
marathon-lb
,认为他只是简单的请求分发,SSL
跟他无关,就在 应用的nginx
中配置了80
和443
两种访问方式,注意有个误打误撞的操作:在完整配置SSL
的情况下,比如listen 443 ssl;
或者ssl on;
的情况下会导致400
错误:“The plain HTTP request was sent to HTTPS port”
。修改方法:屏蔽ssl on
,另外只要写listen 443
就好了,不需要完整配置。这样配置之后发现通过浏览器访问时一直说连接不安全。。
- 在理清整个请求的处理流程后越发觉得证书应该是在
lb
的HAProxy
中进行配置,所以在此进行尝试,但是无果。。具体做法是在marathon-lb
中添加了volume
映射试着将证书放进去,想办法让证书生效。反复修改了marathon-lb
中的HAPROXY_SSL_CERT
参数,但是无论是指定路径,或是按照网上说的用sed
输出文件内容之类的,都不行。。
- 在网上找了完整的单独的
HAProxy
配置之后对HAProxy
有了一个初步的概念(虽然多年以前将LVS
,HAProxy
和Nginx
摸得烂熟,但是多年不用还是忘记了)。
- 同时发现一个奇怪的现象:在
marathon-lb
启动之后,有的时候/marathon-lb/haproxy.cfg
是存在的,有的时候又不存在。多尝试几次并结合marathon-lb
的日志发现这里存在这样一种机制:marathon
里的应用在启动(或更新重启)之后,marathon-lb
会自动检测应用的新配置,并与老配置进行对比,如果有变化就会更新/marathon-lb/haproxy.cfg
并重启。当应用中有错误的配置时候,就无法生成/marathon-lb/haproxy.cfg
。比如我一开始设置label
中的HAPROXY_0_MODE
为https
(一开始是http
,我以为修改成https
就会从443
端口走了),日志中就报错,说https
这个模式是错误的。查找官方文档后发现http
这个模式可以处理http
和https
的请求,那么问题还不在这里。同时发现另一个问题,我在label
中配置了"HAPROXY_0_SSL_CERT": "/data/nginx/certs/214997784440115.pem"
,但是marathon-lb
说这个文件不存在,心里咯噔一下,有戏。。文件不存在那让它存在就好了。之前已经在marathon-lb
中配置了volume
的映射,将几个证书的文件映射到了marathon-lb
的内部(我使用了相同的路径名称),检查后发现早上在测试时候我将21xxx.pem
命名为了cert.pem
(HAProxy
默认会去找/etc/ssl/cert.pem
,我将pem
改了文件名并拷贝了过去),于是乎将pem
文件名字改回来,重启marathon-lb
发现文件是找到了,但是有新的报错,如下:
- 可以看到说是
priveate key
找不到,但是我记得这是在key
文件里头的,于是又在应用的HAPROXY_0_SSL_CERT
中将文件改为21xxx.key
,这下又有了新的报错:
- 这下说明他丫的公私两个文件都要,那么整个证书的配置确实是在这边处理就好了,想办法把两个文件都配置进去,写成了
“21xxx.pem,21xxx.key”
,但是这个格式还是有点问题:
- 没办法,只能放大招。。将
key
文件里头的东西拷贝粘贴到pem
文件后头,启动成功!
- 到这里为止,
HAProxy
的证书算是配置完成了,但是发现还是有点问题,生成的haproxy.cfg
中一直监听10101
端口,检查应用的配置后发现portDefinitions
段中ports
端口设置成了10101
,于是将它改为0
,重启后访问还是有问题。。
- 回想到
haproxy.cfg
中的listen
字段,再细想一下浏览器的请求,浏览器的https
协议默认的是443
端口,那么只要HAProxy
没有指定443
端口,证书就依旧无法生效。所以将ports
改为443
,重启后发现一切OK了。。
- 接下来还可以做一个测试,将应用的
Nginx
修改为只监听80
的普通http
,然后应用对外映射80
端口,我估计这样也是可行的(还未测试)。。