Toq*_*eer 2 email postfix load-balancing zimbra
我想通过多个 IP 对出站电子邮件进行负载均衡,是否有任何内置工具或一些简单的方法可以使用 postfix、sendmail 或 exim 来实现?例如,如果我为电子邮件服务器分配了三个 IP,并且电子邮件是通过所有 ip 一一发送的。
使用 Postfix 2.7 或更高版本,这很容易。
首先在 master.cf 中为每个 IP 创建一个条目,如下所示:
out1 unix - - n - - smtp
-o syslog_name=postfix-out1
-o smtp_helo_name=out1.yourdomain.tld
-o smtp_bind_address=a.b.c.1
out2 unix - - n - - smtp
-o syslog_name=postfix-out2
-o smtp_helo_name=out2.yourdomain.tld
-o smtp_bind_address=a.b.c.2
[...]
outN unix - - n - - smtp
-o syslog_name=postfix-outN
-o smtp_helo_name=outN.yourdomain.tld
-o smtp_bind_address=a.b.c.N
Run Code Online (Sandbox Code Playgroud)
然后在 main.cf 中创建一个发送者相关的传输映射,如下所示:
sender_dependent_default_transport_maps = mysql:/etc/postfix/config/transport_roundrobin.cf
Run Code Online (Sandbox Code Playgroud)
注释掉 main.cf 中的所有其他传输映射,如下所示:
#transport_maps = ...
Run Code Online (Sandbox Code Playgroud)
现在这里有一个技巧,这个传输表将使用 RAND() 来随机化 master.cf 中列出的所有 out[1..n] 传输的使用。
在 /etc/postfix/config/transport_roundrobin.cf 中写入:
user = dbuser
password = dbpass
dbname = dbname
hosts = dbhost
query = SELECT transport FROM transport_roundrobin ORDER BY RAND() LIMIT 1
Run Code Online (Sandbox Code Playgroud)
最后,在 dbhost 上运行的数据库 'dbname' 上创建一个名为 'transport_roundrobin' 的表,并为每个传输插入一行:
CREATE TABLE transport_roundrobin (transport varchar(40) not null)
INSERT INTO transport_roundrobin (transport) VALUES ('out1');
INSERT INTO transport_roundrobin (transport) VALUES ('out2');
[...]
INSERT INTO transport_roundrobin (transport) VALUES ('outN');
Run Code Online (Sandbox Code Playgroud)
Postfix 会从transport_roundrobin mysql 表中随机选择一行,然后使用得到的值在master.cf 中选择对应的transport。根据 -o smtp_bind_address,每个传输将使用不同的 IP 地址