深入理解postfix
postfix 可以在内存有限的系统上执行,而不会影响其它服务的效能,这是因为 postfix 提供的内存管理功能非常有弹性,可以依据各种需求加以调整。
每封邮件用量限制
当 postfix 处理邮件时,必须将邮件暂存于邮件队列中,其中 maildrop 和 incoming 队列使用硬盘,而 active 和 deferred 则使用内存,每封暂存在队列中的邮件耗用多少内存是由邮件数据结构来决定,幸运的是这个数据结构的字段大小是可以微调的,透过这些微调就能决定 postfix 的最大内存用量了!
line_length_limit = 2048 从客户端接收待寄邮件时,每行最多 2 KB
header_size_limit = 102400 每封邮件的标头大小不得超过 100 KB
extract_recipient_limit = 10240 每封邮件的收信人字段不得超过 10 KB
message_size_limit = 10240000 每封邮件(包含信封)的大小,不得超过 10 MB
queue_minfree = 当内存剩下多少 Bytes 时,才可以处理下一封邮件,预设是没有限制。
bounce_size_limit = 50000 警告信的大小限制为 50 KB。
假设通通使用默认值,也就是所有参数都不设置,那么处理一封邮件须耗用 10.05 MB,再加上 postfix 模块程序的大小,总共约 20 MB,这也就是 postfix 运行的最小需求了!
邮件数量限制
当前述用量限制设置完毕后,接着我们还可以针对邮件队列一次要处理多少邮件作出限制,把每封邮件内存用量乘上邮件数量,就可以算出所需的内存总量,当内存足够时,我们当然希望尽可能多处理几封邮件来增进 postfix 的效能。
qmgr_message_recipient_limit = 1000 这个参数之前介绍过了,除了用来控制 dead 清单的大小外,也控制着处理中的邮件收信人总量,两者的预设限制都是 1000。
qmgr_message_active_limit = 1000 最多同时处理 1000 封邮件。
duplicate_filter_limit = 1000 在进行收信人过滤时,要快取多少已通过过滤的清单,这个功
能是用来提高过滤效能,预设要快取 1000 个不同收信人
时间限制
postfix 某些模块在运作时,会依照设定档的要求读取外挂程序或是执行 shell 命令,有些则是会读取外部档案。如果无限制的让 postfix 等待外部命令执行完毕或等待外部档案读取完毕,将会因为这些外部程序的设计不当或 I/O 冲突,而导致 postfix 无法运作,因此就需要设定等候时间限制,超过此时间限制 postfix 将径行处理下一个程序。
举例来说:当 local agent 将邮件分到使用者信箱时,会透过 proxymap 模块读取 alias 数据库,接着根据 alias 设定读取 :include: 档案,最后读取 .forward 档案,前述动作中如果其中一个因为系统 I/O 忙碌无法于时间限制内读取档案,local agent 就会直接跳过进行下一个处理动作。
crazy是什么意思command_time_limit = 1000s 等候外部命令或 I/O 的时间不可超过 16 分钟。
rvice_time_limit = 这个参数的目的是允许不同 rvice 采用不同时间限制,因此它会取代前述参数的设定,其中 rvice 就是 master.cf 中的第一个字段。
档案锁定
当 local agent 要将信件分到使用者信箱时,有时候使用者正透过 POP3 读取信箱,因此信箱被锁定无法开启,这种情况发生时,local agent 必须等候一段时间重新尝试读取档案,但也不能一直等下去,所以必须要有一些限制。
postfix 支持两种的档案锁定机制:一、使用系统函式 fcntl( ) 或 flock( ),二、使用 local file,postfix 将根据操作系统的不同,选择其中一种或两种并用。有关档案锁定机制在这里不予讨论,有兴趣的读者可以从「专业 LINUX 程序设计」(Wrox 出版,碁峯翻译经销)一书一窥究竟。
do you remember
deliver_lock_attempts = 5 档案被锁定时,尝试读取 5 次。
deliver_lock_delay = 1s 每次尝试读取前,先等候一秒钟。
生活压力大怎么办stale_lock_time = 500 当 lock file 存在超过 500s 时,强制删除 lock file 解除其锁定状态。使用 lock file 其实是透过程序设计技巧来仿真档案锁定功能,它必须由程序设计师自行维护锁定状态,万一有粗心的设计者锁定档案后忘记解除,或是程序当掉无法解除锁定,都
史密斯先生
英语字母发音表会造成档案长期被锁定的假象,所以需要此设定来排除问题。
行程自动回复
当行程或子执行绪因为某些原因当掉,例如:内存不足......等,这个时候 master 将会延迟一段时间后尝试重新启动该行程。当然,如果程序当掉的原因是 main.cf 档案损毁所造成的,就算是不断重复启动也不能恢复正常,因此 postfix 也会将当掉的情形纪录在系统日志里,以便管理员侦错并人工修复。
fork_attempts = 5 行程当掉以后,会尝试重新启动它 5 次!
fork_delay = 1s 每次重新启动前,先等候一秒钟。
transport_retry_time = 60s qmgr 每隔 60 秒尝试驱动 agent 进行分信。
柒、邮件地址改写机制 vs 相关设定档
当 cleanup 模块进行邮件过滤之前,会先依据各种设定文件呼叫 rewrite 模块,进行邮件地址改写,这样做的好处是可以减少标头字段的变化,使得过滤快取(请参考 duplicate_fil
ter_limit 的说明)能更有效率的工作。
邮件地址改写的顺序如下:
将 @hosta,@hostb:ur@site 改写成 ur@site postfix 不支持前面那种特殊写法
将 site!ur 改写成 ur@site 将 UUCP 格式改写为现在使用的地址格式
将 ur%domain 改写成 ur@domain 将 % 符号去掉
将 ur 改写成 ur@$myorigin 从 local 寄出的信会缺少网域名称,在此补上
将 ur@host 改写成 ur@host.$mydomain 将 hostname 改成 FQDN 型式
将 ur@site. 改写成 ur@site 去掉绝对网域名称后面的小数点苹果4s图片
根据各种设定文件改写邮件地址:alias、canonical、virtual。
alias、canonical、virtual 等设定档是为了达成某些特殊功能而设计的,底下说明这些设定文件的功能以及如何启用它们:
别名对应
alias 是 ndmail 最被广泛使用的一项功能,除了用来对应虚拟信箱外,也可以运用在邮递清单或邮件讨论群组上面,由于 postfix 在这部分完全与 ndmail 兼容,因此我们就不再讨论它,详细应用方法请参考 Linux 系管师进阶班讲义 一文。
请在 main.cf 中加入这一行,以便启用 alias:
urbanrenewal
alias_maps = hash:/etc/alias
如果您的系统仅支持 dbm 格式的别名,或是透过 NIS 服务器查询别名,请使用底下的参数:
alias_maps = dbm:/etc/alias, nis:mail.alias
全名对应
这个设定档用来建立使用者全名与账号的关系,例如:
[email]shane@mail.spps.tp.edu.tw[/email] [email]shane.lee@mail.spps.tp.edu.tw[/email]
如果网域名称,已经设定在 $myorigin、$mydestination 或 $_interfaces 中就可以省略不写,直接使用底下的语法:
shane shane.lee
此外这个设定档还有一个用途,就是当网域迁移时,可以将信件对应到新的网域名称,例如:
@mail.spps.tp.edu.tw @tp.edu.tw
关于母亲节的英语作文当本机是 mail gateway 时,透过底下的设定可以得知哪些使用者是位于哪一台邮件主机上,分信时会分给该主机,而非分到本机的 /var/spool/mail 中:
shane @stu.spps.tp.edu.tw(账号相同时)
shane [email]s60101@stu.spps.tp.edu.tw[/email](账号不同时)
当设定档输入完成后,必须先将它杂凑成数据库文件,以 btree 为例(与 ndmail 兼容,但效能较差,建议改用 hash):
英国留学签证
postmap btree:/etc/postfix/canonical (档名可随个人喜好更改)
接着在 main.cf 中加入底下这一行:
canonical_maps = btree:/etc/postfix/canonical
如果只想对应收信人字段则将该行,取代成:
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
如果只想对应寄信人字段则将该行,取代成:天津新东方学校
nder_canonical_maps = hash:/etc/postfix/nder_canonical
虚拟对应
虚拟对应仅能作用在信封里的收信人字段,而不会去改写邮件标头,与全名对应相比较,虚拟对应的功能只能算是半套。虚拟对应一般应用在两种场合:一、将收信人字段中的全名改成账号名称,二、虚拟网域对应。想启用虚拟对应,请在 main.cf 中加入底下这一行:
virtual_maps = btree:/etc/postfix/virtual
至于虚拟对应的设定方式与全名对应相同,请自行参考前面小节的介绍。
使用者迁移
当使用者已经不再使用此信箱,而改用其它服务器提供的信箱时,并无法通知所有的亲朋好友,因此仍然会有不知情的寄信人寄信过来,这些邮件到底该如何处理呢?