最近因客户环境需要,一直在研究有关VMware server 虚拟机下的多分区增加的问题,今天有了一些好消息故
做个备忘,主要以流程和实例为主,希望文章能起到抛砖引玉的效果,呵呵
前言介绍
LVM=(Logical Volume Mamager)逻辑卷管理器,LVM最先是用在IBM AIX系统上,它的最大作用是可以动态分
配磁盘分区,并且可以让多个分区或者物理硬盘作为一个逻辑卷(相当于一个逻辑硬盘).这种机制可以让磁
盘分区容量划分变得很灵活.
我们先举个简单例子.比如我们有一个硬盘/dev/hda,分了3个主分区:hda1,hda2,hda3,后面磁盘空间没有
划分,分别对应的挂载点是/boot,/,/home,如果我们的/home空间不够了,怎么办?传统的方法是在未划分的
空间中分割一个分区,挂载到/home下,并且把hda3的内容复制到这个新分区上.或者把这个新分区挂载到另
外的挂载点上,然后在/home下创建链接,链接到这个新挂载点.
这两种方法都不大好,第一种方法浪费了hda3,并且如果后面的分区容量小于hda3怎么办?第二种方法不大
浪费容量,但是每次要额外创建链接,比较麻烦.那么,如果用lvm呢?lvm的好处在于,可以动态放大一个逻辑
卷(相当于一个逻辑分区),也就是说,hda3如果是一个逻辑分区,比如/dev/rootvg/lv3,那么lv3可以被动态
放大.这样就解决了动态容量调整的问题.当然,前提是系统已设定好lvm支持,并且需要动态缩放的挂载点
对应的设备是逻辑卷.
在这里,我的环境都是基于虚拟机上的 RHEL 5/CentOS 5.2和LVM2的。
lvm是否已经在系统中安装,通过如下命令查询,以下便是系统中已经安装有lvm,而且其版本为lvm2(目前是比较新的版本啦)
[root@localhost soft]# rpm -qa |grep lvm
system-config-lvm-1.1.3-2.0.el5
lvm2-2.02.32-4.el5
默认分区 就会默认产生lvm
通常不建议这么做
#######################################
[root@testmailserver ~]# fdisk -l
Disk /dev/hda: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hda doesn't contain a valid partition table
Disk /dev/hdb: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hdb doesn't contain a valid partition table
Disk /dev/hdd: 3221 MB, 3221225472 bytes
16 heads, 63 sectors/track, 6241 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk /dev/hdd doesn't contain a valid partition table
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 652 5132767+ 8e Linux LVM
#########################################
[root@testmailserver ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "VolGroup00" using metadata type lvm2
########################################
[root@testmailserver ~]# lvscan
ACTIVE '/dev/VolGroup00/LogVol00' [4.31 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [576.00 MB] inherit
###############################
fdisk /dev/hda (fdisk /dev/hdb , fdisk /dev/hdd)
n p t 8e(lvm分区的格式) w
1.创建物理卷
[root@localhost ~]# pvcreate /dev/hda1 /dev/hdb1 /dev/hdd1
Physical volume "/dev/hda1" successfully created
Physical volume "/dev/hdb1" successfully created
Physical volume "/dev/hdd1" successfully created
2.创建卷组并将其物理卷加入到卷组中
[root@localhost ~]# vgcreate fengvg /dev/hda1 /dev/hdb1 /dev/hdd1
Volume group "fengvg" successfully created
3.查看卷组的大小
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name fengvg1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 2.99 GB
PE Size 4.00 MB
Total PE 766
Alloc PE / Size 743 / 2.90 GB
Free PE / Size 23 / 92.00 MB
VG UUID Syo8t6-9QKW-Uijz-3iUb-eNyu-tKgV-UIUWWm
4.创建逻辑卷并将大小分配给卷组(注:其大小要小于查看到的大小,否则提示不成功)
[root@localhost ~]# lvcreate -L 8.90G -n lv1 fengvg
Rounding up size to full physical extent 8.90 GB
Logical volume "lv1" created
5.以ext3的形式 格式化逻辑卷
[root@localhost ~]# mkfs.ext3 /dev/fengvg/lv1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1168128 inodes, 2333696 blocks
116684 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2390753280
72 block groups
32768 blocks per group, 32768 fragments per group
16224 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
6.创建挂载点惊醒挂载逻辑卷分区
cd /mnt
mkdir gualvm
mount /dev/fengvg/lv1 /gualvm
7.查看挂载的分区大小供以后使用
df -h 即可看到新增加的空间大小
以上步骤简单,供以后查询方便.先简单到这里,以后有时间再总结呗,^_^
2008年11月25日星期二
2008年11月21日星期五
LVM命令列表
所有命令列表:
1.extendfs 扩展一个离线文件系统
2.lvchange 改变一个逻辑卷的的属性
3.lvcreate 在卷组中创建一个逻辑卷
4.lvdisplay 显示逻辑卷的信息
5.lvextend 增加分配给逻辑卷的物理区域数
6.lvlnboot 将逻辑卷设为启动,交换或内存映像卷
7.lvmerge 将以前镜像的卷合并成一个逻辑镜像卷
8.lvreduce 减少分配给逻辑卷的物理区域数
9.lvremove 从卷组中删除一个或多个逻辑卷
10.lvrmboot 删除联接到启动,交换或内存映像卷的逻辑卷
11.lvsplit 将镜像的逻辑卷分成两个逻辑卷
12.lvsync 同步在一个或多少失效逻辑卷上的逻辑卷镜像
13.pvchange 改变卷组中的物理卷的属性
14.pvcreate 创建一个可以被卷组使用的物理卷
15.pvdisplay 显示卷组中一个或多个物理卷的信息
16.pvmove 将分配的物理区域从一个物理卷转移鲐其他物理卷
17.vgcfgbackup 保存卷组LVM配置
18.vgcfgrestore 将LVM配置恢复 到卷组
19.vgchange 开关卷组的一些状态
20.vgcreate 创建一个卷组
21.vgdisplay 显示卷组信息
22.vgextend 通过添加物理卷扩展一个卷组
23.vgexport 从系统输出一个卷组
24.vgimport 向系统输入一个卷组
25.vgscan 扫描卷组的系统物理卷
26.vgreduce 通过删除一个或多个物理卷减小卷组
27.vgremove 从系统上删除一个或多个卷组的定义
28.vgsync 同步在一个或多个失效卷组上的逻辑镜像
1.extendfs 扩展一个离线文件系统
2.lvchange 改变一个逻辑卷的的属性
3.lvcreate 在卷组中创建一个逻辑卷
4.lvdisplay 显示逻辑卷的信息
5.lvextend 增加分配给逻辑卷的物理区域数
6.lvlnboot 将逻辑卷设为启动,交换或内存映像卷
7.lvmerge 将以前镜像的卷合并成一个逻辑镜像卷
8.lvreduce 减少分配给逻辑卷的物理区域数
9.lvremove 从卷组中删除一个或多个逻辑卷
10.lvrmboot 删除联接到启动,交换或内存映像卷的逻辑卷
11.lvsplit 将镜像的逻辑卷分成两个逻辑卷
12.lvsync 同步在一个或多少失效逻辑卷上的逻辑卷镜像
13.pvchange 改变卷组中的物理卷的属性
14.pvcreate 创建一个可以被卷组使用的物理卷
15.pvdisplay 显示卷组中一个或多个物理卷的信息
16.pvmove 将分配的物理区域从一个物理卷转移鲐其他物理卷
17.vgcfgbackup 保存卷组LVM配置
18.vgcfgrestore 将LVM配置恢复 到卷组
19.vgchange 开关卷组的一些状态
20.vgcreate 创建一个卷组
21.vgdisplay 显示卷组信息
22.vgextend 通过添加物理卷扩展一个卷组
23.vgexport 从系统输出一个卷组
24.vgimport 向系统输入一个卷组
25.vgscan 扫描卷组的系统物理卷
26.vgreduce 通过删除一个或多个物理卷减小卷组
27.vgremove 从系统上删除一个或多个卷组的定义
28.vgsync 同步在一个或多个失效卷组上的逻辑镜像
LVM磁盘管理
如何挂载一块从别的机器上取下的做了LVM的硬盘:
1.fdisk -l //查看新增的硬盘是否已经被识别
2.vgscan //扫描LVM卷
3.vgchange -ay
4.lvscan //如果正常则会显示出硬盘的LV状态都是 active
5.mount -t ext3 /dev/VGname/LVname /mnt/lvmdisk/
-------------------------------------------------------------------------------------------
如何将一块新硬盘添加到现有的LVM中,以达到扩容目的:
1.fdisk -l //查看新增的硬盘是否已经被识别
2.fdisk /dev/sdb //创建一个新的分区sdb1,并使用t参数标记为8e(即Linux LVM)
>n
>t
>8e
3.pvcreate //建立物理卷
4.vgextend VolGroup00 /dev/sdb1 //将新增的屋里卷加入到卷组中去
5.lvextend -L +800G /dev/VolGroup00/LogVol00 //将新增的80G硬盘的所有空间都加到逻辑卷中去
6.RHEL4: ext2online /dev/VolGroup00/LogVol00
RHEL5: resize2fs -p /dev/VolGroup00/LogVol00
//激活新增的空间
7.df -h //此时便可以看到新增的空间了
-------------------------------------------------------------------------------------------
如何删除一个现有的LVM:
1.umount 所有vg0下的lv
2.lvremove /dev/vg0/lv0
3.vgchange -an /dev/vg0 (休眠vg0,-ay是激活)
4.vgremove vg0 //移除vg0
-------------------------------------------------------------------------------------------
如何删除一个现有LVM中的物理卷,以取出新增的硬盘:
1.转移数据 pvmove /dev/sdb1 [sdc1] //如果想指定转移的物理卷则在后面输入,默认是其它地方
2.pvreduce vg0 /dev/sdb1 把sdb1从卷组中删除
-------------------------------------------------------------------------------------------
一些常用的LVM管理命令:
扩展VG: vgextend vg0(卷组名) /dev/sdb1(PV名)
扩展LV: lvextend -L +10G(空间大小) /dev/vg0/lv0(LV名)
查看信息: vgdisplay /dev/vg0 , lvdisplay /dev/vg0/lv0
数据迁移: pvmove /dev/sdb1 /dev/sdc1
-------------------------------------------------------------------------------------------
1.fdisk -l //查看新增的硬盘是否已经被识别
2.vgscan //扫描LVM卷
3.vgchange -ay
4.lvscan //如果正常则会显示出硬盘的LV状态都是 active
5.mount -t ext3 /dev/VGname/LVname /mnt/lvmdisk/
-------------------------------------------------------------------------------------------
如何将一块新硬盘添加到现有的LVM中,以达到扩容目的:
1.fdisk -l //查看新增的硬盘是否已经被识别
2.fdisk /dev/sdb //创建一个新的分区sdb1,并使用t参数标记为8e(即Linux LVM)
>n
>t
>8e
3.pvcreate //建立物理卷
4.vgextend VolGroup00 /dev/sdb1 //将新增的屋里卷加入到卷组中去
5.lvextend -L +800G /dev/VolGroup00/LogVol00 //将新增的80G硬盘的所有空间都加到逻辑卷中去
6.RHEL4: ext2online /dev/VolGroup00/LogVol00
RHEL5: resize2fs -p /dev/VolGroup00/LogVol00
//激活新增的空间
7.df -h //此时便可以看到新增的空间了
-------------------------------------------------------------------------------------------
如何删除一个现有的LVM:
1.umount 所有vg0下的lv
2.lvremove /dev/vg0/lv0
3.vgchange -an /dev/vg0 (休眠vg0,-ay是激活)
4.vgremove vg0 //移除vg0
-------------------------------------------------------------------------------------------
如何删除一个现有LVM中的物理卷,以取出新增的硬盘:
1.转移数据 pvmove /dev/sdb1 [sdc1] //如果想指定转移的物理卷则在后面输入,默认是其它地方
2.pvreduce vg0 /dev/sdb1 把sdb1从卷组中删除
-------------------------------------------------------------------------------------------
一些常用的LVM管理命令:
扩展VG: vgextend vg0(卷组名) /dev/sdb1(PV名)
扩展LV: lvextend -L +10G(空间大小) /dev/vg0/lv0(LV名)
查看信息: vgdisplay /dev/vg0 , lvdisplay /dev/vg0/lv0
数据迁移: pvmove /dev/sdb1 /dev/sdc1
-------------------------------------------------------------------------------------------
2008年11月14日星期五
apache和IIS的优劣比较
apache和IIS的优劣比较
摘要:目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。
对于中小企业来说建立自己的网站,对外展示自己的页面是最平常不过的事情了。目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。
一、免费与收费之争:
虽然很多用户都使用IIS建立网站,他是集成于Windows操作系统中的组件。不过要想合法使用IIS就要购买正版Windows操作系统。
反观Apache,他是完全免费的。不需要支付任何费用就可以免费下载并使用了。
结论——Apache免费,IIS收费,前者占优。
二、稳定性:
接下来要比较的就是稳定性了,WWW服务要随时运转正常,一个网站也需要一天24小时,一周七天为公众开放。所以稳定性是IIS和APACHE比较的重点。
IIS在实际使用中经常出现500错误,而且有的时候还会出现莫名其妙的假死现象。用户需要不定期的重新启动IIS服务才能保证网站的正常。
Apache在配置上比IIS要复杂,不过一经设置完毕就可以长期的工作了。大型网站都使用APACHE作为自己的WWW服务提供工具。APACHE的所有配置都保存在配置文件中,使用时完全按照配置文件中记录的信息执行。一般不会发生莫名其妙的假死情况。
小提示:在windows2003系统下使用IIS比用APACHE性能要好。
结论——APACHE稳定,IIS有时假死,前者占优。
三、扩展性:
扩展性是指WWW服务提供工具是否可以应用于多种场合,多种网络情况,多种操作系统。
IIS只能在微软公司的windows操作系统下使用,离开了windows他将一事无成。无法移植到其他类型的操作系统中。
APACHE是个多面手,他不仅仅应用于windows,对于unix,linux以及freebsd等多种操作系统来说他都可以胜任工作。而且不同操作系统的配置步骤基本类似,可移植性非常高。
结论——IIS只能在windows下运行,apache应用范围广。apache获胜。
四、安全性:
经常看到某某网站被黑客攻击或者某某网站被非法用户上传病毒的消息,对于为其他人提供服务的站点来说,安全性是最重要的。如果一个网站连自身安全都没有保证的话,谁愿意浏览和使用呢。
早期的IIS在安全性方面存在着很大的问题,如果使用默认设置的话黑客可以轻松趁虚而入。不过在IIS6中微软公司对安全方面进行了大幅改进。只要保证操作系统补丁更新及时,就可以将网站安全系数尽可能的提高。特别是IIS6与.net平台相互倚靠,使安全性几乎完美。
APACHE在安全方面一直做的不错,因为很多用户都是在linux下使用apache,所以操作系统的特点使得linux下的apache具有先天的保护伞,安全性自然没得说。
结论——IIS6以前的版本有安全隐患,IIS6和APACHE一样安全可靠。IIS6与APACHE打个平手。
五、开放性:
所谓开放性就是指是否开放了程序的源代码,众所周知IIS是WINDOWS系统的一部分,所以他的源代码是没有开放的。而apache则不同,最早他是为了类unix系统服务的,所以完全对外开放源代码。任何人都可以分析他的代码,发现其中的漏洞,并发布补丁来弥补该漏洞。
正因为APACHE的这种开放性,也使其安全性大大提高。
结论——IIS不开放代码,APACHE开放源代码。后者获得胜利。
六、难易性:
一个工具使用的难易程度直接影响其用户的多少,特别是网页发布工具。毕竟很多公司希望有自己的网站,但又不希望聘请高薪的网络管理员来维护。因此必然找上手相对容易的工具来搭建自己的站点。
IIS开起来比较简单,很容易就可能让IIS工作,对外发布网站。不过管理员很容易出现错误配置和误操作问题。不过总体说来IIS还是非常容易学的,但要学好他恐怕是件非常困难的事。
APACHE的使用比IIS要难,需要有一定计算机及网络基础的人才可以使用。他的配置也不是图形化的,需要我们通过编辑配置文件来实现。但是单从APACHE的设置上讲,只要我们严格按照帮助文件进行参数设置的话还是没有什么难度的。
结论——IIS容易安装但难精通,APACHE安装相对困难,要想精通也不是一件容易的事。IIS略占优势。
七、编程性:
为了让网页更加丰富多采,更加美观,互动性更好,高手为我们开发了多种组件与控件,那么这些控件在IIS或APACHE下是否正常运行呢?
APACHE下的Mod Rewrite功能非常强大,而IIS中的ISAPI的Rewrite需要专门开发,一般初学者是不能够实现的。APACHE可以使用 Subversion WebDev以及.htaccess功能,还可以使用ForceType。另外IIS对FastCGI的支持也不是很好,所以一些CGI、PHP程序运行起来速度很慢,远不如apache。
结论——不同的环境下使用不同的组件,因为选择IIS还是APACHE由工作环境所决定,这点两者不分高下。
八、支持语言方面:
由于目前建立网站和论坛的语言多种多样,例如ASP,PHP,JSP等语言。那么IIS和APACHE对他们都支持吗?
IIS对ASP特别是.net运行很稳定,不过对于PHP和JSP就比较麻烦了。PHP需要经过反复配置才能在windows2003上支持。APACHE则能够很好的支持上面提到的几种语言,运行ASP,PHP,JSP都没有任何问题。
结论——APACHE支持语言比较多,IIS支持PHP和JSP时有点麻烦,需要经过一定的配置。APACHE获胜。
九、待遇方面:
提到待遇方面可能很多读者会比较纳闷,怎么IIS和APACHE还存在待遇问题呢?其实我们这里要讨论的是网络管理员的待遇。一个会IIS的网络管理员与一个会APACHE的网络管理员,他们的薪水是不一样的。
APACHE最大的好处就是配置参数多,如果要精通APACHE需要很高的水平。所以同等水平的网络管理员会APACHE的要比会IIS的待遇更好。[linuxman说:嘿嘿,就凭这一条,赶紧学好apache吧:-)]
结论——钱多是获胜的唯一标准,APACHE占优。
总结:
其实今天我们在这里争论IIS好还是APACHE好是没有很大意义的,本文所进行的比较也只是给那些徘徊在网络管理员路口,不知道学习哪个工具来建立网站的读者一点参考。只有你对IIS和APACHE有了一个大概的了解之后,才能为自己的未来进行规划。
总的来说Apache的优点在于在各种开源的WWW服务提供工具中特性最全,支持最广,相对比较稳定的,而且扩展性丰富。不过正因为要考虑扩展性,性能就肯定不会太高,只能保持一个中等的水平。而IIS6在处理连接及事件性能方面还是很强大的,超过了APACHE。另外安全方面IIS6也有了质的飞跃,弥补了以往IIS漏洞漫天的缺陷。如果你的公司网络环境不负责,没有涉及太多的开发的话建议仍然使用IIS6。当然如果是建立在WWW上的开发和调试还是使用APACHE更加顺手。
摘要:目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。
对于中小企业来说建立自己的网站,对外展示自己的页面是最平常不过的事情了。目前最流行的建立WWW服务工具就要属Apache与IIS了。那么他们之间都有什么区别呢?到底哪个工具才是最适合我们的呢?今天就来讨论下这个问题。
一、免费与收费之争:
虽然很多用户都使用IIS建立网站,他是集成于Windows操作系统中的组件。不过要想合法使用IIS就要购买正版Windows操作系统。
反观Apache,他是完全免费的。不需要支付任何费用就可以免费下载并使用了。
结论——Apache免费,IIS收费,前者占优。
二、稳定性:
接下来要比较的就是稳定性了,WWW服务要随时运转正常,一个网站也需要一天24小时,一周七天为公众开放。所以稳定性是IIS和APACHE比较的重点。
IIS在实际使用中经常出现500错误,而且有的时候还会出现莫名其妙的假死现象。用户需要不定期的重新启动IIS服务才能保证网站的正常。
Apache在配置上比IIS要复杂,不过一经设置完毕就可以长期的工作了。大型网站都使用APACHE作为自己的WWW服务提供工具。APACHE的所有配置都保存在配置文件中,使用时完全按照配置文件中记录的信息执行。一般不会发生莫名其妙的假死情况。
小提示:在windows2003系统下使用IIS比用APACHE性能要好。
结论——APACHE稳定,IIS有时假死,前者占优。
三、扩展性:
扩展性是指WWW服务提供工具是否可以应用于多种场合,多种网络情况,多种操作系统。
IIS只能在微软公司的windows操作系统下使用,离开了windows他将一事无成。无法移植到其他类型的操作系统中。
APACHE是个多面手,他不仅仅应用于windows,对于unix,linux以及freebsd等多种操作系统来说他都可以胜任工作。而且不同操作系统的配置步骤基本类似,可移植性非常高。
结论——IIS只能在windows下运行,apache应用范围广。apache获胜。
四、安全性:
经常看到某某网站被黑客攻击或者某某网站被非法用户上传病毒的消息,对于为其他人提供服务的站点来说,安全性是最重要的。如果一个网站连自身安全都没有保证的话,谁愿意浏览和使用呢。
早期的IIS在安全性方面存在着很大的问题,如果使用默认设置的话黑客可以轻松趁虚而入。不过在IIS6中微软公司对安全方面进行了大幅改进。只要保证操作系统补丁更新及时,就可以将网站安全系数尽可能的提高。特别是IIS6与.net平台相互倚靠,使安全性几乎完美。
APACHE在安全方面一直做的不错,因为很多用户都是在linux下使用apache,所以操作系统的特点使得linux下的apache具有先天的保护伞,安全性自然没得说。
结论——IIS6以前的版本有安全隐患,IIS6和APACHE一样安全可靠。IIS6与APACHE打个平手。
五、开放性:
所谓开放性就是指是否开放了程序的源代码,众所周知IIS是WINDOWS系统的一部分,所以他的源代码是没有开放的。而apache则不同,最早他是为了类unix系统服务的,所以完全对外开放源代码。任何人都可以分析他的代码,发现其中的漏洞,并发布补丁来弥补该漏洞。
正因为APACHE的这种开放性,也使其安全性大大提高。
结论——IIS不开放代码,APACHE开放源代码。后者获得胜利。
六、难易性:
一个工具使用的难易程度直接影响其用户的多少,特别是网页发布工具。毕竟很多公司希望有自己的网站,但又不希望聘请高薪的网络管理员来维护。因此必然找上手相对容易的工具来搭建自己的站点。
IIS开起来比较简单,很容易就可能让IIS工作,对外发布网站。不过管理员很容易出现错误配置和误操作问题。不过总体说来IIS还是非常容易学的,但要学好他恐怕是件非常困难的事。
APACHE的使用比IIS要难,需要有一定计算机及网络基础的人才可以使用。他的配置也不是图形化的,需要我们通过编辑配置文件来实现。但是单从APACHE的设置上讲,只要我们严格按照帮助文件进行参数设置的话还是没有什么难度的。
结论——IIS容易安装但难精通,APACHE安装相对困难,要想精通也不是一件容易的事。IIS略占优势。
七、编程性:
为了让网页更加丰富多采,更加美观,互动性更好,高手为我们开发了多种组件与控件,那么这些控件在IIS或APACHE下是否正常运行呢?
APACHE下的Mod Rewrite功能非常强大,而IIS中的ISAPI的Rewrite需要专门开发,一般初学者是不能够实现的。APACHE可以使用 Subversion WebDev以及.htaccess功能,还可以使用ForceType。另外IIS对FastCGI的支持也不是很好,所以一些CGI、PHP程序运行起来速度很慢,远不如apache。
结论——不同的环境下使用不同的组件,因为选择IIS还是APACHE由工作环境所决定,这点两者不分高下。
八、支持语言方面:
由于目前建立网站和论坛的语言多种多样,例如ASP,PHP,JSP等语言。那么IIS和APACHE对他们都支持吗?
IIS对ASP特别是.net运行很稳定,不过对于PHP和JSP就比较麻烦了。PHP需要经过反复配置才能在windows2003上支持。APACHE则能够很好的支持上面提到的几种语言,运行ASP,PHP,JSP都没有任何问题。
结论——APACHE支持语言比较多,IIS支持PHP和JSP时有点麻烦,需要经过一定的配置。APACHE获胜。
九、待遇方面:
提到待遇方面可能很多读者会比较纳闷,怎么IIS和APACHE还存在待遇问题呢?其实我们这里要讨论的是网络管理员的待遇。一个会IIS的网络管理员与一个会APACHE的网络管理员,他们的薪水是不一样的。
APACHE最大的好处就是配置参数多,如果要精通APACHE需要很高的水平。所以同等水平的网络管理员会APACHE的要比会IIS的待遇更好。[linuxman说:嘿嘿,就凭这一条,赶紧学好apache吧:-)]
结论——钱多是获胜的唯一标准,APACHE占优。
总结:
其实今天我们在这里争论IIS好还是APACHE好是没有很大意义的,本文所进行的比较也只是给那些徘徊在网络管理员路口,不知道学习哪个工具来建立网站的读者一点参考。只有你对IIS和APACHE有了一个大概的了解之后,才能为自己的未来进行规划。
总的来说Apache的优点在于在各种开源的WWW服务提供工具中特性最全,支持最广,相对比较稳定的,而且扩展性丰富。不过正因为要考虑扩展性,性能就肯定不会太高,只能保持一个中等的水平。而IIS6在处理连接及事件性能方面还是很强大的,超过了APACHE。另外安全方面IIS6也有了质的飞跃,弥补了以往IIS漏洞漫天的缺陷。如果你的公司网络环境不负责,没有涉及太多的开发的话建议仍然使用IIS6。当然如果是建立在WWW上的开发和调试还是使用APACHE更加顺手。
2008年11月5日星期三
Postfix邮件系统的安装与配置
一、 postfix概述 postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。下面一段话摘自postfix的官方站点(http://www.postfix.org): “postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试。在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真实一个让人吃惊的数字。Postfix试图更快、更容易管理、更安全,同时还与 sendmail保持足够的兼容性。” 1.1 postfix的特点 1. postfix是免费的: postfix想要作用的范围是广大的Internet用户,试图影响大多数的Internet上的电子邮件系统,因此它是免费的。 2. 更快: postfix在性能上大约比sendmail快三倍。一部运行postfix的台式PC每天可以收发上百万封邮件。 3. 兼容性好: postfix是sendmail兼容的,从而使sendmail用户可以很方便地迁移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。 4. 更健壮: postfix被设计成在重负荷之下仍然可以正常工作。当系统运行超出了可用的内存或磁盘空间时,postfix会自动减少运行进程的数目。当处理的邮件数目增长时,postfix运行的进程不会跟着增加。 5. 更灵活: postfix是由超过一打的小程序组成的,每个程序完成特定的功能。你可以 通过配置文件设置每个程序的运行参数。 6. 安全性 postfix具有多层防御结构,可以有效地抵御恶意入侵者。如大多数的postfix程序可以运行在较低的权限之下,不可以通过网络访问安全性相关的本地投递程序等等。 1.2 postfix的总体结构 postfix由十几个具有不同功能的半驻留进程组成,并且在这些进程中并无特定的进程间父子关系。某一个特定的进程可以为其他进程提供特定的服务。 大多数的postfix进程由一个进程统一进行管理,该进程负责在需要的时候调用其他进程,这个管理进程就是master进程。该进程也是一个后台程序。 这些postfix进程是可以配置的,我们可以配置每个进程运行的数目,可重用的次数,生存的时间等等。通过灵活的配置特性可以使整个系统的运行成本大大降低。 1.2.1 postfix的邮件队列(mail queues) postfix有四种不同的邮件队列,并且由队列管理进程统一进行管理: 1. maildrop:本地邮件放置在maildrop中,同时也被拷贝到incoming中。 2. incoming:放置正在到达或队列管理进程尚未发现的邮件。 3. active:放置队列管理进程已经打开了并正准备投递的邮件,该队列有 长度的限制。 4. deferred:放置不能被投递的邮件。 队列管理进程仅仅在内存中保留active队列,并且对该队列的长度进行限 制,这样做的目的是为了避免进程运行内存超过系统的可用内存。 1.2.2 postfix对邮件风暴的处理 当有新的邮件到达时,postfix进行初始化,初始化时postfix同时只接受两个并发的连接请求。当邮件投递成功后,可以同时接受的并发连接的数目就会缓慢地增长至一个可以配置的值。当然,如果这时系统的消耗已到达系统不能承受的负载就会停止增长。还有一种情况时,如果postfix在处理邮件过程中遇到了问题,则该值会开始降低。 当接收到的新邮件的数量超过postfix的投递能力时,postfix会暂时停止投递 deferred队列中的邮件而去处理新接收到的邮件。这是因为处理新邮件的延迟要小于处理deferred队列中的邮件。Postfix会在空闲时处理 deferred中的邮件。 1.2.3 postfix对无法投递的邮件的处理 当一封邮件第一次不能成功投递时,postfix会给该邮件贴上一个将来的时间邮票。邮件队列管理程序会忽略贴有将来时间邮票的邮件。时间邮票到期时,postfix会尝试再对该邮件进行一次投递,如果这次投递再次失败,postfix就给该邮件贴上一个两倍于上次时间邮票的时间邮票,等时间邮票到期时再次进行投递,依此类推。当然,经过一定次数的尝试之后,postfix会放弃对该邮件的投递,返回一个错误信息给该邮件的发件人。 1.2.4 postfix对不可到达的目的地邮件的处理 postfix会在内存中保存一个有长度限制的当前不可到达的地址列表。这样就避免了对那些目的地为当前不可到达地址的邮件的投递尝试。从而大大提高了系统的性能。 1.2.5 postfix的安全性 postfix通过一系列的措施来提高系统的安全性,这些措施包括: 1. 动态分配内存,从而防止系统缓冲区溢出; 2. 把大邮件分割成几块进行处理,投递时再重组; 3. Postfix的各种进程不在其他用户进程的控制之下运行,而是运行在驻留 主进程master的控制之下,与其他用户进程无父子关系,所有有很好的 绝缘性。 4. Postfix的队列文件有其特殊的格式,只能被postfix本身识别;
二、 postfix对邮件的处理过程 2.1 接收邮件的过程 当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,然后针对不同的情况进行不同的处理: 1.对于来自于本地的邮件:sendmail进程负责接收来自本地的邮件放在maildrop队列中,然后pickup进程对maildrop中的邮件进行完整性检测。maildrop目录的权限必须设置为某一用户不能删除其他用户的邮件。 2.对于来自于网络的邮件:smtpd进程负责接收来自于网络的邮件,并且进行安全性检测。可以通过UCE(unsolicited commercial email)控制smtpd的行为。 3.由postfix进程产生的邮件:这是为了将不可投递的信息返回给发件人。这些邮件是由bounce后台程序产生的。 5. 由postfix自己产生的邮件:提示postmaster(也即postfix管理员)postfix 运行过程中出现的问题。(如SMTP协议问题,违反UCE规则的记录等等。) 关于cleanup后台程序的说明:cleanup是对新邮件进行处理的最后一道工序 它对新邮件进行以下的处理:添加信头中丢失的Form信息;为将地址重写成标准的user@fully.qualified.domain格式进行排列;重信头中抽出收件人的地址;将邮件投入incoming队列中,并请求邮件队列管理进程处理该邮件;请求trivial-rewrite进程将地址转换成标准的user@fully.qualified.domain格式。 2.2 投递邮件的过程 新邮件一旦到达incoming队列,下一步就是开始投递邮件,postfix投递邮件时的处理过程如图三所示。相关的说明如下: 邮件队列管理进程是整个postfix邮件系统的心脏。它和local、smtp、pipe等投递代理相联系,将包含有队列文件路径信息、邮件发件人地址、邮件收件人地址的投递请求发送给投递代理。队列管理进程维护着一个deferred队列,那些无法投递的邮件被投递到该队列中。除此之外,队列管理进程还维护着一个active队列,该队列中的邮件数目是有限制的,这是为了防止在负载太大时内存溢出。邮件队列管理程序还负责将收件人地址在 relocated表中列出的邮件返回给发件人,该表包含无效的收件人地址。 如果邮件队列管理进程请求,rewrite后台程序对收件人地址进行解析。但是缺省地,rewrite只对邮件收件人是本地的还是远程的进行区别。 如果邮件对你管理进程请求,bounce后台程序可以生成一个邮件不可投递的报告。 本地投递代理local进程可以理解类似UNIX风格的邮箱,sendmail风格的系统别名数据库和sendmail风格的.forward文件。可以同时运行多个local进程,但是对同一个用户的并发投递进程数目是有限制的。你可以配置local将邮件投递到用户的宿主目录,也可以配置local 将邮件发送给一个外部命令,如流行的本地投递代理procmail。在流行的linux发行版本RedHat中,我们就使用procmail作为最终的本地投递代理。 远程投递代理SMTP进程根据收件人地址查询一个SMTP服务器列表,按照顺序连接每一个SMTP服务器,根据性能对该表进行排序。在系统负载太大时,可以有数个并发的SMTP进程同时运行。 pipe是用于UUCP协议的投递代理。 三、 postfix的安装过程 3.1源代码包的安装 1. 获取postfix的源代码包 从postfix官方站点www.postfix.org取得postfix的源代码包postfix-19991231-pl08.tar.gz。将其拷贝到/tmp 2.解开源代码包,将生成/tmp/ postfix-19991231-pl08目录。 tar xvzf postfix-19991231-pl08.tar.gz 3.编译源代码包 cd /tmp/ postfix-19991231-pl08 make 4.建立一个新用户“postfix”,该用户必须具有唯一的用户id和组id号,同时应该让该用户不能登录到系统,也即不为该用户指定可执行的登录外壳程序和可用的用户宿主目录。我们可以先用adduser postfix 添加用户再编辑/etc/passwd文件中的相关条目如下所示: postfix:*:12345:12345:postfix:/no/where:/no/shell 5.确定/etc/aliases文件中包含如下的条目: postfix: root 6. 以root用户登录,在/tmp/ postfix-19991231-pl08目录下执行命令: ./INSTALL.sh 7. 启动postfix # postfix start 8.关于maildrop目录权限的说明: postfix可以使用一个所有用户都可写的(也即目录权限为1773)的maildrop目录来让本地用户提交邮件。这种方法避免了使用set- uid 或 set-gid 软件,并且在邮件系统不可用时,用户仍然可以提交邮件。其他用户没有访问该目录中的队列文件的权限。接收来自网络的邮件时postfix不使用 maildrop目录。但是,由于该目录的权限是733,其他用户可以建立一个硬连接到该目录中的文件从而导致该邮件被投递多次或无法删除,也就是说这将导致安全性问题。如果你想要使用这种方式来让用户提交邮件,就要在INSTALL.sh 脚本问你是否需要set-gid 时回答no。 如果你的系统有多个用户的话,最好取消以上的方式而采用利用set-gid 用户权限提交邮件的方式。这时,我们首先需要建立一个组id唯一的组'maildrop' 并且确定该组中没有用户成员。然后在INSTALL.sh 问你是否需要set-gid 时指定'maildrop'。 提示:在安装postfix之前,请删除已经安装的sendmail。 3.2 rpm包的安装 1. 获取postfix的rpm软件包。 我们可以从http://www.alltrading.es/postfix/RPMS/i386/ 获得postfix的rpm软件包。当前的最新版本是postfix-20000531-2.i386.rpm。 2. 备份你的/etc/aliases和/etc/aliases.db,因为postfix要使用该别名数据库。 3. 用以下命令查看系统是否安装了sendmail: [root@mail /root]# rpm -qa grep sendmail sendmail-doc-8.9.3-15 sendmail-8.9.3-15 sendmail-cf-8.9.3-15 4. 用以下命令强行卸载sendmail: [root@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps 5. 用以下命令杀死运行中的sendmail进程: [root@mail /root]# killall sendmail 6. 安装postfix: [root@mail /root]# rpm -Uvh postfix-20000531-2.i386.rpm postfix ################################################## postfix-script: warning: creating missing Postfix pid directory postfix-script: warning: creating missing Postfix incoming directory postfix-script: warning: creating missing Postfix active directory postfix-script: warning: creating missing Postfix bounce directory postfix-script: warning: creating missing Postfix defer directory postfix-script: warning: creating missing Postfix deferred directory postfix-script: warning: creating missing Postfix saved directory postfix-script: warning: creating missing Postfix corrupt directory postfix-script: warning: creating missing Postfix public directory postfix-script: warning: creating missing Postfix private directory [root@mail /root]# 7. 启动postfix [root@mail /root]# /etc/rc.d/init.d/postfix start 3.3 配置系统每次启动时自动启动postfix 1.如果你安装的是postfix的源代码包,可以在/etc/rc.d/rc.local文件中加入如下的语句让系统每次启动时自动启动postfix: if [ -f /usr/libexec/postfix ]; then /usr/libexec/postfix start fi 2.如果你安装的是postfix的rpm包,可以通过setup命令来设置在系统启动时启动postfix。
但是我们也可以通过下面的规则来实现更强大的控制功能。 1. 信头过滤 通过header_checks参数限制接收邮件的信头的格式,如果符合指定的格式,则拒绝接收该邮件。可以指定一个或多个查询列表,如果新邮件的信头符合列表中的某一项则拒绝该接收邮件。如: header_checks = regexp:/etc/postfix/header_checks header_checks = pcre:/etc/postfix/header_checks 缺省地,postfix不进行信头过滤。 2.客户端主机名/地址限制 通过smtpd_client_restrictions参数限制可以向postfix发起SMTP 连接的客户端的主机名或ip地址。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_unknown_client:如果客户端的ip地址在DNS中没有PTR记录则拒绝转发该客户端的连接请求。可以用 unknown_client_reject_code参数指定返回给客户机的错误代码(缺省为450)。如果你有用户没有作DNS记录则不要启用该选项。 permit_mynetworks:如果客户端的ip地址符合$mynetworks参数定义的范围则接受该客户端的连接请求,并转发该邮件。 check_client_access maptype:mapname:根据客户端的主机名、父域名、ip地址或属于的网络搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求,并转发该邮件。。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为 554)。 reject_maps_rbl:如果客户端的网络地址符合$maps_rbl_domains参数的值则拒绝该客户端的连接请求。可以用maps_rbl_reject_code参数指定返回给客户机的错误代码(缺省为554)。 示例: smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl smtpd_client_restrictions = permit_mynetworks, reject_unknown_client 该参数的缺省值为: smtpd_client_restrictions = 也即接收来自任何客户端的SMTP连接。 3. 是否请求HELO命令 可以通过smtpd_helo_required参数指定客户端在SMTP会话的开始是否发送一个HELO命令。你可以指定该参数的值为yes或no。缺省值为: smtpd_helo_required = no 4. HELO主机名限制 可以通过smtpd_helo_restrictions参数指定客户端在执行HELO命令时发送给postfix的主机名。缺省地,postfix接收客户端发送的任意形式的主机名。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_invalid_hostname:如果HELO命令所带的主机名参数不符合语法规范则拒绝客户机的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为501)。 permit_naked_ip_address:RFC要求客户端的HELO命令包含的ip地址放在方括号内,你可以用permit_naked_ip_address参数取消该限制。因为有的mail客户端不遵守该RFC的规定。 reject_unknown_hostname:如果客户端执行HELO命令时的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为450)。 reject_non_fqdn_hostname:如果客户端执行HELO命令时的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为504)。 check_helo_access maptype:mapname:根据客户端HELO的主机名、父域名搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。 示例: smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname 5. RFC 821信头限制 RFC 821对邮件的信头做了严格的规定,但是广泛使用的sendmail并不支 持该规定,所以对于该参数我们只能说不,即: strict_rfc821_envelopes = no 6. 通过发件人地址进行限制 可以用smtpd_sender_restrictions参数通过发件人在执行MAIL FROM命令时提供的地址进行限制。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_unknown_sender_domain:如果MAIL FROM命令提供的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。 check_sender_access maptype:mapname:根据MAIL FROM命令提供的主机名、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。可以通过该参数过滤来自某些不受欢迎的发件人的邮件。 reject_non_fqdn_sender:如果MAIL FROM命令提供的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用non_fqdn_reject_code 参数指定返回给客户机的错误代码(缺省为504)。 缺省地,postfix接受来自任何发件人的邮件。 示例: smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain 7. 通过收件人地址进行过滤 可以用smtpd_recipient_restrictions参数通过发件人在执行RCPT TO命令时提供的地址进行限制。缺省值为: smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains 可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: check_relay_domains:如果符合以下的条件,则接受SMTP连接请求,否则拒绝该连接,可以用relay_domains_reject_code 参数指定返回给客户机的错误代码(缺省为504)。 * 客户端主机名符合$relay_domains及其子域 * 目的地为$inet_interfaces、$mydestination或$virtual_maps permit_auth_destination:不管客户端的主机名,只要符合以下的条件,就 接受SMTP连接请求: * 解析后的目标地址符合$relay_domains及其子域 * 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps reject_unauth_destination:不管客户端的主机名,只要符合以下的条件,就拒绝该客户端SMTP连接请求: * 解析后的目标地址符合$relay_domains及其子域 * 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps check_recipient_access:根据解析后的目标地址、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。 reject_unknown_recipient_domain:如果收件人的邮件地址在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。 reject_non_fqdn_recipient:如果发件人在执行RCPT TO命令时提供的地址 不是完整的域名则拒绝其SMTP连接请求。可以用The non_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为504)。 4.4 posftfix的性能控制 之所以对postfix的性能进行控制,是为了在遇到邮件风暴时保证postfix可以正常运行。通常,我们可以通过对下列postfix参数的配置来调节postfix的性能,这些参数都是通过mail.cf配置文件进行配置的,修改以后不要忘了运行postfix reload命令来使配置生效。 1. 进程数限制 可以通过default_process_limit 参数来控制postfix系统同时可以运行的最大进程数目。缺省值是50个。 2. 对同一目标主机的并发连接限制 当向同一目标主机发出SMTP连接时,postfix初始化发出两个SMTP连接,如果投递成功则增加并发的SMTP连接数目,遇到拥塞时又减少并发连接的数目。postfix中通过以下的参数对同一目标主机的并发连接进行控制: * initial_destination_concurrency:控制对同一目标主机的初始化并发连接数目。缺省值为2。 * default_destination_concurrency_limit:控制初始化连接后对同一目标主机的最大并发连接数目。缺省值为10。 * local_destination_concurrency_limit:控制对同一本地收件人的最大同时投递的邮件数目。缺省值为2,因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用。 3. 对同一封邮件的收件人数目限制 通过default_destination_recipient_limit参数来控制postfix的投递代理(如 smtp进程)可以将同一封邮件发送给多少个收件人。缺省值为50。也可以用明确指出该投递代理的参数来覆盖该缺省值。如用smtpd_recipient_limit来指定smtp投递代理可以将同一封邮件发送给多少个收件人,该参数的缺省值为1000。 4. 推迟投递控制 通过defer_transports参数,我们可以推迟投递该参数指定的邮件直到postfix明确的提出投递要求。下面我们看一个例子: 有一个小型的局域网,用户都将邮件发送给局域网内部的一台postfix邮件服务器,然后通过在该服务器上拨号将邮件发送出去。这时我们可以这样指定该参数的值: defer_transports = smtp 该语句表示postfix推迟投递所有的邮件直到执行sendmail -q命令,这样我们就可以在ppp的脚本中加上sendmail -q,以便在拨号成功后让postfix开始投递邮件。
二、 postfix对邮件的处理过程 2.1 接收邮件的过程 当postfix接收到一封新邮件时,新邮件首选在incoming队列处停留,然后针对不同的情况进行不同的处理: 1.对于来自于本地的邮件:sendmail进程负责接收来自本地的邮件放在maildrop队列中,然后pickup进程对maildrop中的邮件进行完整性检测。maildrop目录的权限必须设置为某一用户不能删除其他用户的邮件。 2.对于来自于网络的邮件:smtpd进程负责接收来自于网络的邮件,并且进行安全性检测。可以通过UCE(unsolicited commercial email)控制smtpd的行为。 3.由postfix进程产生的邮件:这是为了将不可投递的信息返回给发件人。这些邮件是由bounce后台程序产生的。 5. 由postfix自己产生的邮件:提示postmaster(也即postfix管理员)postfix 运行过程中出现的问题。(如SMTP协议问题,违反UCE规则的记录等等。) 关于cleanup后台程序的说明:cleanup是对新邮件进行处理的最后一道工序 它对新邮件进行以下的处理:添加信头中丢失的Form信息;为将地址重写成标准的user@fully.qualified.domain格式进行排列;重信头中抽出收件人的地址;将邮件投入incoming队列中,并请求邮件队列管理进程处理该邮件;请求trivial-rewrite进程将地址转换成标准的user@fully.qualified.domain格式。 2.2 投递邮件的过程 新邮件一旦到达incoming队列,下一步就是开始投递邮件,postfix投递邮件时的处理过程如图三所示。相关的说明如下: 邮件队列管理进程是整个postfix邮件系统的心脏。它和local、smtp、pipe等投递代理相联系,将包含有队列文件路径信息、邮件发件人地址、邮件收件人地址的投递请求发送给投递代理。队列管理进程维护着一个deferred队列,那些无法投递的邮件被投递到该队列中。除此之外,队列管理进程还维护着一个active队列,该队列中的邮件数目是有限制的,这是为了防止在负载太大时内存溢出。邮件队列管理程序还负责将收件人地址在 relocated表中列出的邮件返回给发件人,该表包含无效的收件人地址。 如果邮件队列管理进程请求,rewrite后台程序对收件人地址进行解析。但是缺省地,rewrite只对邮件收件人是本地的还是远程的进行区别。 如果邮件对你管理进程请求,bounce后台程序可以生成一个邮件不可投递的报告。 本地投递代理local进程可以理解类似UNIX风格的邮箱,sendmail风格的系统别名数据库和sendmail风格的.forward文件。可以同时运行多个local进程,但是对同一个用户的并发投递进程数目是有限制的。你可以配置local将邮件投递到用户的宿主目录,也可以配置local 将邮件发送给一个外部命令,如流行的本地投递代理procmail。在流行的linux发行版本RedHat中,我们就使用procmail作为最终的本地投递代理。 远程投递代理SMTP进程根据收件人地址查询一个SMTP服务器列表,按照顺序连接每一个SMTP服务器,根据性能对该表进行排序。在系统负载太大时,可以有数个并发的SMTP进程同时运行。 pipe是用于UUCP协议的投递代理。 三、 postfix的安装过程 3.1源代码包的安装 1. 获取postfix的源代码包 从postfix官方站点www.postfix.org取得postfix的源代码包postfix-19991231-pl08.tar.gz。将其拷贝到/tmp 2.解开源代码包,将生成/tmp/ postfix-19991231-pl08目录。 tar xvzf postfix-19991231-pl08.tar.gz 3.编译源代码包 cd /tmp/ postfix-19991231-pl08 make 4.建立一个新用户“postfix”,该用户必须具有唯一的用户id和组id号,同时应该让该用户不能登录到系统,也即不为该用户指定可执行的登录外壳程序和可用的用户宿主目录。我们可以先用adduser postfix 添加用户再编辑/etc/passwd文件中的相关条目如下所示: postfix:*:12345:12345:postfix:/no/where:/no/shell 5.确定/etc/aliases文件中包含如下的条目: postfix: root 6. 以root用户登录,在/tmp/ postfix-19991231-pl08目录下执行命令: ./INSTALL.sh 7. 启动postfix # postfix start 8.关于maildrop目录权限的说明: postfix可以使用一个所有用户都可写的(也即目录权限为1773)的maildrop目录来让本地用户提交邮件。这种方法避免了使用set- uid 或 set-gid 软件,并且在邮件系统不可用时,用户仍然可以提交邮件。其他用户没有访问该目录中的队列文件的权限。接收来自网络的邮件时postfix不使用 maildrop目录。但是,由于该目录的权限是733,其他用户可以建立一个硬连接到该目录中的文件从而导致该邮件被投递多次或无法删除,也就是说这将导致安全性问题。如果你想要使用这种方式来让用户提交邮件,就要在INSTALL.sh 脚本问你是否需要set-gid 时回答no。 如果你的系统有多个用户的话,最好取消以上的方式而采用利用set-gid 用户权限提交邮件的方式。这时,我们首先需要建立一个组id唯一的组'maildrop' 并且确定该组中没有用户成员。然后在INSTALL.sh 问你是否需要set-gid 时指定'maildrop'。 提示:在安装postfix之前,请删除已经安装的sendmail。 3.2 rpm包的安装 1. 获取postfix的rpm软件包。 我们可以从http://www.alltrading.es/postfix/RPMS/i386/ 获得postfix的rpm软件包。当前的最新版本是postfix-20000531-2.i386.rpm。 2. 备份你的/etc/aliases和/etc/aliases.db,因为postfix要使用该别名数据库。 3. 用以下命令查看系统是否安装了sendmail: [root@mail /root]# rpm -qa grep sendmail sendmail-doc-8.9.3-15 sendmail-8.9.3-15 sendmail-cf-8.9.3-15 4. 用以下命令强行卸载sendmail: [root@mail /root]# rpm -e sendmail sendmail-cf sendmail-doc --nodeps 5. 用以下命令杀死运行中的sendmail进程: [root@mail /root]# killall sendmail 6. 安装postfix: [root@mail /root]# rpm -Uvh postfix-20000531-2.i386.rpm postfix ################################################## postfix-script: warning: creating missing Postfix pid directory postfix-script: warning: creating missing Postfix incoming directory postfix-script: warning: creating missing Postfix active directory postfix-script: warning: creating missing Postfix bounce directory postfix-script: warning: creating missing Postfix defer directory postfix-script: warning: creating missing Postfix deferred directory postfix-script: warning: creating missing Postfix saved directory postfix-script: warning: creating missing Postfix corrupt directory postfix-script: warning: creating missing Postfix public directory postfix-script: warning: creating missing Postfix private directory [root@mail /root]# 7. 启动postfix [root@mail /root]# /etc/rc.d/init.d/postfix start 3.3 配置系统每次启动时自动启动postfix 1.如果你安装的是postfix的源代码包,可以在/etc/rc.d/rc.local文件中加入如下的语句让系统每次启动时自动启动postfix: if [ -f /usr/libexec/postfix ]; then /usr/libexec/postfix start fi 2.如果你安装的是postfix的rpm包,可以通过setup命令来设置在系统启动时启动postfix。
但是我们也可以通过下面的规则来实现更强大的控制功能。 1. 信头过滤 通过header_checks参数限制接收邮件的信头的格式,如果符合指定的格式,则拒绝接收该邮件。可以指定一个或多个查询列表,如果新邮件的信头符合列表中的某一项则拒绝该接收邮件。如: header_checks = regexp:/etc/postfix/header_checks header_checks = pcre:/etc/postfix/header_checks 缺省地,postfix不进行信头过滤。 2.客户端主机名/地址限制 通过smtpd_client_restrictions参数限制可以向postfix发起SMTP 连接的客户端的主机名或ip地址。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_unknown_client:如果客户端的ip地址在DNS中没有PTR记录则拒绝转发该客户端的连接请求。可以用 unknown_client_reject_code参数指定返回给客户机的错误代码(缺省为450)。如果你有用户没有作DNS记录则不要启用该选项。 permit_mynetworks:如果客户端的ip地址符合$mynetworks参数定义的范围则接受该客户端的连接请求,并转发该邮件。 check_client_access maptype:mapname:根据客户端的主机名、父域名、ip地址或属于的网络搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求,并转发该邮件。。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为 554)。 reject_maps_rbl:如果客户端的网络地址符合$maps_rbl_domains参数的值则拒绝该客户端的连接请求。可以用maps_rbl_reject_code参数指定返回给客户机的错误代码(缺省为554)。 示例: smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl smtpd_client_restrictions = permit_mynetworks, reject_unknown_client 该参数的缺省值为: smtpd_client_restrictions = 也即接收来自任何客户端的SMTP连接。 3. 是否请求HELO命令 可以通过smtpd_helo_required参数指定客户端在SMTP会话的开始是否发送一个HELO命令。你可以指定该参数的值为yes或no。缺省值为: smtpd_helo_required = no 4. HELO主机名限制 可以通过smtpd_helo_restrictions参数指定客户端在执行HELO命令时发送给postfix的主机名。缺省地,postfix接收客户端发送的任意形式的主机名。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_invalid_hostname:如果HELO命令所带的主机名参数不符合语法规范则拒绝客户机的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为501)。 permit_naked_ip_address:RFC要求客户端的HELO命令包含的ip地址放在方括号内,你可以用permit_naked_ip_address参数取消该限制。因为有的mail客户端不遵守该RFC的规定。 reject_unknown_hostname:如果客户端执行HELO命令时的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为450)。 reject_non_fqdn_hostname:如果客户端执行HELO命令时的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为504)。 check_helo_access maptype:mapname:根据客户端HELO的主机名、父域名搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。 示例: smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname 5. RFC 821信头限制 RFC 821对邮件的信头做了严格的规定,但是广泛使用的sendmail并不支 持该规定,所以对于该参数我们只能说不,即: strict_rfc821_envelopes = no 6. 通过发件人地址进行限制 可以用smtpd_sender_restrictions参数通过发件人在执行MAIL FROM命令时提供的地址进行限制。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: reject_unknown_sender_domain:如果MAIL FROM命令提供的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。 check_sender_access maptype:mapname:根据MAIL FROM命令提供的主机名、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。可以通过该参数过滤来自某些不受欢迎的发件人的邮件。 reject_non_fqdn_sender:如果MAIL FROM命令提供的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用non_fqdn_reject_code 参数指定返回给客户机的错误代码(缺省为504)。 缺省地,postfix接受来自任何发件人的邮件。 示例: smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain 7. 通过收件人地址进行过滤 可以用smtpd_recipient_restrictions参数通过发件人在执行RCPT TO命令时提供的地址进行限制。缺省值为: smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains 可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有: check_relay_domains:如果符合以下的条件,则接受SMTP连接请求,否则拒绝该连接,可以用relay_domains_reject_code 参数指定返回给客户机的错误代码(缺省为504)。 * 客户端主机名符合$relay_domains及其子域 * 目的地为$inet_interfaces、$mydestination或$virtual_maps permit_auth_destination:不管客户端的主机名,只要符合以下的条件,就 接受SMTP连接请求: * 解析后的目标地址符合$relay_domains及其子域 * 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps reject_unauth_destination:不管客户端的主机名,只要符合以下的条件,就拒绝该客户端SMTP连接请求: * 解析后的目标地址符合$relay_domains及其子域 * 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps check_recipient_access:根据解析后的目标地址、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。 reject_unknown_recipient_domain:如果收件人的邮件地址在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。 reject_non_fqdn_recipient:如果发件人在执行RCPT TO命令时提供的地址 不是完整的域名则拒绝其SMTP连接请求。可以用The non_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为504)。 4.4 posftfix的性能控制 之所以对postfix的性能进行控制,是为了在遇到邮件风暴时保证postfix可以正常运行。通常,我们可以通过对下列postfix参数的配置来调节postfix的性能,这些参数都是通过mail.cf配置文件进行配置的,修改以后不要忘了运行postfix reload命令来使配置生效。 1. 进程数限制 可以通过default_process_limit 参数来控制postfix系统同时可以运行的最大进程数目。缺省值是50个。 2. 对同一目标主机的并发连接限制 当向同一目标主机发出SMTP连接时,postfix初始化发出两个SMTP连接,如果投递成功则增加并发的SMTP连接数目,遇到拥塞时又减少并发连接的数目。postfix中通过以下的参数对同一目标主机的并发连接进行控制: * initial_destination_concurrency:控制对同一目标主机的初始化并发连接数目。缺省值为2。 * default_destination_concurrency_limit:控制初始化连接后对同一目标主机的最大并发连接数目。缺省值为10。 * local_destination_concurrency_limit:控制对同一本地收件人的最大同时投递的邮件数目。缺省值为2,因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用。 3. 对同一封邮件的收件人数目限制 通过default_destination_recipient_limit参数来控制postfix的投递代理(如 smtp进程)可以将同一封邮件发送给多少个收件人。缺省值为50。也可以用明确指出该投递代理的参数来覆盖该缺省值。如用smtpd_recipient_limit来指定smtp投递代理可以将同一封邮件发送给多少个收件人,该参数的缺省值为1000。 4. 推迟投递控制 通过defer_transports参数,我们可以推迟投递该参数指定的邮件直到postfix明确的提出投递要求。下面我们看一个例子: 有一个小型的局域网,用户都将邮件发送给局域网内部的一台postfix邮件服务器,然后通过在该服务器上拨号将邮件发送出去。这时我们可以这样指定该参数的值: defer_transports = smtp 该语句表示postfix推迟投递所有的邮件直到执行sendmail -q命令,这样我们就可以在ppp的脚本中加上sendmail -q,以便在拨号成功后让postfix开始投递邮件。
订阅:
博文 (Atom)

