精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● FreeBSD>>系统管理>>系统设置与技巧>>Sendmail>>sendmail如何支持海量用户

主题:sendmail如何支持海量用户
发信人: con()
整理人: hahalee(1999-03-17 20:33:16), 站内信件
【 在 liangvy (桃花岛主) 的大作中提到: 】
: 是否可以配置sendmail.cf使得在/etc/passwd里面没定义的user可以收信.
: 也就是说另外的一些人仅仅是mail用户而不能在/etc/passwd里面有的.
: 是否能通过定义别的mailer实现?

但愿这几篇文章会对你有点用.

发信人: cpu (奔腾的心), 信区: Solaris 
标 题: unix环境下mail系统的简单扩容(一) 
发信站: 华南网木棉站 (Wed Mar  3 19:58:37 1999), 转信 
 
用户多了自然要想方法改造以前的sendmail和pop3,因为毕竟passwd文件容不 
下太多的mail用户,且passwd文件大了sendmail和pop3服务器查起用户来效率 
很低,以前上海热线就出现过这种情况:用户增长到某个数目时发现sendmail 
动不了了,此时的确有必要改造一下原有的sendmail系统。 
 
首先要取得原码。 
 
sendmail可以去www.sendmail.org拿,目前的最新版本是8.9.3,还是没有支持 
多线程,感觉特落后,因为目前linux已经支持posix的thread库函数了,至于 
solaris早就有两套thread的API,一套遵从posix标准,一套是自己的。希望早 
些看到sendmail的多线程版。 
 
pop3d可以去ftp://ftp.ucdavis.edu/unix-public/pop3d.tar拿到。


发信人: cpu (奔腾的心), 信区: Solaris 
标 题: unix环境下mail系统的简单扩容(二) 
发信站: 华南网木棉站 (Wed Mar  3 19:59:59 1999), 转信 
 
既然拿到了source就免不了要看一下哪些地方需要修改。 
 
先大概讲一下怎么修改sendmail。sendmail通过/etc/passwd文件来查找用户 
名,所以相关的函数很容易猜出来:getpwnam就是了。 
 
sendmail的原码在src子目录下面,简单地用grep getpwnam *.c|more看一下 
调用了getpwnam的模块,把各段原码大致分析一下发现有一个另外定义的取 
用户函数sw_getpwnam,函数实现在conf.c里面: 
 
 
struct passwd * 
sm_getpwnam(user) 
        char *user; 

#ifdef _AIX4 
        extern struct passwd *_getpwnam_shadow(const char *, const int); 
 
        return _getpwnam_shadow(user, 0); 
#else                                                
        return getpwnam(user); 
#endif 

 
就是这段东东了,sm_getpwnam是标准函数getpwnam的一个wrapper函数,也就是 
sendmail的取用户信息函数,当有smtp客户连进来发rcpt to: xxuser的时候 
sendmail就是会去调用sm_getpwnam("xxxuser")来验证有没这个用户. 
 
好了明白了,你现在就可以把conf.c里的sm_getpwnam改成自己所需要的样子: 
比如查数据库,或者查内存中的用户表,或者向另外一个独立的用户信息服务引 
擎发请求取得用户信息。。。 
 
光改了src目录下的sm_getpwnam还不行,src只是sendmail的原码部分,父目录 
下还有一个子目录叫mail.local,干什么用的一看名字就明白了,就是本地的 
邮递员,sendmail收信后把信件交给邮递员来投递,邮递员程序也涉及到取用 
户信息的操作,到mail.local下面grep getpwnam *就知道了。主要改mail.local.c 
里面的diliver函数。 
 
最后提一下改pop3,非常简单,有一个util.c,里面有个verify_user函数,该 
函数调用了getpwnam和getspnam函数来取得用户信息和对用户进行认证,改了它 
就完事了。                                                          


发信人: cpu (奔腾的心), 信区: Solaris 
标 题: unix环境下mail系统的简单扩容(三) 
发信站: 华南网木棉站 (Wed Mar  3 20:00:24 1999), 转信 
 
改了原码把更新版本的sendmail和pop3整和起来就可以用了,用不着再把所有的 
mail用户都塞进/etc/passwd, shadow文件里去了。现在可以考虑一些细节方面 
的东西了。 
 
怎样才能提高取用户信息的效率?查数据库?可以,163.net就是这么干的,以 
前连不进去的时候还出现过数据库连接超时的提示信息。但是用户多了就只能 
往数据库里塞。。。可以折中一下:可以由一个专门的用户信息引擎把数据库 
内的用户表取到内存表进行管理,该引擎可以与sendmail,pop3d位于同台机器 
也可以不同台机器,与sendmail和pop3d的通信可以采用bsd socket, unix socket, 
messge queue等等。。。注意加减用户和改密码的时候要采取某种措施使内存 
表和数据库同步更新。 
 
mail server性能跟不上?这也是个常见的问题,就用server cluster了,用 
几台smtp server和pop3 server,邮箱用共享的存贮阵列就行了。至于怎么 
cluster,参考以前的文章,用dns轮询也可(163),或者牛X一些,自己做 
个前置机做负载均衡器,这样对外smtp server和pop3 server都可以只采用 
一个IP。                                                           

--
※ 来源:.网易 BBS bbs.netease.com.[FROM: 203.208.2.112]

[关闭][返回]