HAProxy可以实现https的证书安全,从客户端到HAProxy服务器之间为https通信,从HAProxy服务器到后端服务器用http通信。不过这种方式会对HAProxy服务器造成较大的压力,基于性能考虑,建议生产中证书还是放在后端服务器(比如nginx)上实现。
本次实验,笔者准备了四台虚拟机,一台作为客户端,取名client;一台为编译安装过HAProxy4.2.17版本的虚拟机,作为中间的调度器,取名haproxy;两台作为后端web服务器,分别取名web1和web2。
- 后端web服务器
后端两台web服务器均安装并开启Apache服务,同时各自的web主页面中均能显示各自IP。
- HAProxy服务器
2.1 生成自签名证书
要想实现https功能,需要在HAProxy服务器上生成服务相关的自签名证书。
2.1.1 修改Makefile文件
在《创建私有CA并进行证书申请》(链接:https://blog.51cto.com/u_15473594/5023546)一篇中,笔者演示了如何搭建私有CA和如何针对单个服务颁发CA证书,不过当时是在CentOS8上操作的,此次实验笔者的HAProxy服务器是放在在CentOS7上,而在CentOS7的/etc/pki/tls/certs目录下有个Makefile文件,我们可以直接使用该文件来生成自签名证书。不过直接使用该文件来生成证书相关文件时,会要求进行加密,同时后面每次使用都要输入密*码,相对会比较麻烦,因此要将Makefile文件中“/usr/bin/openssl genrsa”这一行的“-aes128”删除。
2.1.2 生成自签名证书
接下来我们就可以在Makefile所在的文件夹通过make命令来生成证书文件,需要我们填写国家、省市、城市等信息,填写完毕,可以看到指定目录下生成了证书文件和私钥文件。
2.1.3 合并证书相关文件
但是要使用的话,需要将以上生成的两个证书相关文件合并到一块,并且合并后的证书文件需要是pem格式。合并完毕,可以利用openssl命令将文件内容以文本形式输出查看。
2.2 修改HAProxy服务配置文件
配置文件中要设置本机的80端口和443端口均处于监听状态,同时443端口要指定证书文件的路径。因为HAProxy向后端web服务器进行请求的调度时走的还是http协议,因此后端服务器端口依旧是80。
- 客户端测试
当使用客户端或浏览器进行测试时,因为HAProxy服务器设置的是动态轮询调度算法,因此会往后端两台web服务器上轮流调度。
- 端口重定向
客户端在访问时,有可能不会主动去输入https,即不走加密协议,因此我们可以使用端口重定向。端口重定向的方式是在HAProxy服务器配置文件中添加一行“redirect scheme https if !{ ssl_fc }”,注意花括号里面前后各有一个空格。
客户端直接使用http协议去访问,加上-I选项可看到状态码为302,并且已经进行了重定向到https://www.johnnyfang.com上,加上-Lk选项去访问时已经能按照轮询调度获取后端服务器返回的结果。
在浏览器中访问时,按f12配合控制台可以更直观的看到重定向效果。