本站所使用的架构可以详细看这里:本站架构
用HAProxy代理多域名HTTPS站点有两种途径:tcp和https,本文分别列出两种方法,我均已测试通过:
安装就不多说了,Debian自带稳定版,一行命令就搞定:
apt-get install haproxy
方法一,用TCP连接
这个路子只能针对单一后端节点,或者多节点轮询也可以,但无法区分域名,也就是不太灵活。(我看官方博客提供的TCP+根据域名分流的方法,但很复杂,而且我没测试成功)这个方法的效率最高。
配置:
listen https bind 0.0.0.0:443 mode tcp balance roundrobin server s1 后端服务器1:443 weight 3 maxconn 10000 check inter 10s server s2 后端服务器2:443 weight 3 maxconn 10000 check inter 10s server s3 后端服务器3:443 weight 3 maxconn 10000 check inter 10s
比葫芦画瓢,不用多做解释了
方法二,用HTTPS方式
此方法很灵活,可以根据域名分发至不同的服务器,但需要自身多做一次SSL交互,理论上性能略低,但HAProxy的性能再怎么低也比Nginx、Apache之流高出很多很多倍。
看完整配置:
frontend http_server mode http bind 0.0.0.0:443 ssl crt /var/www/ca/old.tingtao.org/old.tingtao.org.pem crt /var/www/ca/www.tingtao.org/www.tingtao.org.pem use_backend www_tingtao_net if { ssl_fc_sni old.tingtao.org } use_backend it_tingtao_net if { ssl_fc_sni www.tingtao.org } backend www_tingtao_net mode http server web1 后端服务器1:443 check ssl verify none server web2 后端服务器2:443 check ssl verify none backend it_tingtao_net mode http server web1 后端服务器1:443 check ssl verify none server web2 后端服务器2:443 check ssl verify none
本身不复杂,但网上的中文教程全错,呵呵。略作解释:
bind 0.0.0.0:443 ssl crt /var/www/ca/old.tingtao.org/old.tingtao.org.pem crt /var/www/ca/www.tingtao.org/www.tingtao.org.pem
这一行,有多个证书就附加多个进来,也可以更简单的指定一个目录,但路径必须正确,否则出错无法启动的。
use_backend www_tingtao_net if { ssl_fc_sni old.tingtao.org } use_backend it_tingtao_net if { ssl_fc_sni www.tingtao.org }
这里,根据匹配到的域名选择对应的后端服务器组(也可以用配置语法中的正则),在HAProxy里,不论一个还是多个服务器,都是以“组”的形式出现的
backend www_tingtao_net mode http server web1 后端服务器1:443 check ssl verify none server web2 后端服务器2:443 check ssl verify none backend it_tingtao_net mode http server web1 后端服务器1:443 check ssl verify none server web2 后端服务器2:443 check ssl verify none
这里定义对应的后端“组”,也可以加轮询算法、权重什么的参数,我这没必要,各位需要的话自己加上就好了。
Haproxy本身是一个超高性能的负载均衡软件,官网测试的是用十几年前的古董计算机可以跑满10G带宽,其性能绝非Nginx这种可比的。
PS:我以前的公司用这玩意做前端,承载后面7万左右个网站,用的不过是一个E2200的cpu就足够了,还长时间cpu占用为0,其他的代理软件差距实在太大,没必要对比了。
博主你好,你在博文中提到“Haproxy官方博客提供的TCP+根据域名分流的方法"但你没实验生效。可以发下此官方博客的链接吗?我需要去探究下相关的东西
几年前的东西了,我没保留地址,不过按我现在的观点,已经没多大必要了。如果你有类似需求的话,haproxy和nginx本身全都支持ssl/https,也全都支持上下游串联,适当组合一下就可以。 如果你搞不定这种复杂组合,那么haproxy或者nginx自身作为前端负载节点也可以的,本身性能就足够牛B了,一个节点扛不住就再加一个就行,垃圾机器都能抗几个G带宽的。 提到的那个官方博客的事,细节记不清了,我觉得理论上是可行的,但既然涉及到域名,那么必然运作在非TCP层,也就是说跟这篇文章里的用sni来区分域名的做法其实没什么本质区别。