安装与配置HAProxy实现均衡负载与高可用

HAProxy (High availability proxy)是著名的开源负载均衡器,它的性能优秀且轻量,能够方便地配置HTTP流量与TCP流量的反代,从而实现后端服务的高可用与均衡负载。

今天,我将介绍如何在Linux系统中安装与配置HAProxy, 并使用Proxy Protocol反代TCP流量。本文也是“搭建高可用的邮件服务器集群”系列文章的最后一篇。在这个邮件服务器集群中,HAProxy作为前端的负载均衡节点,负责为后端的三台节点机实现故障转移与均衡负载。值得一提的是,在邮件服务器集群中,这个前端的负载均衡节点并不是必须的。

  1. 邮件服务器集群的架构与基本设置
  2. FoundationDB数据库集群的部署
  3. ElasticSearch全文索引数据库集群的部署
  4. Redis缓存数据库集群的部署
  5. Stalwart Mail Server的集群部署与配置
  6. 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, 转载请注明原文链接。谢谢!

Leave a Comment