HAProxy 如何配置 SSL
项目背景
由于 HTTP 协议以明文方式发送请求,而部分业务需要进行数据加密传输,使用 SSL/TLS 来加密数据包,能够很好的保护数据的隐私性和完整性。
HAProxy 是一款可实现负载均衡的优秀软件,它可用于 TCP 代理、HTTP 反向代理、SSL 终结、规范 TCP、HTTP 连接等等。本文中主要介绍通过 HAProxy 反向代理实现负载均衡,并确保连接基于 SSL/TLS 安全加密。HAProxy 更多应用详见HAProxy官方文档
准备事项
- 主机已安装 HAProxy
- 已申请并签发了 SSL 证书,如没有证书,请购买SSL证书
- 申请 SSL 证书时绑定的域名已解析到服务器 IP
- 后端可正常访问
部署步骤
HAProxy 代理 SSL 有两种方式
1、HAProxy 本身绑定 SSL 证书,后面的 Web 服务器走正常的 HTTP ,这种方式 HAProxy 需要支持 SSL
2、HAProxy 本身只提供反向代理,后面的 Web 服务器走 HTTPS ,这种方式 HAProxy 不需要支持 SSL
方式一( HAProxy 绑定 SSL 证书):
1、查看已安装的 HAProxy 是否支持 SSL:
1)执行haproxy -vv
2)找到haproxy
命令源文件,执行ldd haproxy | ssl
[root@i-3d6dbe9x sbin]# ldd haproxy | grep ssl
libssl.so.10 => /lib64/libssl.so.10 (0x00007f99008a3000)
如不支持,需重新编译安装:
make TARGET=linux26 USE_OPENSSL=1 ADDLIB=-lz
make install
[root@localhost haproxy]# ldd haproxy | grep ssl
libssl.so.10 => /lib64/libssl.so.10 (0x00007f5ab8264000)
注意:TAGET
值为内核版本,使用uname -r
查看,2.6以上的都用 linux26
2、下载证书,并上传到云服务器,将证书私钥合并处理
[root@i-3d6dbe9x cert]# ls
www.linuxcamp.club.key www.linuxcamp.club.pem
[root@i-3d6dbe9x cert]# cat www.linuxcamp.club.pem www.linuxcamp.club.key | tee linuxcamp.pem
3、修改haproxy.cfg
配置文件
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
tune.ssl.default-dh-param 2048 ##修改默认使用2048bit加密,不设置会有警告
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend weblb
bind *:80
bind *:443 ssl crt /etc/haproxy/cert/linuxcamp.pem ##绑定私钥
redirect scheme https if !{ ssl_fc } ##将http请求跳转到https
acl is_http hdr_beg(host) www.linuxcamp.club ##添加acl规则
use_backend web if is_http ##指定后端
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend web ## 后端
balance roundrobin ##负载方式:轮询
server web1 192.168.0.2:80 maxconn 1024 check inter 2000 rise 2 fall 3
server web2 192.168.0.200:80 maxconn 1024 check inter 2000 rise 2 fall 3
#maxconn 最大连接数 check inter 检测后端可用性频率:2s rise 2 2次正确可用 fall 3 三次失败不可用
方式二( HAProxy 代理 SSL 请求):
1、后端绑定好 SSL 证书,可参考Apache配置SSL、Nginx配置SSL
frontend https_frontend
bind *:443
mode tcp
default_backend web_server
backend web_server
mode tcp
balance roundrobin
stick-table type ip size 200k expire 30m
stick on src
server web1 192.168.0.2:443 maxconn 1024 check inter 2000 rise 2 fall 3
server web2 192.168.0.200:443 maxconn 1024 check inter 2000 rise 2 fall 3
注意,这种模式下 mode 必须是 tcp 模式,经测试 frontend 采用 mode tcp 时,只认可 default_backend 这一个后端,无法使用 acl