發新話題
打印

openwebmail進階使用

openwebmail進階使用

轉貼網址:http://turtle.ee.ncku.edu.tw/~tung/openwebmail/advanced.html

讓 Open WebMail 成為 Server 預設的網頁
建立一個 index.html 檔案, 內容如下 a 或 b 皆可

a.
<html><head>
<meta http-equiv="Refresh"
c>
</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 是 [email protected], [email protected], [email protected]. 現在您因為需要, 再同一部主機上設立了一個虛擬主機 mail.virtualdomain.com, 然而這個 domain 上也有一個 user1. 為提示同一部 unix 機器只能有一個 user1 帳號. 這時候我們可以透過 virtusertable 將 [email protected] 對應到 [email protected], 但是使用者 [email protected] 卻完全不知道他用的是 [email protected]

讓 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


[email protected] 對應到 [email protected]
修改 /etc/mail/virtusertable, 加入下列內容

[email protected] [email protected]


讓 sendmail 重讀設定檔

kill -1 pid_of_sendmail


[email protected] 要登入 openwebmail 時, 應該
連線 http://mail.virtualdomain.com/cgi-bin/openwebmail/openwebmail.pl, 以 user1 登入
openwebmail 會根據 virtusertable 內容, 轉為使用 user4 這個 unix 帳號

[email protected] 要登入 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:AM (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 地址, 這類的信件將會被直接地忽略掉, 我們希望問題與解答能公開討論, 讓大家都能分享

TOP

發新話題