HAProxy (High availability proxy)是著名的开源负载均衡器,它的性能优秀且轻量,能够方便地配置HTTP流量与TCP流量的反代,从而实现后端服务的高可用与均衡负载。
今天,我将介绍如何在Linux系统中安装与配置HAProxy, 并使用Proxy Protocol反代TCP流量。本文也是“搭建高可用的邮件服务器集群”系列文章的最后一篇。在这个邮件服务器集群中,HAProxy作为前端的负载均衡节点,负责为后端的三台节点机实现故障转移与均衡负载。值得一提的是,在邮件服务器集群中,这个前端的负载均衡节点并不是必须的。
- 邮件服务器集群的架构与基本设置
- FoundationDB数据库集群的部署
- ElasticSearch全文索引数据库集群的部署
- Redis缓存数据库集群的部署
- Stalwart Mail Server的集群部署与配置
- HAProxy均衡负载节点的部署(本文)
本文作者为香菇肥牛,原文链接为 https://qing.su/article/haproxy-node-balancer-tcp-traffic.html, 转载请注明原文链接。谢谢!
1. HAProxy的安装
可以直接使用包管理器安装HAProxy程序。
1 | apt-get install haproxy -y |
安装完毕后,启用haproxy进程
1 2 | service haproxy start systemctl enable haproxy |
HAProxy的配置文件地址默认为/etc/haproxy/haproxy.cfg. 接下来,我们要编辑这个文件,配置均衡负载节点的前后端。
2. 配置HAProxy前后端
HAProxy的配置一般分为前后端两个部分。本文中,HAProxy作用于邮件服务器集群,因此我们要使用依次反代IMAP, SMTP等组件。
以25端口的SMTP服务为例,我们先配置前端。
1 2 3 4 5 | frontend ft_smtp bind *:25 mode tcp option tcplog default_backend bk_smtp |
这里,我们指明了监听端口25与TCP反代模式,并且指明了后端为bk_smtp. 接下来我们配置相应的后端。
1 2 3 4 5 6 7 | backend bk_smtp mode tcp option tcplog balance roundrobin server mxa 77.77.77.77:25 send-proxy-v2 server mxb 88.88.88.88:25 send-proxy-v2 server mxc 99.99.99.99:25 send-proxy-v2 |
在这里,我们指明了后端的三台节点机。请注意,我们使用了proxy protocol (send-proxy-v2). Stalwart邮件服务器原生支持Proxy protocol, 因此我们可以方便地使用proxy protocol回源。
下面是我们的完整配置。
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon ca-base /etc/ssl/certs crt-base /etc/ssl/private ssl-default-bind-options no-sslv3 ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!RC4 tune.ssl.default-dh-param 2048 defaults log global mode tcp option tcplog option dontlognull timeout connect 5000ms timeout client 50000ms timeout server 50000ms errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend ft_smtp bind *:25 mode tcp option tcplog default_backend bk_smtp frontend ft_imap bind *:143 mode tcp option tcplog default_backend bk_imap frontend ft_smtps bind *:465 mode tcp option tcplog default_backend bk_smtps frontend ft_imaps bind *:993 mode tcp option tcplog default_backend bk_imaps frontend ft_https bind *:443 mode tcp option tcplog default_backend bk_https backend bk_smtp mode tcp option tcplog balance roundrobin server mxa 77.77.77.77:25 send-proxy-v2 check server mxb 88.88.88.88:25 send-proxy-v2 check server mxc 99.99.99.99:25 send-proxy-v2 check backend bk_imap mode tcp stick-table type ip size 1m expire 30m stick on src option tcplog balance roundrobin server mxa 77.77.77.77:143 send-proxy-v2 check server mxb 88.88.88.88:143 send-proxy-v2 check server mxc 99.99.99.99:143 send-proxy-v2 check backend bk_smtps mode tcp option tcplog balance roundrobin server mxa 77.77.77.77:465 send-proxy-v2 check server mxb 88.88.88.88:465 send-proxy-v2 check server mxc 99.99.99.99:465 send-proxy-v2 check backend bk_imaps mode tcp stick-table type ip size 1m expire 30m stick on src option tcplog balance roundrobin server mxa 77.77.77.77:993 send-proxy-v2 check server mxb 88.88.88.88:993 send-proxy-v2 check server mxc 99.99.99.99:993 send-proxy-v2 check backend bk_https mode tcp option tcplog balance leastconn server mxa 77.77.77.77:443 send-proxy-v2 check server mxb 88.88.88.88:443 send-proxy-v2 check server mxc 99.99.99.99:443 send-proxy-v2 check listen stats bind *:8404 stats enable stats uri /stats stats refresh 10s stats admin if LOCALHOST stats auth username:password |
保存退出后,重启haproxy服务
1 | service haproxy restart |
这里,我们额外配置了长连接的设置,以及节点健康检查。同时,我们还配置了一个数据统计面板。您可以访问 http://haproxy_ip:8404/stats 即可打开统计面板。
在可以以开始使用之前,我们还需要在后端Stalwart节点服务器中设置白名单,允许前端HAProxy服务器的反代请求。
3. 配置Stalwart节点服务器
我们需要在Stalwart节点服务器中允许前端HAProxy均衡负载节点的流量,这样才能使用proxy protocol回源。
登录节点服务器的Stalwart后台,找到 Settings – Server – Listeners, 打开需要被前端HAProxy反代的服务(比如SMTP, IMAP等),在Proxy protocol中添加允许的前端节点机IP列表,如下图。
设置完毕后,重新载入节点服务器。
同时,我们需要配置安全证书。
以我们的邮件服务器集群为例,后端三台节点服务器的域名分别为 mxa.qing.su, mxb.qing.su, mxc.qing.su, 而前端HAProxy服务器的域名为 mx.qing.su.
如果您按照我们上一篇文章的步骤,直接在Stalwart服务器上布置了免费的通配符证书 *.qing.su, 那么这里就不需要配置任何证书了,因为HAProxy会直接使用Proxy protocol将证书验证请求回源至对应的节点服务器,而节点服务器的通配符证书 *.qing.su已经包含了前端HAProxy服务器的域名 mx.qing.su, 因此可以直接通过验证。
如果三台节点服务器上的证书无法覆盖HAProxy前端服务器的域名,那么您需要在后端节点服务器上额外添加一个前端服务器域名对应的证书。您可以在Settings – Server – TLS中添加对应的证书。
至此,我们完成了haproxy的全部安装和配置,可以开始使用了。
到这里,我们完成了这个邮件服务器集群的全部组件的安装与部署。
回顾一下这个系列,我们依次在三台节点服务器中搭建了FoundationDB数据库集群,ElasticSearch全文索引服务集群,Redis内存数据库集群,配置了Stalwart邮件服务器集群,并且配置了前端HAProxy均衡负载。通过一系列组件的联动,我们实现了完整的高可用的邮件服务器集群部署。
如果您对本文或者本系列文章有任何疑问,欢迎在这里留言,我将尽力解答。
本文作者为香菇肥牛,原文链接为 https://qing.su/article/haproxy-node-balancer-tcp-traffic.html, 转载请注明原文链接。谢谢!