全部博文(535)
分类: LINUX
2011-02-17 19:58:44
深入理解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 就会直接跳过进行下一个处理动作。 command_time_limit = 1000s 等候外部命令或 I/O 的时间不可超过 16 分钟。 service_time_limit = 这个参数的目的是允许不同 service 采用不同时间限制,因此它会取代前述参数的设定,其中 service 就是 master.cf 中的第一个字段。 档案锁定 当 local agent 要将信件分到使用者信箱时,有时候使用者正透过 POP3 读取信箱,因此信箱被锁定无法开启,这种情况发生时,local agent 必须等候一段时间重新尝试读取档案,但也不能一直等下去,所以必须要有一些限制。 postfix 支持两种的档案锁定机制:一、使用系统函式 fcntl( ) 或 flock( ),二、使用 local file,postfix 将根据操作系统的不同,选择其中一种或两种并用。有关档案锁定机制在这里不予讨论,有兴趣的读者可以从「专业 Linux 程序设计」(Wrox 出版,碁峯翻译经销)一书一窥究竟。 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_filter_limit 的说明)能更有效率的工作。 邮件地址改写的顺序如下: 将 @hosta,@hostb:user@site 改写成 user@site postfix 不支持前面那种特殊写法 将 site!user 改写成 user@site 将 UUCP 格式改写为现在使用的地址格式 将 user%domain 改写成 user@domain 将 % 符号去掉 将 user 改写成 user@$myorigin 从 local 寄出的信会缺少网域名称,在此补上 将 user@host 改写成 user@host.$mydomain 将 hostname 改成 FQDN 型式 将 user@site. 改写成 user@site 去掉绝对网域名称后面的小数点 根据各种设定文件改写邮件地址:alias、canonical、virtual。 alias、canonical、virtual 等设定档是为了达成某些特殊功能而设计的,底下说明这些设定文件的功能以及如何启用它们: 别名对应 alias 是 sendmail 最被广泛使用的一项功能,除了用来对应虚拟信箱外,也可以运用在邮递清单或邮件讨论群组上面,由于 postfix 在这部分完全与 sendmail 兼容,因此我们就不再讨论它,详细应用方法请参考 Linux 系管师进阶班讲义 一文。 请在 main.cf 中加入这一行,以便启用 alias: alias_maps = hash:/etc/aliases 如果您的系统仅支持 dbm 格式的别名,或是透过 NIS 服务器查询别名,请使用底下的参数: alias_maps = dbm:/etc/aliases, nis:mail.aliases 全名对应 这个设定档用来建立使用者全名与账号的关系,例如: [email]shane@mail.spps.tp.edu.tw[/email] [email]shane.lee@mail.spps.tp.edu.tw[/email] 如果网域名称,已经设定在 $myorigin、$mydestination 或 $inet_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 为例(与 sendmail 兼容,但效能较差,建议改用 hash): postmap btree:/etc/postfix/canonical (档名可随个人喜好更改) 接着在 main.cf 中加入底下这一行: canonical_maps = btree:/etc/postfix/canonical 如果只想对应收信人字段则将该行,取代成: recipient_canonical_maps = hash:/etc/postfix/recipient_canonical 如果只想对应寄信人字段则将该行,取代成: sender_canonical_maps = hash:/etc/postfix/sender_canonical 虚拟对应 虚拟对应仅能作用在信封里的收信人字段,而不会去改写邮件标头,与全名对应相比较,虚拟对应的功能只能算是半套。虚拟对应一般应用在两种场合:一、将收信人字段中的全名改成账号名称,二、虚拟网域对应。想启用虚拟对应,请在 main.cf 中加入底下这一行: virtual_maps = btree:/etc/postfix/virtual 至于虚拟对应的设定方式与全名对应相同,请自行参考前面小节的介绍。 使用者迁移 当使用者已经不再使用此信箱,而改用其它服务器提供的信箱时,并无法通知所有的亲朋好友,因此仍然会有不知情的寄信人寄信过来,这些邮件到底该如何处理呢? 首先使用者可以在自己的家目录里,建立 .forward 档透过这个档案将邮件转寄到新的信箱,管理员也可以透过 alias 别名对应帮该名使用者转信。虽然这样做很人性化,但也有两个缺点:一、转信会增加 postfix 处理邮件的负担,导致效能降低,二、亲朋好友并不知道要把信寄去哪里才对,所以不断地麻烦我们! 另一种处理的方法是不要替已经搬走的使用者转信,而直接告诉对方该寄去哪里才对,如果管理员也不清楚新的邮件地址,直接告诉对方不要再寄信过来也可以,使用这个功能请在 main.cf 加入: relocated_maps = hash:/etc/postfix/relocated /etc/postfix/relocated 的设定范例如下: shane 使用者 shane 已经不再使用此信箱了,请将信寄到 tp.edu.tw 主机,新账号是 sean! 在提示讯息中,我们不使用 @ 符号([email]sean@tp.edu.tw[/email])是为了避免被信箱收集者卖给广告商。 邮件绕送路由 transport_maps 允许我们直接将符合条件的邮件,透过特定的方式,传送到特定的主机,而不需要依靠 DNS MX 纪录,譬如前面已经介绍过的延迟传送机制外(给拨接用户使用的),要启用 transport 功能,请在 main.cf 加入: transport_maps = hash:/etc/postfix/transport 底下是 transport 设定文件的应用范例,意思是要将寄给 @spps.tp.edu.tw 网域的信件,传送到 172.16.1.6 这台主机的 8025 port: spps.tp.edu.tw smtp:[172.16.1.6]:8025 应用场合 优秀的管理员明白各种设定档各有职司,就算功能可以互相取代,也不应该混合着用,例如:用全名对应机制作别名对应,用别名对应机制作虚拟对应......这样作恐怕没有人可以厘清其逻辑关系,将来要如何维护呢? 到底什么情况下要用哪一种机制来实作呢?笔者给大家的建议是: 将寄信人账号对应成全名 sender_canonical_maps = hash:/etc/postfix/sender_fullname 将收信人全名对应成账号 virtual_maps = hash:/etc/postfix/recipient_loginname 网域名称迁移 canonical_maps = hash:/etc/postfix/domain_canonical 使用者迁移 relocated_maps = hash:/etc/postfix/relocated 将寄给本机账号的信件分到其它服务器 canonical_maps = hash:/etc/postfix/individual_user 将寄给虚拟网域的邮件转给真实存在的网域 virtual_maps = hash:/etc/postfix/virtual_domain 让使用者登入后能改用虚拟信箱寄信 smtpd_sender_login_maps = hash:/etc/postfix/unaliases 将寄给虚拟信箱的邮件转给真实存在的使用者 alias_maps = hash:/etc/aliases 将邮件导向某台邮件过滤或扫毒主机 transport_maps = hash:/etc/postfix/transport 捌、SpamAssassin SpamAssassin 是一套用来协助过滤垃圾邮件的程序,它会针对信件中特定的比对样式给予不同的分数,当分数超过指定的值后,该封邮件就会被当作垃圾邮件处理,处理方式依据设定的不同,会在信件标头或邮件主旨字段加入警告讯息。 SpamAssassin 必须结合 MTA 来使用,单独执行并不能发挥其功效,由于该程序是使用 perl 语言开发,因此如果刚开始安装 Linux 操作系统时没有一并安装,事后要补装有一点小麻烦,安装所需的套件如下(省略版次号码,请自行按 TAB 补字,依顺序安装),这些 RPM 档案可以从 RedHat 光盘取得: perl perl-Time-HiRes perl-Digest-HMAC perl-Net-DNS spamassassin 安装好之后,请以下列指令启动 spamd: service spamassassin start 并将该服务设定为开机自动执行: chkconfig --level 3,5 spamassassin on 请用底下指令,测试程序能否成功执行: spamc -c < /var/mail/username 假设该使用者信箱已经有至少一封邮件,这时 spamc 程序会将该邮件传送给 spamd(127.0.0.1:783)进行评分,如果执行成功应该会看到 SpamAssassin 的评分,例如: 3.5/5.0 让 postfix 使用 SpamAssassi 深入理解postfix 时间 : 2009-03-14 作者:匿名 编辑:sky 点击: 208 [ 评论 ]
|
chinaunix网友2011-03-05 16:48:27
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com