020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> LINUX应用 >> Linux教程 >> 正文
    openwebmail进阶使用

    点击:   发布日期:2013-01-10

    本文来自 www.020fix.com
    让 Open WebMail 成为 Server 预设的网页
    建立一个 index.html 档案, 内容如下 a 或 b 皆可

    a.
    <html><head>
    <meta http-equiv="Refresh"
    content="0;URL=http://your_server/cgi-bin/openwebmail/openwebmail.pl">
    </head></html>

    b.
    <html>
    <body onload=
    "window.open('http://your_server/cgi-bin/openwebmail/openwebmail.pl','_top')">
    </body>
    </html>

    然后将 index.html 拷贝到 http server 的 document root,

    ps: 以 FreeBSD 来说, 会在 /usr/local/www/data, 以 Linux/RedHat 来说, 会在 /var/www/html



    预设使用中文图示
    Open WebMail 内建有许多套的图示 (iconset), 不过预设用的是不含中文的 Default iconset. 目前含有中文的 iconset 有 Default.Chinese.Triditional, Cool3D.Chinese.Traditional 和 Cool3D.Chinese.Simplified 这三套.

    例如要预设使用 Cool3D.Chinese.Traditional iconset 的话, 请在 openwebmail.conf 加上下面这行

    default_iconset Cool3D.Chinese.Traditional



    关于病毒邮件
    有越来越多的病毒都是透过电子邮件进行感染与散布, 基本上都是

    使用者收到一封含有电脑病毒附件的电子邮件
    使用者基于好其打开病毒附件, 或是邮件经过设计, 一开启邮件就连带自动开启病毒附件
    附件是病毒档, 对邮件系统进行感染
    以这个使用者的邮件系统为基地, 透过其通讯录或看过的网页寻找下一个收件人, 寄出病毒邮件给他们
    如果使用者用的是 WebMail, 上述的第 4 点是不会发生的, 因为 WebMail 本身系统并不在使用者的电脑上, 但是仍有可能发生 2, 3 的情形. 在目前使用者多有警觉心的情况下, 大部分病毒都设计成不需要经由使用者点选附件, 只要开启邮件就会发生中毒的情形. Open WebMail 针对此点特别设计, 凡是这类的病毒附件被下载时都会被改名为 .txt 档案避免附件被系统执行.



    关于邮件过滤
    虽然说用 openwebmail 看信不必担心中毒的问题, 但是如果信箱总是有一堆垃圾信/病毒信的话, 看起来还是很烦的. openwebmail 除了静态的邮件规则外, 另外有四组动态的过滤器可以用来过滤垃圾信或是病毒信件

    过滤寄件人地址格式不正确的信件:(badformatfrom filter)
    这个 filter 会检查信件的发信人地址的格式是否使用不正确的格式, 可以用来过滤部份的垃圾信 (不过极少数时候会将正常的信件也过滤到垃圾筒)

    过滤伪造来源端的信件:(fakedsmtp filter)
    这个 filter 会检查信件的发信主机 (SMTP server) 是否试图在隐藏或伪造他的名字, 如果是的话就将信件移到垃圾桶, 这个 filter 可以用来过滤大部份的垃圾信 (不过少数时候会将正常的信件也过滤到垃圾筒)

    过滤伪造寄件人地址的信件:(fakedfrom filter)
    每封 Email 在发送的时候, 会像真实世界的邮件一样, 有所谓的信封与信件本身两个部分. 这个 filter 会检查信封的发信人与信件的发信人是否有不合的情形, 如果就将信件移到垃圾桶. 许多的垃圾信与病毒产生的邮件都是属于这类

    过滤伪造 EXE 附件型态的信件: (fakedexecontenttype filter)
    电子邮件病毒原本只有在使用者打开信件中属于可执行档的附件时,才会感染病毒。但是新近出现的一些电子邮件病毒却能作到只要使用者开启这封邮件就会中毒,让使用者闻毒色变 . 这个 filter 会过滤这类的信件, 将其移到垃圾桶.

    四个 filter 在 defaults/openwebmail.conf 中内定是关闭的, 分别是

    default_filter_badformatfrom no
    default_filter_fakedsmtp no
    default_filter_fakedfrom no
    default_filter_fakedexecontenttype no

    管理者如果要将其设定成预设是开启的话, 请将上述的 no 改成 yes, 加到 openwebmail.conf中, 这样对于新的使用者 filter 内定就会是开启的状态, 不过使用者仍可以分别在自己的 个人偏好设定中作不同的设定

    注: 建议 default_filter_fakedexecontenttype 一定要开, 可以过滤掉大部分的邮件病毒

    注: 论文 owmfilter.pdf, 投影片 owmfilter-slide.pdf



    呼叫外部程式扫描病毒信 (viruscheck)
    Open WebMail 可以透过呼叫外部程式的方式来扫描信件中是否含有病毒, 扫描的对象可以是单指由 POP3 server 抓回来的信件, 或是包含所有在新信匣中出现的新信件. 要启动这个功能, 必须

    安装 ClamAV (http://www.clamav.net) 这套扫毒软体, 并且确定 ClamAV 中的扫毒引擎 clamd 已经正确地启动
    在 openwebmail.conf 中, 确认 viruscheck_pipe 这个选项中, clamdscan (ClamAV 的 client 程式) 的路径是正确的
    在 openwebmail.conf 中, 将 viruscheck_source_allowed 设成 pop3 或者是 all
    设成 pop3 的话, openwebmail 只会对由 pop3 抓回来的信件进行扫毒动作, 这个适合用在 mail 系统本身已经有加装扫毒软体的情形
    设成 all 的话, openwebmail 会扫描所有在新信匣中出现的新邮件, 这个适合用在 mail 系统本身没有外挂防毒软体的情形
    在 openwebmail.conf 中, 将 enable_viruscheck 设成 yes
    在 defaults/openwebmail.conf 中, 还有一些与 viruscheck 相关的选项, 可以参考 openwebmail.conf.help 设定


    呼叫外部程式判读广告信 (spamcheck)
    Open WebMail 可以透过呼叫外部程式的方式来判读信件是否为广告信, 判读的对象可以是单指由 POP3 server 抓回来的信件, 或是包含所有在新信匣中出现的新信件. 要启动这个功能, 必须

    安装 SpamAssassin (http://www.spamassassin.org) 这套广告信判读软体, 并且确定 Spamassassin 中的判读引擎 spamd 已经正确地启动

    注: 请特别注意 spamd 在启动时, 一定要加上 --local 或是 -L 这项参数, 让 Spamassassin 在判读信件时, 不要连线到网路上去抓取资料, 否则判读单封信件的时间会变得久许多


    在 openwebmail.conf 中, 确认 spamcheck_pipe 这个选项中, spamc(SpamAssassin 的 client 程式) 的路径是正确的
    在 openwebmail.conf 中, 将 spamcheck_source_allowed 设成 pop3 或者是 all
    设成 pop3 的话, openwebmail 只会对由 pop3 抓回来的信件进行判读动作, 这个适合用在 mail 系统本身已经有加装广告判读软体的情形
    设成 all 的话, openwebmail 会判读所有在新信匣中出现的新邮件, 这个适合用在 mail 系统本身没有外挂广告判读软体, 或是使用者希望 针对个人喜好再度进行广告信判读的情形. (这边的个人喜好, 需要让系统透过 learnspam 这个选项配合学习)
    在 openwebmail.conf 中, 将 enable_spamcheck 设成 yes
    在 defaults/openwebmail.conf 中, 还有一些与 spamcheck 相关的选项, 可以参考 openwebmail.conf.help 设定
    注: Open WebMail 是如何, 以及在何时呼叫外部程式进行信件扫描或判读呢?



    对于由 POP3 server 抓回来的信件, 在由远端抓回每单封信后, 就会呼叫外部程式来扫毒或是判读, 这边的抓取和扫瞄等动作, 都是在背景执行, 而出现在新信匣中的其他新信件, 则是当使用者点选要浏览新信匣时会启动一个背景扫瞄的行程, 扫描新信匣中的信件.

    在 使用者个人设定中的 "等待 信件背景过滤 时间" 可以用来设定在读取新信匣时, 要等待背景过滤多长的时间后, 才将结果回传给使用者, 预设值是 10 秒, 这个值如果设得太小, 可能会发生广告信/病毒信没能在使用者读取前被过滤的情形.

    设计 VirusCheck /SpamCheck 的目的, 主要是为了解决由 Open WebMail 由外部 POP3 收回的信件, 不会经由 MTA(sendmail/postfix) 或 MDA (procmail) 附挂的扫描程式检查的这个问题, 虽然 Open WebMail 也可以用来扫描 POP3 以外的信件, 不过我们建议可能的话, 还是在 MTA/MDA 装上扫描程式, 效能会比较好. 而且在使用者不是使用 Open WebMail 存取信件时, 也一样有扫描的效果.



    呼叫外部程式学习广告信与正常信
    Open WebMail 可以透过呼叫外部程式的方式来学习信件是广告信或是正常信, 这个功能通常是配合广告信判读运作, 当判读失误时, 我们可以透过纠正误差, 以便在下次碰上类似信件, 不会再发生判读错误的情形. 要启动这个功能, 必须

    安装 SpamAssassin (http://www.spamassassin.org) 这套广告信判读软体

    在 openwebmail.conf 中, 确认 learnspam_pipe 和 learnham_pipe 这个两个选项中, sa-learn 的路径是正确的
    在 openwebmail.conf 中, 将 enable_learnspam 设成 yes
    注: 学习的结果会被存在各 user home 目录下的 .spamassassin 中, 而这个学习的结果, 一定要被广告信过滤程式所参考才有意义. 像是 local deliver 被设定成会呼叫 spamassassin 进行信件扫描, 或是在 Open WebMail 中启动 spamcheck 功

    注: Open WebMail 在 2.32 20040707 以后, 才开始支援 viruscheck, spamcheck 和 learnspam 相关功能



    QUOTA 相关设定
    所谓 QUOTA 就是指使用者所能使用的磁碟空间. 在 Open WebMail 中, 电子邮件, 行事历, 网路硬碟等等, 所使用的磁碟空间适合併计算的. defaults/openwebmail.conf 中与 QUOTA 相关的项目一共有五个, 你可以在 openwebmail.conf 重新设定这些选项

    quota_module

    这是用来设定要使用哪个 quota 模组, 目前有 quota_unixfs.pl 和 quota_du.pl 这两个模组.
    其中 quota_unixfs.pl 会透过 UNIX 档案系统的 Quota 系统得知使用者目前的空间使用量, 效能较好, 不过只能适用在 openwebmail 使用者也是 unix 帐号的情形下. 而 quota_du.pl 则是透过执行 du 这个程式来取得使用者的空间使用情形, 效能较差, 但是可以适用在非 unix 帐号的虚拟使用者

    注; 如果要使用 quota_unixfs.pl 模组, 要先安装 Quota-1.4.10.tar.gz

    quota_limit

    设定使用者能使用的空间上限. 单位 Kbyte. 这个设定只有在 quota_module 不传回使用者 quota 上限时(如 quota_du.pl) 才会被使用

    quota_threshold

    一般情形下, 使用者的空间使用状况会显示在视窗的外框上缘. 但是当使用者空间用量超过其上限的 quota_threshold% 时, 会有一个较明显的 quota 使用量显示在页面的上方以提醒使用者

    delmail_ifquotahit

    用来设定 当使用者空间已满时, 是否自动删除 各信匣中 过旧的邮件以取得一些空间

    delfile_ifquotahit

    用来设定 当使用者空间已满时, 是否自动删除 网路硬碟中 过旧的档案以取得一些空间

    注: 以上选项都是用来控制使用者在其个人目录下的空间用量, 如果要限制使用指在 spool 所能用的空间, 请参考 opewebmail.conf.help 中 spool_limit 的说明

    注: 启动 quota 后, 可能会因为使用者空间已满, 导致 openwebmail 无法建立或更新使用者信件匣索引资料库, 造成 "Software error: ndbm store returned -1, errno XX, ..." 之类的错误, 进而发生使用者无法登入 openwebmail 的问题
    要避免这个问题, 可以在 openwebmail.conf 中将 use_syshomedir_for_dotdir 选项 设为 no, 让原本在使用者 home 目录下的 .openwebmail 改放到 ow_userdir 选项 所指定的目录下, 接着只要 ow_userdir 这个目录所在的 partition 没有设定 quota, 就可以避免前述问题.



    命令列工具 openwebmail-tool.pl
    由于 Open WebMail 的 filter 是在使用者透过 Open WebMail 读信后才开始动作, 所以可能会发生使用者透过 finger 去检查说有新信, 但是进入 WebMail 后却一封也没有, 因为全部是垃圾或病毒信. openwebmail-tool.pl 可以被当作是 finger 的替代品, 他会在做完信件过滤还才开始回报信箱的状态.

    部分系统的 fingerd 允许管理者透过 -p 参数指定一支外部程式来作信件状态的检查, 这时候可以拿 openwebmail-tool.pl 作为信箱检查程式

    以 FreeBSD 为例, 修改 /etc/inetd.conf

    #finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s

    改成

    finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s -p /usr/local/www/cgi-bin/openwebmail/openwebmail-tool.pl
    以 Linux 为例, 修改 /etc/xinetd.d/finger

    service finger
    {
    socket_type = stream
    wait = no
    user = nobody
    server = /usr/sbin/in.fingerd
    disable = yes
    }

    改成

    service finger
    {
    socket_type = stream
    wait = no
    user = nobody
    server = /usr/sbin/in.fingerd
    server_args = -p /var/www/cgi-bin/openwebmail/openwebmail-tool.pl
    }


    openwebmail-tool.pl 也可以被用在定期帮使用者作信件匣 index 检查或是抓 POP3 外部信件, 只要在 crontab 中加入

    59 5 * * * /usr/local/www/cgi-bin/openwebmail/openwebmail-tool.pl -q -a -p -i

    会在每天早上 5:59 检查所有使用的的信件匣 index, 并且替使用者抓外部信件


    如果您希望使用行事历中的外部 Email 通知功能的话, 您也需要在 crontab 中执行 openwebmail-tool.pl

    0 */2 * * * /usr/local/www/cgi-bin/openwebmail/openwebmail-tool.pl -q -a -n

    上面这行会让 openwebmail-tool.pl 每 2 个小时检查一次使用者的行事历, 看看接下来的一段时间里 ( 时间长度由 openwebmail.conf 中的 calendar_email_notifyinterval 选项所决定, 内定是 120 分钟) 是否使用者有事情要去办

    注: 很明显地, crontab 中的设定要和 calendar_email_notifyinterval 配合, 建议 calendar_email_notifyinterval 应该要比 crontab 中长一个小时或相等


    公用通讯录, 公用邮件规则, 公用行事历
    目前 Open WebMail 对于公用的通讯录/邮件规则/行事历 的支援还非常的原始, 需要管理者手动去修改. 如果管理者希望透过 Web 介面设定的话, 步骤如下

    建立一个管理公用 通讯录/邮件规则/行事历 的帐号, 例如 global


    以 global 登入 unix
    mkdir mail


    ln -s 公用通讯录档名 ~global/mail/.address.book
    ln -s 公用邮件规则档名 ~global/mail/.filter.book
    ln -s 公用行事历档名 ~global/mail/.calendar.book

    注: 要注意 公用通讯录/邮件规则/行事历 档案的权限. 要让 global 这个使用者可以写入, 而其他使用者可以读取


    以 global 登入 openwebmail, 修改其个人通讯录/邮件规则/行事历 即代表 修改公用通讯录/邮件规则/行事历


    自动回信
    Open WebMail 的自动回信功能, 是透过让 Transpoort Agent (如 sendmail) 检查 ~/.forward 这个档案, 然后呼叫 vacation.pl 这个程式来完成的. 在部分的机器上, 为了安全的考量, Transport Agent 透过 smrsh 执行外部程式, 限定只有特定的程式可以被呼叫, 这时我们需要在 /etc/smrsh/ 放入一个vacation.pl 的连结, 这样自动回信功能才能正常动作

    以 Linux Redhat 7.x 为例

    cd /etc/smrsh
    ln -s /var/www/cgi-bin/openwebmail/vacation.pl .

    如果您碰到自动回信功能不能正常动作的情形, 可以利用 vacation.pl 中的 -d 这个选项除错

    选定某位使用者, 登入 openwebmail, 在个人偏好设定中, 启动自动回信功能
    编辑使用者 home 目录下的 .forward 这个档案, 在 vacation.pl 的后面加入 -d 这个参数
    寄一封信给这个使用者, 测试自动回信功能
    检查 /tmp/vacation.debug 以找出可能的错误原因


    虚拟主机
    当您在同一部主机上设立多个虚拟主机时, 您只需要安装一套 Open WebMail 就可以同时让所有的虚拟主机都有 WebMail 的功能. Open WebMail 上允许您替每一个虚拟主机准备一个 设定档, 所以每一部虚拟主机都可以有自己的设定, 包括 domainname, auth_module, quota limit, mailspooldir 等等

    举例而言, 要替虚拟主机 sr1.domain.com 作设定

    cd cgi-bin/openwebmail/etc/sites.conf/
    cp ../openwebmail.conf sr1.domain.com
    依虚拟主机 sr1.domain.com 的需要, 修改档案 sr1.domain.com 中的选项


    使用者别名
    Open WebMail 可以根据 sendmail virtusertable 格式的档案的内容, 建立使用者别名. 比如说使用者登入的是 john@somedomain 这个帐号, 但是对应到系统里头却是 tom@domain2. 关于 sendmail virtusertable 的设定方式, 请参考 http://www.sendmail.org/virtual-hosting.html

    举例而言, 假设您的主机原本的 domainname 是 mail.domain.com, 在上面有 use1, user2., user3 这三位使用者, 因而他们的 email address 是 user1@mail.domain.com, user2@mail.domain.com, user3@mail.domain.com. 现在您因为需要, 再同一部主机上设立了一个虚拟主机 mail.virtualdomain.com, 然而这个 domain 上也有一个 user1. 为提示同一部 unix 机器只能有一个 user1 帐号. 这时候我们可以透过 virtusertable 将 user1@mail.virtualdomain.com 对应到 user4@mail.domain.com, 但是使用者 user1@mail.virtualdomain.com 却完全不知道他用的是 user4@mail.domain.com

    让 sendmail 同时承认并收取 mail.domain.com, mail.virtualdomain.com的信件
    找到 /etc/mail/sendmail.cf 中 Fw-o 开头的这一行, 记取其后的档案名称 (一般是 /etc/mail/local-host-names)
    修改 /etc/mail/local-host-names, 加入这两个 domain 的名字

    mail.domain.com
    mail.virtualdomain.com


    将 user1@mail.virtualdomain.com 对应到 user4@mail.domain.com
    修改 /etc/mail/virtusertable, 加入下列内容

    user1@mail.virtualdomain.com user4@mail.domain.com


    让 sendmail 重读设定档

    kill -1 pid_of_sendmail


    当 user1@mail.virtualdomain.com 要登入 openwebmail 时, 应该
    连线 http://mail.virtualdomain.com/cgi-bin/openwebmail/openwebmail.pl, 以 user1 登入
    openwebmail 会根据 virtusertable 内容, 转为使用 user4 这个 unix 帐号

    当 user1@mail.domain.com 要登入 openwebmail 时, 应该
    连线 http://mail.domain.com/cgi-bin/openwebmail/openwebmail.pl, 以 user1 登入
    openwebmail 会使用 user1 这个 unix 帐号


    虚拟使用者
    所谓的虚拟使用者指的是使用者在主机上没有任何 unix 帐号, 但是却可以透过 POP3 或是 OpenWebMail 使用其电子信箱. 这样的组态, 一方面比较不会有安全性的问题, 同时也可以在单一部主机上支援较多的使用者

    Open WebMail 的虚拟使用者功能主要是搭配 vm-pop3d 与 PostFix 来使用. 系统中 auth_vdomain.pl 这个认证模组便是用来对 vm-pop3d 与 PostFix 上的虚拟使用者进行认证的工作. 此外 Open WebMail 还提供 Web 介面, 让被授权的使用者可就对虚拟主机下的虚拟使用者进行管理. 进行如新增帐号/删除帐号, 修改密码 等工作.

    关于如何利用 OpenWebMAil + vm-pop3d + PostFix 建立支援虚拟使用者的邮件系统的详细资料, 请参考 auth_vdomain.pl 中的说明. 此外 Kevin L. Ellis 也写了一份 如何利用 openwebmail + vm-pop3d + postfix 建立虚拟使用者的文件



    单一使用者权限设定
    在 defaults/openwebmail.conf 中可以找到许多用来限定使用者所能使用功能的选项, 在某些情况下, 针对不同的使用者, 可能会需要设定不同的值. 使用者设定档的位置是在 cgi-bin/openwebmail/etc/user.conf, 档案的名称和使用者名称一样 (如果是经过 virtusertable mapping 的 使用者, 以 mapping 之后的名称为准).

    举例而言, 你希望针对 guest 这个使用者作权限设定

    cd cgi-bin/openwebmail/etc/users.conf/
    cp SAMPLE guest (各项说明请参考 cgi-bin/openwebmail/etc/openwebmail.conf.help)
    视需要, 修改 guest 这个档案的内容
    注: Open WebMail 载入设定档的顺序如下

    载入 cgi-bin/openwebmail/etc/defaults/openwebmail.conf
    载入 cgi-bin/openwebmail/etc/openwebmail.conf
    载入 cgi-bin/openwebmail/etc/sites.conf/domainname (如果有的话)

    在载入上述设定档后, 接着进行下面三个步骤

    载入 authentication module
    loginname 根据 virtusertable 被 mapping 到 real userid.
    userid 作密码确认


    载入 cgi-bin/openwebmail/etc/users.conf/username (如果有的话)
    由以上也可以知道, 某些选项放到 使用者设定档是没有效果的
    同样的选项如果同时出现在不同的设定档中, 后面载入的会盖掉前面的



    PAM 的支援
    PAM 全名是 Pluggable Authentication Modules, 它提供了一致性的机制让我们能很容易地使用外挂模组的方式来作使用者认证 (也就是密码查核啦), 更详细的 PAM 说明, 请参考 http://www.kernel.org/pub/linux/libs/pam/

    目前已知 Solaris 2.6, FreeBSd 3.1 和 Linux 都支援 PAM, 要让 Open WebMail使用 PAM 机制来作使用者认证, 步骤如下

    下载 Perl 套件 Authen::PAM (Authen-PAM-0.14.tar.gz), 您可以在 http://www.cs.kuleuven.ac.be/~pelov/pam/ 找到最新的版本
    cd /tmp
    tar -zxvf Authen-PAM-0.14.tar.gz
    cd Authen-PAM-0.14
    perl Makefile.PL
    make
    make install

    注: 建议您在 make install 前先做 make test, 如果 make test 有任何错误讯息的话, 表示很可能您的系统无法使用 PAM


    修改 /etc/pam.conf, 加入以下 3 行

    在 Solaris
    openwebmail auth required /usr/lib/security/pam_unix.so.1
    openwebmail account required /usr/lib/security/pam_unix.so.1
    openwebmail password required /usr/lib/security/pam_unix.so.1

    在 FreeBSD
    openwebmail auth required /usr/lib/pam_unix.so
    openwebmail account required /usr/lib/pam_unix.so
    openwebmail password required /usr/lib/pam_unix.so

    注 : 某些版本 FreeBSD 的 PAM 支援有问题 (例: 4.1)

    在 Linux
    openwebmail auth required /lib/security/pam_unix.so
    openwebmail account required /lib/security/pam_unix.so
    openwebmail password required /lib/security/pam_unix.so

    如果您的 Linux 没有 /etc/pam.conf, 但是有 /etc/pam.d 这个个目录
    请建立 /etc/pam.d/openwebmail 这个文字档, 并放入以下 3 行

    auth required /lib/security/pam_unix.so
    account required /lib/security/pam_unix.so
    password required /lib/security/pam_unix.so

    pam.d 说明由 protech.AT.protech.net.tw 热心提供


    修改 openwebmail.conf, 将 auth_module 成 auth_pam.pl
    检查 auth_pam.pl 的内容, 看看是否有需要修改的部分
    关于 PAM 设定的进一步说明, 建议您参考由 Andrew G. Morgan 所写的 The Linux-PAM System Administrators' Guide

    目前常见需要使用 auth_pam.pl 的情况, 是使用 NIS server 上的帐号系统. 当使用者帐号放在 NIS server 时, 使用 auth_unix.pl 当认证模组的话, 只能检查使用者密码, 却没有办法修改密码. 但是如果用 auth_pam.pl 当认证模组, 那么密码检查与密码更改功能都能正常使用.



    让 Open WebMail 常驻于记忆体以加快执行速度
    SpeedyCGI 简介
    SpeedyCGI 这个套件与 mod_perl 或是 FastCGI 相似, 都是能让 CGI 程式常驻于记忆体执行的工具, 但是 要使用 mod_perl 或 FastCGI, 程式需要较大程度的修改. 而 SpeedyCGI 是针对 perl 所设计的, 能让大部分的 perl 程式只要作少量的修改, 就可以顺利地变成常驻执行的程式.

    每当有使用者的 request 进到 Httpd, Httpd 都要呼叫执行 openwebmail 中对应的程式, 以 Perl CGI 的角度来看, 所需要的动作有

    执行 perl interpreter
    perl interpreter 由硬碟上载入 openwebmail 程式码与相关连的模组到记忆体中
    perl interpreter 将 openwebmail source code 编译成 perl byte code
    perl interpreter 载入 byte code, 初始化环境 (initialize memory, global variable)
    byte code 执行
    由于 Open Webmail 的程式码相当庞大, 步骤 2, 3 所需的时间也就相当地可观. 但是由于每当使用者 request 完成后, openwebmail 就结束执行, 所以下次使用者 request 进来时, 只好又重复 1,2,3,4 的动作. 其实对同一支 perl 程式而言, 步骤 1,2,3,4 的结果, 永远都是一样的, 只有步骤 5 会根据使用者状况产生不同的结果. 如果能省下 重复在 1,2,3,4 步骤上的时间, 那么 Perl CGI 程式的速度便可以大幅地提昇, 这就是为何我们要是使用 SpeedyCGI 的原因了.

    在 SpeedyCGI 的架构下, 当 Web Server 收到 request 后, 会执行一个 C 写的 wrapper program (speedy), 这个 wrapper 会将 CGI 的参数传给后端的 speedy_backend. speedy_backend 会确认程式是否第一次执行, 如果是的话, 由 speedy_backend 进行 步骤 1到 5, speedy_backend 再将结果传回 给 wrapper, wrapper 再将结果交由 httpd 传回给使用者. 要注意的是这里步骤 5 以后程式并不结束, 而是等在那里. 等下次又有 request 进来时, speedy_backend 由 wrapper 接收 CGI 参数, 程式直接由步骤 5 开头接着跑一次就可以了, 接着就可把结果经由 wrapper, 传给 httpd 再回给使用者.

    要使用 SpeedyCGI 的程式, 要注意的就是因为程式会一直常驻, 所以在记忆体管理上样特别小心, 同时由于步骤 4 并不重复执行, 所以 global 变数的内容会一直保留, 程式要针对实际的需要进行必要的处理.

    注: Open WebMail 自版本 1.90 20030313 以后, 已经可以顺利地在 SpeedyCGI 下环境下执行.

    安装与设定 SpeedyCGI (由 source 安装)
    SpeedyCGI 套件安装

    取得最新本的 SpeedyCGI 套件
    http://sourceforge.net/project/showfiles.php?group_id=2208
    http://daemoninc.com/SpeedyCGI/download.html

    cd /tmp
    tar -zxvf path_to_source/CGI-SpeedyCGI-2.22.tar.gz
    cd CGI-SpeedyCGI-2.22
    perl Makefile.PL (问是否装 mod_speedycgi 时请回答 'no')

    编辑 speedy/Makefile 这个档案
    在有 DEFINE = 这行的最后面加上 -DIAMSUID

    make
    make install
    (如果看到 mod_speedycgi 相关的错误, 请暂时先忽略它)

    注: 在 RedHat 中的 perl-5.8.0-88 配合使用 SpeedyCGI 时,
    某些 regular expression 写法会造成 suid 程式 tainted variable 检查错误
    请记得更换到 Open Webmail 2003/09/29 以后的版本


    将 speedy setuid root

    首先找出 speedy 被安装在哪里 , 通常是 /usr/bin/speedy 或是 /usr/local/bin/speedy,
    这里我们假设它装在 /usr/bin/speedy

    cp /usr/bin/speedy /usr/bin/speedy_suid
    chmod 4555 /usr/bin/speedy_suidperl


    修改 openwebmail 程式以 SpeedyCGI 方式执行

    由于 openwebmail 程式码已经是 SpeedyCGI ready, 所以您要作的只有
    把所有 cgi-bin/openwebmail/openwebmail*pl 中第一行

    由 #!/usr/bin/suidperl -T
    换成 #!/usr/bin/speedy_suidperl -T -- -T/tmp/speedy

    第一组 -T 是要传给 perl interpreter 的, 而 -- 之后的 -T/tmp/speedy 则是要给 SpeedyCGI 的参数, 代表的是暂存档路径的前置字串

    (注意: 如果是 perl 5.8.4 以后的版本, 那么上面那行要 改成 #!/usr/bin/speedy_suidperl 才行)

    注: 如果将来系统很忙碌的话, 您可能会看到一大堆像是 /tmp/speedy.数字 的 档案, 所以有些管理者可能会希望把这个参数换成其他位置, 比如说是 /var/run/speedy (FreeBSD/Linux) 或是 /var/tmp (Solaris)


    连上你的 OpenWebMail 看看, 享受一下加速的快感 :)


    安装与设定 SpeedyCGI (由 rpm 安装)
    如果您用的是 RedHat Linux, 那么您可以透过 rpm 快速安装

    如果您的 RedHat 是 7.3 的话, 请

    wget http://turtle.ee.ncku.edu.tw/ope ... -2.21-RH73.i386.rpm
    rpm -Uvh --force perl-CGI-SpeedyCGI-2.21-RH73.i386.rpm

    如果您的 RedHat 是 8.0 的话, 请

    wget http://turtle.ee.ncku.edu.tw/ope ... -2.21-RH80.i386.rpm
    rpm -Uvh --force perl-CGI-SpeedyCGI-2.21-RH80.i386.rpm

    如果您的 RedHat 是 9.0 的话, 请

    wget http://turtle.ee.ncku.edu.tw/ope ... I-2.21-RH9.i386.rpm
    rpm -Uvh --force perl-CGI-SpeedyCGI-2.21-RH9.i386.rpm


    接着执行

    speedy_convert

    这个程式会自动设定已安装的 Open WebMail 以便让其以 SpeedyCGI 方式执行


    连上你的 OpenWebMail 看看, 享受一下加速的快感 :)

    其他 SpeedyCGI 注意事项

    如果你的 Open WebMail 是装在一台很慢的机器上, 你可能会希望别让使用者遇到 script 第一次载入所造成的延迟, 那么你可以试试 preload.pl 这个 script. 它基本上是一个简单的 http client, 代替 user 连到 web server 事先启动 openwebmail scripts.

    a. 你可以透过浏览器连到 http://your_server/cgi-bin/openwebmail/preload.pl
    至于内定的密码与如何更改密码请看 preload.pl 内说明

    b. 你也可以在命令列下执行 preload.pl, 或是在 crontab 放入下面这行, 将常用的 scripts 预先载入记忆体中

    0 * * * * /usr/local/www/cgi-bin/openwebmail/preload.pl -q openwebmail.pl openwebmail-main.pl openwebmail-read.pl

    ps: 如果你机器的记忆体够多, 你也可以选择 preload 全部的 scripts.

    0 * * * * /usr/local/www/cgi-bin/openwebmail/preload.pl -q --all


    想再快一些吗?

    你可以考虑使用只要一个 process 就能同时处理多个 connection 的 httpd, 例如 http://www.acme.com/software/thttpd/, 来取代原本的 apache web server. 请记得要参考 doc/thttpd.speedycgi.txt 的说明, 以便让 thttpd 能配合 speedycgi 正常运作


    与新版 Perl 5.8.4 的相容性问题

    最新版的 Perl 5.8.4 开始对 suid 的 perl script 做了更多严格的检查, 因此在安装的时候需要特别注意, 否则部份检查可能会造成与 SpeedyCGI 的不相容的情形 以下是要注意的部份 (在此特别感谢 李彦明 提供这个解法)

    a. perl interpreter 的档名一定要含有 'perl' 这个字串

    过去我们建议大家使用 speedy_suid 作为 suid 的 speedycgi perl interpreter 的档名, 不过现在建议大家改用 speedy_suidperl 作为 suid 的 speedycgi perl interpreter 档名, 以符合这个检查的要求

    b. 传给 perl interpreter 的参数必须和写在 perl scipt file 中第一行 #! 的参数一致

    因为这个限制, 所以戏现在已经无法透过下面这样的方式告诉 SpeedyCGI 改变 tmpbase 的值

    #!/usr/bin/speedy_suidperl -T -- -T/tmp/speedy

    现在各 perl script file 的第一行只能是下面这个样子

    #!/usr/bin/speedy_suidperl

    换句话说, 就是不能透过 "-- -parameter_for_speedy" 来传递参数给 SpeedyCGI 系统了

    注: 如果你觉得预设 tmpbase "/tmp/speedy" 不好, 一定要改的话, 你可以使用 cgi-bin/openwebmail/misc/patches/speedycgi.tmpbase.patch 来 patch SpeedyCGi 2.22 原始码, 这个 patch 会将 tmpbase 由 /tmp/speedy 改成 /var/run/speedy

    注: Kevin L. Ellis 有写了一份关于 Open WebMail + SpeedyCGI 的说明和 Benchmark, 可参考看看




    启动HTTP 压缩功能加快传输
    自 Open WebMail 2.10 后, 新增支援 HTTP 资料压缩传送功能, 对于透过数据机连线或是使用 PDA 上网的使用者来说, 这个功能能够大幅地降低传输网页资料所需的时间. 要让这个功能正常动作, 必须先在您的 openwebmail server 上安装 Compress-Zlib-1.33.tar.gz 这模组

    由 source 安装
    cd /tmp
    tar -zxvf Compress-Zlib-1.33.tar.gz
    cd Compress-Zlib-1.33
    perl Makefile.PL
    make
    make install


    由 rpm 安装
    如果您的 RedHat 是 7.3 的话, 请

    wget http://turtle.ee.ncku.edu.tw/ope ... -1.21-RH73.i386.rpm
    rpm -Uvh --force perl-Compress-Zlib-1.21-RH73.i386.rpm


    如果您的 RedHat 是 8.0 的话, 请

    wget http://turtle.ee.ncku.edu.tw/ope ... -1.21-RH80.i386.rpm
    rpm -Uvh --force perl-Compress-Zlib-1.21-RH80.i386.rpm


    如果您的 RedHat 是 9.0 的话, 请

    wget http://turtle.ee.ncku.edu.tw/ope ... b-1.21-RH9.i386.rpm
    rpm -Uvh --force perl-Compress-Zlib-1.21-RH9.i386.rpm




    其他参考资料
    如果您想知道 Open WebMail 会用到系统中的哪些档案, 请参考 files.txt

    如果您碰到任何问题的话, 请先参考 changes.txt 看看是否最新版的 openwebmail-current 已经解决了您的问题. 如果没有的话, 请再看看 readme.txt 和 faq.txt 以及 Google 的 Search 和 News. 如果还是无法解决的话, 您可以将您的问题发表到 OpenWebMail 讨论区 或是 BBS.

    如果您有任何修正或是发现任何的臭虫, 请寄 Email 到 openwebmail.AT.turtle.ee.ncku.edu.tw. 但是请注意不要将安装上的问题寄到这个 Email 地址, 这类的信件将会被直接地忽略掉, 我们希望问题与解答能公开讨论, 让大家都能分享