歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux文化 >> 構建一個高可擴展的web郵件系統

構建一個高可擴展的web郵件系統

日期:2017/2/27 12:18:29   编辑:Linux文化

1、簡介

近年來幾種新的web郵件產品(如IMP)的出現使web設計者能利用這些產品很容易的實現基於web的郵件系統。然而隨著使用這些產品的web郵件系統解決方案日趨流行,web郵件系統的可擴展性的矛盾就日益尖銳。大多數web郵件系統(不僅僅局限於開放資源的軟件)都是在單郵件服務器單web服務器上實現的,從而出現了單個服務器的性能瓶頸。如果系統需要擴展到可以同時支持數以千記的用戶時,往往就出現問題。所以需要一種有良好的可擴展性的web郵件解決方案。

1.1、背景材料
基於web的郵件系統的發展是速度非常迅猛的,隨著bigfoot,hotmail,rocketmail等wen郵件系統的出現,web系統應用日益受歡迎。從而其他很多ICP也紛紛在自己的站點上添加WEB郵件服務。由此,諸如EmuMail及IMP的產品開始出現來實現WEB郵件系統。然而,隨著基於這些產品的web郵件站點變的越來越受歡迎,逐漸增加了網絡及服務器的負載。由於沒有可定制的解決方案,如hotmail等直接使用現成的這些產品的web郵件系統逐漸出現了問題。所以,對尋找一種即相對容易實現又有良好的可擴展性,可以支持幾千到百萬級的用戶的的web郵件的解決方案變的越來越重要。

某ICP的web系統的的解決方案是:兩台服務器,一台運行 Sendmail和UW IMAP,另外一台運行IMP(IMP的相關材料可以通過訪問這裡得到),其可以說是最棒的一個使用PHP開發的開放源代碼web郵件系統。該系統非常容易實現,並且工作情況良好。然而,若干個月以後,隨著申請用戶的到達一定數量,可以明顯的發現該系統的負載過大。所以需要尋求一種新的解決方案,同時由於該ICP已經有一定數量的用戶,所以而且不能丟棄這些用戶的信件。先前該ICP選擇IMP是出於起優秀的性能及遵從開放源代碼的特點(這樣以來,就可以自己對IMP進行二次開發而不涉及版權問題)選擇Sendmail和UW IMAP是因為它們都是標准的工具。但是這兩個系統雖然功能完善強大但是過於龐大復雜,從而影響了其運行效率,所以尋找其他的替代工具。這裡推薦一個名為postfix的工具來替代sendmail,因為它至少要比sendmail快三倍,而且其同樣是免費軟件;用cyrus來替代UW IMAP,是因為cyrus不需要使用系統的帳戶而且不象UW IMAP那樣消耗資源。這裡仍然使用IMP是由於其易於配置,無須考慮版權問題而且可以保持用戶以前的界面不變。同時,postfix也支持LDAP(LDAP可以在這裡 這裡 這裡得到),可以使用LDAP作為其別名數據庫(使用maildrop屬性及mailacceptinggeneralid屬性)。同樣的,有一個Cyrus補丁可以使Cyrus使用LDAP服務器實現身份驗證。將前述各種工具和對多台前端web/incoming郵件服務器的DNS查詢實施輪轉響應結合起來,就有了構造一個有良好的可擴展性的web郵件系統的解決方案所需要的全部構件。下面的問題就是如何配置安裝了。

將這些元素組成一個基於web的郵件系統也不是一個困難的事情。可擴展性來自於postfix基於LDAP服務器的maildrop特性可以將郵件轉發到別的用戶或者服務器的功能。只需要為maildrop特性提供一個完整的郵件地址,該完整的郵件地址指出了該用戶的用戶郵件所在的真正的服務器。例如:DNS的MX記錄指向前端郵件服務器mail.dom.ain,並且LDAP指示發送到地址[email protected]的郵件實際上是發送往[email protected],然後運行在前端郵件服務器的postfix將把該郵件轉發給服務器machine44上的user用戶。使用這個特性,管理員就可以在本地域沒有限制地開郵件用戶。在性能需要時,只需要增加後端郵件服務器即可。 這裡面比較棘手的問題是如何從後端的郵件服務器中取得郵件,然後傳遞給IMP。由於IMP已經提供在不同的服務器上WEB服務器和郵件服務器的支持。所以需要解決的問題是如何從LDAP服務器上取郵件服務器名,而不是依賴於配置設置及單台郵件服務器。

實踐證明設置郵件服務器是非常容易實現的。只需要在一個文件中僅僅幾行代碼,並且IMP的缺省的配置文件中增添新的配置參數。這裡使用postfix及IMP分別實現在多個郵件服務器發送(forwarding)讀取郵件。

然而,UW IMAP仍然是一個需要解決的問題,由於多個原因,它的效率對於大型web文件系統來說過於低下:它使用一個沒有分層的文件,這種結構對於大量郵件消息可擴展性不夠好,它使用Linux主機自身的認證系統,而主機認證系統需要為用戶建立主機系統帳戶,而且每次認證都需要解析/etc/passwd文件,所以效率相對來說比較低下。故這裡使用Cyrus來替代UW IMAP,Cyrus來作為系統的IMAP服務器不具有上面所述的缺陷。而且,通過Clayton Donely開發的Cyrus的LDAP補丁http://www.linc-dev.com/,這裡可以使用與postfix相同的LDAP來實現認證。這樣就使新的WEB郵件系統不但有良好的可擴展性,而且很輕便。系統裡不需要保存多個口令拷貝,只需要在LDAP中保存一份就足夠了。這就是LDAP的設計目標。

這個系統具有若干個web/mail服務器,在客戶(浏覽器)對前端郵件服務器進行DNS查詢時,DNS被配置為該域名在若干台web/mail服務器間輪轉。這些web/mail服務器使用LDAP服務器選擇一個合適的後端郵件服務器來轉發和讀取郵件,而後端的郵件服務器服務器同樣借助LDAP服務器來進行用戶認證。由於LDAP服務器也是可備份的。所以整個系統裡任何一個節點的崩潰會導致系統的不可用。這正是可擴展性的實現目標。

1.2 要求
該文檔提到了三種服務器:web服務器,imap服務器和LDAP服務器。這些服務器可以位於獨立的主機上,或若干個獨立的機器上(例如:23個web服務器,5個LDAP服務器和10個IMAP服務器),或單台服務器上。同時需要具有在Linux環境下從源代碼安裝軟件的基本知識

1.3 使用的軟件
構建該系統需要以下的軟件包: Apache 1.3.6 或以上版本http://www.apache.org/ PHP 3.0.12 需要將對IMAP和LDAP的支持編譯進來 OpenLDAP 1.2 Cyrus 1.5.19 (注:不要使用1.6) postfix 19990627 pwcheck_ldap patch (針對cyrus 1.5的) IMP (2.0.4, 2.0.10, 和2.1.3-dev進行了測試) UW IMAP (針對 c-client) 注:cyrus 1.6樹使用了一種不同的,被稱作SASL的鑒別方法,pwcheck_ldap補丁不是針對這種鑒別方法設計的。然而,對SASL的LDAP的補丁正在設計中,你可以參觀該主頁來獲得最新信息。

1.4 特別注釋
該系統有一個部分的可伸縮性不是很好:IMP使用的用來保存會話數據,參數,及地址簿的SQL服務器。


2. 安裝軟件 2.1 Web服務器的安裝

在web服務器上,管理員需要安裝下列軟件包:Apache, PHP, postfix, OpenLDAP, UW IMAP, 及IMP. 安裝Apache和PHP是很容易的,具體步驟在PHP軟件包中的安裝導引有詳細的說明。在安裝PHP時,你需要將對LDAP和IMAP的支持編譯進來。 安裝postfix可以參考隨軟件包的安裝指南,特別要注意文件LDAP_README。

2.2 LDAP服務器的安裝
需要安裝OpenLDAP軟件來構建LDAP服務器。你需要決定一個root dn並相應地向LDAP的db中加入設置。

2.3 IMAP服務器的安裝
在IMAP服務器上,你將需要安裝LDAP, postfix, Cyrus及cyrus的pwcheck_ldap補丁。編譯postfix時需要有加入對ldap的支持。根據軟件安裝文檔安裝Cyrus,但是需要根據pwcheck_ldap補丁的文檔對pwcheck_ldap.c進行修改。另外需要修改pwcheck_ldap.c來提供ldap服務器及根dn信息;同樣若在linux服務器上運行IMAP服務器,則需要在在文件pwcheck_ldap.c作如下修正: 增加行: #include <linux/stddef.h> 另外還需要做一些別的語法修改,具體可以在編譯是發現。 使用下面的命令配置cyrus:
./configure --with-login=unix_pwcheck --with-pwcheck=ldap
後面的編譯及安裝則根據cyrus的文檔;


3. 如何配置服務器協同工作 3.1 LDAP服務器的配置

每個在LDAP數據庫中的郵件用戶信息除了其他的希望提供的信息以外需要有下面的內容:(假設你的根dn是o=someorg, c=US):
dn: uid=someuser, o=someorg, c=us
uid: someuser
userpassword: somepassword
maildrop: [email protected]
mailacceptinggeneralid: someuser
mailacceptinggeneralid: somealias

同樣,需要選擇一個用戶擁有cyrus管理權限。只有需要在imap服務器上配置cyrus時,才會需要考慮管理問題。另外,最好不要給一個已經存在的用戶添加管理權限,這樣做可能導致安全問題或者導致該用戶不能查看自己的信件的問題。

3.2 imap服務器的配置
配置在IMAP服務器上的postfix使用ldap來進行別名匹配。在文檔LDAP_README對這個問題進行了說明。對於Cyrus,按照軟件包的安裝說明文件進行即可。同樣,不要忘記激活pwcheck並在imap.conf中增添管理用戶。

3.3 web服務器
在這一步的設置中,web服務器同樣是作為接收郵件網關的前端。配置postfix來使用ldap進行別名匹配。從而實現檢查LDAP的maildrop表項並轉發該郵件到maildrop地址,所以在maildrop中需要全郵件名。 例如,你可以將700,000個用戶分配到各個服務器上,平均每台服務器10000個用戶。郵件目的地址是[email protected]的郵件將接入到某台WEB服務器,而該郵件將根據maildrop屬性被轉發到地址,而發網user657的郵件將被轉發給user657@mail34。而且,maildrop屬性同時可以被用作轉發地址,如給user302的信件被轉發給[email protected]">

例如,你可以將700,000個用戶分配到各個服務器上,平均每台服務器10000個用戶。郵件目的地址是[email protected]的郵件將接入到某台WEB服務器,而該郵件將根據maildrop屬性被轉發到地址,而發網user657的郵件將被轉發給user657@mail34。而且,maildrop屬性同時可以被用作轉發地址,如給user302的信件被轉發給[email protected]

對IMP的培配置一般將根據軟件文檔,配置結束以後,需要做如下修改: 在config/defaults.php3增添如下內容:
 
/* LDAP/IMAP Server Default */ $default->LDAP_server = 'ldap.dom.ain'; $default->LDAP_dn = 'o=someorg,c=US'; $default->LDAP_search_field = 'uid'; $default->ldap_choose_server = true;
to mailbox.php3 apply the following patch:
Index: mailbox.php3 =================================================================== RCS file: /home/cvs/imp/mailbox.php3,v retrieving revision 2.29 diff -c -r2.29 mailbox.php3 *** mailbox.php3 1999/07/29 07:20:00 2.29 --- mailbox.php3 1999/08/04 18:04:10 *************** *** 29,34 **** --- 29,51 ---- require './lib/mimetypes.lib'; require './config/defaults.php3'; + /************LDAP**************/ + + if ($default->ldap_choose_server) { + $ldapconnect = ldap_connect($default->LDAP_server); + if ($ldapconnect) { + print("YES! "); + $ldapbind = ldap_bind($ldapconnect); + $ldapsearch = ldap_search($ldapconnect, $default->LDAP_dn, $default->LDAP_search_field."=".$imapuser, array("maildrop")); + $ldapget = ldap_get_entries($ldapconnect, $ldapsearch); + $ldapspl = explode("@", $ldapget[0]["maildrop"][0]); + $server = $ldapspl[1]; + $port = $default->port; + } + } + /**********end ldap************/ + + /* Html styles configuration */ require './config/html.php3'; /* Mailbox configuration */ 全部配置結束以後,將具有一個高可擴展性的web郵件系統。

注:1999年8月,IMP的新版本已經包含了這些補丁的內容,所以如果使用新版本的話,就不需添加這些內容。

4. Miscellaneous 4.1 Adding Users

這裡是一小段向LDAP服務器中增添用戶的代碼,並且同時向cyrus增添一個郵件用戶。這是針對IMAP服務器設計的,但是你可以修改其適應別的環境。
<?php
$ldapconn = ldap_connect("ldap.dom.ain");
$machine = "mail01";
if ($ldapconn)
{
$ldhb = ldap_bind($ldapconn, "cn=cyrusadmin, o=someorg,c=US","password");
$dn = "uid=". $username .", o=someorg, c=US";
$info["uid"]=$username;
$info["userpassword"] = $password;
$info["objectclass"] = "account";
$info["maildrop"] = $username ."@" .$machine .".dom.ain";
$info["mailacceptinggeneralid"] = $username;
$ldhb = ldap_add($ldapconn, $dn, $info);
ldap_close($ldapconn);
}
$imapconn = imap_open("{" .$machine .".dom.ain:143}", "cyrusadmin","password");
if ($imapopen)
{
imap_createmailbox($imapconn, "{" .$machine ."dom.ain:143}user.".$username );
imap_close($imapconn);
}
?>
注:由於一個bug的問題,這裡使用明文password。

摘自:http://www.linuxaid.com.cn


Copyright © Linux教程網 All Rights Reserved