[ 2005/05/24 00:44 | by 网络毛毛虫 ]
目 录
选择网络适配器

· WHQL 认证

· 卸载能力

· 中断调解

· 64位功能

· 铜缆和光纤网络适配器

· 双端口或4端口的网络适配器

调整网络适配器

· 启用卸载特性

· 网络适配器资源

· 中断调解

TCP 参数

选择存储系统

· WHQL 认证

· 减少待存储数据的数量

· 存储阵列的选择

· HW RAID 的级别

· 选择RAID 级别

· 确定卷的布局

· 中断调解

与存储有关的参数

· CountOperations

· NumberOfRequests

· DontVerifyRandomDrivers

选择正确的高性能硬件

操作系统最佳实践

IIS 6.0 优化

内核模式的调整

· 缓存管理设置

· 请求和连接管理设置

用户模式设置

· IIS 注册表设置

· IIS Metabase

· IIS 工作进程选项(IIS Admin UI、应用程序池属性)

· 安全套接字层的调整参数

· ISAPI

· 托管代码调整参数

· 影响IIS性能的其他问题

· NTFS 文件系统设置

· Tcpip.sys 的IIS性能设置

· IIS的网络适配器调整和绑定

一般考虑事项

服务器消息块服务器模型

文件服务器的常规调整参数

· PagedPoolSize

· NtfsDisable8dot3NameCreation

· Disablelastaccess

· NumTcbTablePartitions

· TcpAckFrequency

中断关联

客户端计算机的常规调整参数

· DormantFileLimit

· ScavengerTimeLimit

· DisableByteRangeLockingOnReadOnlyFiles

· TcpAckFrequency

对 Boot.ini 文件使用 /3GB 开关参数

关闭签名和密封功能

· Windows Server 2003面向 NetBench 的注册表调整参数

· 客户端计算机上面向 NetBench 的注册表调整参数

· 添加针对描述属性的索引(服务器)

· 关闭磁盘碎片自动整理程序

· 在 TCP/IP 增加 MaxUserPorts 和 TcpWindowSize

针对 NTttcp 的调整

· 网络适配器

· TCP

针对Chariot 的调整

 



介绍
对于用户现有的大多数工作,Microsoft® Windows Server™ 2003 应该都能够运行自如。但是,我们还可以调整服务器设置并获得更好的性能表现,尤其是在工作负载的性质不会随同时间推移而不断变化的时候。

大多数的有效调整都应该考虑到硬件、工作负载以及性能目标这些因素。本文介绍了有助于提高性能的重要调整参数和设置。并且介绍了每一种设置以及它的潜在功效,帮助用户根据自己的系统、工作负载和性能目标做出明智的决策。

说明:Microsoft Windows® 2000 Server 和 Windows Server 2003的注册表设置和调整参数可能存在较大差异。在调校服务器时请务必牢记:使用早期或过时的调整指南可能会得到意料之外的结果。

此外,在直接操作注册表时请总是谨慎行事。如果必须编辑注册表,请首先进行备份。

网络的性能调整
网络体系结构包括许多组件、接口和协议;图1描述了其中的部分内容。本节以下部分将针对服务器负载,对部分组件的优化调整加以讨论。


图 1 网络栈的组件

网络体系结构由多个层组成,这些层可以被大致划分为:

· 网络驱动程序和NDIS。这些是处于最底部的层。NDIS将它下方的驱动程序接口暴露它上方的层;例如:TCP/IP。

· 协议栈。此层实现了诸如TCP/IP 和 UDP/IP 这样的协议。这些层向位于它们上方的层暴露了TDI接口。

· 系统驱动程序。属于典型的TDI客户端,用来向用户模式的应用程序暴露接口。WinSock接口由Afd.sys加以暴露。

· 用户模式的应用程序。

耗费大量网络资源的工组负载的调整工作涉及所有层的调整。下面介绍了其中的部分工作。

选择网络适配器
网络密集型的应用程序需要高性能的网络适配器。本节内容介绍了选择网络适配器时的一些注意事项。

WHQL 认证
选择通过了Microsoft Windows Hardware Quality Labs(WHQL)认证的网络适配器。

卸载能力
卸载有助于降低服务器CPU的使用率,从而提高系统的整体性能。Microsoft TCP/IP 传输可以让具有相应任务卸载能力的网络适配器卸载以下的一项或多项任务:

· 校验和任务。TCP/IP 传输可以在发送和接收时卸载IP和TCP校验和的计算和验证工作。

· IP 安全性任务。TCP/IP 传输可以卸载身份验证标头(AH)和ESP(封装安全性负载)的已加密校验和的计算和验证工作。TCP/IP传输还可以卸载ESP负载的加密和解密工作。

· 大型TCP 数据包的分段。TCP/IP 传输支持大型发送卸载(LSO)。利用LSO,TCP/IP传输可以卸载大型TCP数据包的分段工作。

· 堆栈卸载。整个网络堆栈可以被卸载到具有相应能力的网络适配器上。

中断调解
某些网络适配器可以降低向处理器发出中断的频率,这些中断表明适配器上启动(或完成)了某个网络操作。某些网络适配器还能够将网络和主机处理器的负载考虑在内,以一种自适应的方式做出上述决定。减缓中断的发生频率通常可以降低主机CPU的负载,但是除非能够以一种智能和自适应的方式执行中断调解,否则在CPU方面的性能节省将以网络延迟的增加作为代价。

64位功能
具有64位能力的网络适配器可以对大容量物理内存地址(4GB以上)执行直接内存访问(DMA)操作。

铜缆和光纤网络适配器
使用铜缆的网络适配器和使用光纤的适配器具有同样的性能,但是在价格上要便宜一些。铜缆网络适配器上的收发器的价格也要更低一些。

双端口或4端口的网络适配器
这些网络适配器对于故障转移应用来说非常适宜,但是网络适配器上的所有端口都共享同一个中断。通常,对于同样的工作负载,使用两块单端口的网络适配器要比使用一块双端口的网络适配器具有更好的性能。

调整网络适配器
如果网络适配器允许,可以通过调整网络适配器来优化网络吞吐量和资源使用率。需要记住的是:具体的调整工作需要视网络适配器、工作负载、主机资源以及性能目标而定。

启用卸载特性
开启网络适配器的卸载特性一般总是有益的。但是,在某些情况下,网络适配器的处理能力可能不足以完成高吞吐量情况下的卸载工作。比如,启用LSO会降低某些网络适配器最大能承受的吞吐量。但是,即使是这样的网络适配器,如果对吞吐量方面的降低并不在意,也应该启用卸载特性。请注意:某些网络适配器需要为发送和接收路径单独启用卸载特性。

网络适配器资源
有几种网络适配器允许管理员配置资源。可以为接收缓冲区和发送缓冲区设置参数。部分网络适配器会主动管理它们的资源,而无需为这些网络适配器设置这些参数。

中断调解
某些网络适配器会保留 buffer coalescing (缓冲区合并)参数(发送和接收缓冲区有时单独进行配置)。在网络适配器不能够以自适应方式执行中断调解时,考虑缓冲区合并十分重要。

TCP 参数
高吞吐量情境下可以考虑进行调整的TCP 参数如表1所示。

表 1. TCP 参数

参数
描述

TCPWindowSize
该值决定了在任何一个给定的时间,能够在网络上传送的最大数据量(以字节计)。可以使用如下注册表条目,将其设置为从1到65,535 字节的任何值:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\Tcpip \Parameters\TcpWindowSize (REG_DWORD)

对于gigabit接口,此参数的默认值被设置为65,535左右(向下舍入为最接近的完整TCP数据包的倍数),100Mbps的连接设置为 16,384,其他速度更低的接口(例如调制解调器)则设置为8,192 —— 同样需要向下舍入。理想情况下,该值应该被设置为端到端网络带宽(以字节为单位)与往返延迟(以秒为单位)的乘积,也就是带宽与延迟的乘积。该值应该根据计算机预计接收到的TCP数据量进行设置。

Window Scaling
在带宽与延迟的乘积值很高的连接上(例如,卫星连接),可能需要将窗口的大小增加到64K以上。为了提高窗口大小,需要按照RFC1323中的规定,设置如下注册表条目,以启用TCP选项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\Tcpip\Parameters\Tcp1323Opts (REG_DWORD)

为了使用大于65,535的窗口尺寸,该注册表条目应该被设置为1。在修改了该值之后,便可以将用来控制TCPWindowSize的注册表条目设置为大于64K的值(最大1GB)。

MaxHashTableSize
该值决定了保存TCP连接状态的散列表的大小。默认值为128乘以系统中处理器数量的平方。如果预计系统需要处理大量的并发连接,可以将如下注册表条目设置为一个较高的数值,以提高散列表的性能:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\Tcpip \Parameters\MaxHashTableSize (REG_DWORD)

最大值为 0x10000(65,536)。我们建议您在将要处理大量连接负载的大型服务器上将此值设置为最大值。需要记住的是:该表使用了不分页的池,所以,如果服务器没有许多不分页池可用,或者服务器不需要处理大量连接负载,那么请不要将本参数设置为一个太高的数值。

NumTcbTablePartitions
默认情况下,存放TCP连接状态的表拥有的分区数量等于处理器数目的平方。在大多数情况下,该设置是恰当的,而且会减少表的争用现象。但是,对于处理器数目大于16的服务器,默认值显得过于高了,并可能会因此占用太多的CPU资源。在这种情况下,请将以下注册表条目设置为一个小于处理器数目平方的数值:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\Tcpip\Parameters\
NumTcbTablePartitions (REG_DWORD)

MaxUserPort
当计算机上存在一个活动连接的时候,就会使用到端口。在给定了可用的用户模式端口(每个IP地址有5000个)的默认值和TCP超时等待要求之后,可能必须在系统中提供更多的端口以供使用。可以将如下注册表条目的值最大设置为 0xfffe(65534):

HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\Tcpip \Parameters\MaxUserPort


 

存储系统的性能调整
存储体系结构的驱动程序堆栈包含许多组件,如图2所示。本节将讨论存储负载的调整方法。




图 2 存储驱动程序堆栈

选择存储系统
在选择存储系统时,最重要的考虑事项是:

· 为当前和未来的存储需要提供必要的存储空间、带宽和延迟特性。

· 选择HW RAID 类型的系统和备份过程,以便获得良好的性能表现和数据恢复能力。

WHQL 认证
选择通过了WHQL认证的存储适配器。

减少待存储数据的数量
如果希望减少在新的文件服务器上保存的数据数量,需要考虑以下问题:

· 当前在文件服务器上保存的数据量,这些文件服务器将要被合并到新的服务器中。

· 如果文件服务器将成为一个复制成员,存储在新的文件服务器上的数据中将有多少会参加复制。

· 未来需要在文件服务器上保存的数据量。

一般的指导原则是:针对超过目前增长速度的更快的未来增长进行规划。调查组织是否打算雇佣大量人员,或者组织中的各个部门是否计划实施一些需要超大存储容量的项目等等。

此外,还必须将操作系统文件、应用程序、RAID冗余、日志文件以及其他因素考虑在内。表2描述了影响文件服务器容量的部分因素。

表 2. 影响文件服务器性能的因素

因素
需要的存储容量

操作系统文件
至少1.5 GB。为了为可选组件、未来安装的服务包以及其他项目预留足够的空间,还应该为操作系统卷再额外规划3 GB到5 GB的空间。

分页文件
情况下,其大小默认为内存容量的1.5 倍。

内存转储
根据选择的内存转储文件选项,需要的磁盘空间可能等于物理内存的数量再加上1MB。

应用程序
根据应用程序的具体情况而有所变化,包括防病毒、备份、磁盘配额软件、数据库应用以及可选组件(例如,恢复控制台、Services for Unix和Services for NetWare)等。

日志文件
根据创建日志文件的应用程序而有所变化。某些应用程序允许用户设置日志文件的最大尺寸。必须确保有足够的剩余空间来容纳日志文件。

RAID 解决方案
视具体情况而有所变化;请参阅后文中的 选择RAID 级别 了解更多信息。

影子副本
默认情况下,使用10%的卷空间,但是我们建议用户为其使用更多空间。


 

存储阵列的选择
在选择存储阵列和适配器的时候需要考虑许多事项。在选择存储阵列类型的时候,可以考虑以下选项:

表3. 选择存储阵列时的选项

选项
描述

光纤通道或SCSI
· 光纤通道允许用户使用长的玻璃或铜制电缆将存储阵列连接到系统,从而提供高带宽。

· SCSI 提供了非常高的带宽,但是电缆长度有限。

HW RAID 能力
存储控制器具有 HW RAID 能力十分重要。表4介绍了RAID 0、RAID 1和RAID 5级别。

最大存储容量
· 总的存储区域。

· 访问存储系统时的带宽由阵列中的物理磁盘数量、控制器的速度以及磁盘类型(例如,SCSI或光纤通道)、HW RAID、以及将存储阵列连接到系统的适配器共同决定。


 

HW RAID 的级别
大多数存储阵列都具有部分的HW RAID功能,并包括如下RAID选项。

表4. HW RAID 选项

选项
描述

RAID 0
RAID 0 表现为一个逻辑磁盘,由一组物理磁盘组成,并以带区方式访问磁盘。

· 整体来看,这种方式是速度最快的HW RAID配置方式。

· 这是一种最为廉价的RAID配置方式,因为无需复制数据。

· 和RAID 0 和 RAID 5 不同,RAID 0 不提供额外的数据恢复机制。

RAID 1
RAID 1 表现为一个逻辑磁盘,它与另一个磁盘互为镜像。

· RAID 1的写操作的速度慢于RAID 0,因为需要向两块或两块以上的物理磁盘写入数据,而且它的写操作具有最长的延迟时间。

· 在某些情况下,RAID 1读取数据的速度要快于RAID 0,因为它可以从最闲的一块物理磁盘中读取数据。

· 从物理磁盘方面来看,RAID 1是最为昂贵的配置方式,因为数据被完整地保存成两份或者更多的副本。

· 在物理磁盘发生故障之后所需的恢复时间方面,RAID 1的速度最快,因为第二块物理磁盘可以立即投入使用。可以在安装新的镜像磁盘的同时,允许用户访问所有数据。

RAID 5
RAID 5 表现为一个逻辑磁盘,它将奇偶校验信息写入到另一块磁盘中,如图3所示。

· RAID 5 使用独立的数据磁盘,并且具有分布式的奇偶校验块。

· RAID 5 的速度慢于RAID 0,因为每一个逻辑磁盘的写I/O都会将数据被写入到多块磁盘。但是,RAID 5提供了RAID 0 所没有的数据恢复功能,因为可以根据奇偶校验来重新构造数据。

· 在物理磁盘发生故障之后,RAID 5 需要花费额外的时间(和RAID 1相比)进行恢复,因为它需要利用保存在其他磁盘上的奇偶校验信息来重新构造磁盘上的数据。

· 因为不需要在磁盘上保存数据的完整副本,RAID 5的成本低于RAID 1。

其他
其他的RAID组合方式包括RAID 0+1、Raid 10 以及 Raid 50。


 

下图描绘了RAID 5 的配置方式。



图 3  RAID5 概述

选择RAID 级别
选择每一个RAID 级别时都需要全面考虑如下因素:

· 成本

· 性能

· 可用性和可靠性

您可以评估各种数据类型的读写负载,然后确定为了实现组织的性能表现和可用性(可靠性)目标所需耗费的资金,最后为文件服务器选择最佳的RAID级别。表5介绍了4种常见的RAID级别、它们的相对成本、性能表现、可用性和可靠性以及建议使用的场合。

表5. RAID 考虑因素

 
RAID-0

带区
RAID-1

镜像
RAID-5

带奇偶校验的带区
RAID-0+1

带区镜像

最小磁盘数量
2
2
3
4

可用的存储容量
100%
50%
N-1/N

此处的 N 为磁盘的数目
50%

容错性
无。其中一块磁盘的故障会丢失卷中的所有数据。
可以允许损失多块磁盘,只要有一对镜像磁盘没有损失即可。
可以容忍其中一块磁盘发生故障。
可以允许损失多块磁盘,只要还有一对镜像磁盘没有损失即可。根据阵列中镜像磁盘的对数而有所变化 1。

读性能
由于改善了并发性,一般会得到提高
良好的读性能
由于改善了并发性,一般会得到提高
由于改善了并发性,并且每个请求可以有两个来源,从而提高了性能。

写性能
由于改善了并发性,一般会得到提高
比JBOD 差(对于大多数负载,在20% 和 40% 之间)
很差,除非执行完整的带区写入操作(大型请求),比JBOD低大约25%左右(4:1 请求)。
可能提高,也可能降低,具体情况视请求的大小、热点(静态或动态)等因素而定。

最佳用途
只用于存储临时数据
操作系统日志文件
· 操作系统

· 用户和共享数据

· 应用程序文件
· 操作系统

· 用户和共享数据

· 应用程序文件

· 日志文件


1如果某块磁盘发生故障,在替换磁盘之前如果其镜像伙伴也发生故障,数据将会丢失。但是,任何其他成员磁盘的故障并不会导致数据丢失。

 

如果您使用了两块以上的磁盘,RAID 0+1永远都是比RAID 1更好的解决方案。

在确定应该在RAID 0、RAID 5和RAID 0+1虚拟磁盘中包括的磁盘数量的时候,应该考虑以下信息:

· 随着添加更多的磁盘而获得的性能提升。

· 可靠性,两块磁盘的平均故障时间(MTTF),将随着在RAID 5或RAID 0中添加磁盘而不断降低。

· 随着添加更多磁盘,可用的存储容量将增加,但是成本也会随之一同上升。

· 带区单元的大小。软件解决方案将其固定在64 KB。硬件解决方案则从4KB到1MB不等。理想的带区单元的大小可以在不中断请求的情况下最大限度改善磁盘操作(因为多块磁盘可以服务于同一个请求)。例如:

· JBOD上的一个顺序请求流(大型)在一个时间只会导致一块磁盘处于繁忙状态。为了让所有磁盘都处于繁忙状态,带区单元需要被设为1/N(此处的 N 等于请求的大小)。

· 对于N个小型的随机请求流,如果N大于磁盘的数目,而且没有热点,那么带区集将不会提高系统的性能。但是,如果存在热点,带区单元的大小就需要精心设置,以便将请求被分割的现象降至最少,同时最大限度地避免热点完全落入一个或两个带区单元。您可能会将单元的大小设置为请求大小的低倍数,例如5倍或10倍,尤其是当请求大小位于某个容量界限时(例如,4KB或者8KB)。

· 当流的数量少于磁盘的数量时,需要对流进行分割,以便所有磁盘都保持繁忙状态。根据上面的两个例子,例如,如果您有10块磁盘和5个流,那么需要对半分割每个请求(将带区单元的大小设置为请求大小的一半)。

确定卷的布局
任何时候,都应该尽可能地将不同类型的数据分别放在不同的卷上。例如,为操作系统和分页文件使用一个卷,为共享的用户数据、应用程序和日志文件使用一个或多个卷

将不同类型的数据放在不同虚拟磁盘的不同卷中。使用不同的虚拟磁盘对于那些会产生大量数据写入负载的数据类型(例如日志文件)来说显得尤其重要,因为单个磁盘集(包含虚拟磁盘)可以专门用来处理由于日志文件的更新而产生的磁盘I/O。将分页文件放在单独的虚拟磁盘上可以小幅度地提高系统性能,但是这种性能提升一般不值得为其付出额外的成本。

为了在最大限度降低成本的同时提高性能,将位于同一个虚拟磁盘上的一个或多个卷中的不同数据类型合并到一起通常是一种有益的做法。一个常见的方法就是:将操作系统和分页文件放在同一个虚拟磁盘上,而将用户数据、应用程序以及日志文件放在剩余虚拟磁盘的一个或多个卷上。

中断调解
某些存储适配器能够减慢向主机处理器发出中断的频率,这些中断表明发生(或)完成了某个磁盘操作。减缓中断频率通常会降低CPU的负载,但是,除非中断调解能够以智能化的方式执行;否则CPU性能的提高将以延迟时间的增加作为代价。

表6. 中断调解选项

设备
描述

64位功能
支持64位的适配器可以在大容量内存地址(大于4GB)上执行DMA操作。

铜缆和光纤(玻璃)适配器
使用铜缆的适配器和使用光纤的类似产品一般具有相同的性能表现,而且铜缆和光纤都可以用在某些光纤通道适配器上。使用铜缆和光纤的适配器应该说各有所长,分别有各自适用的环境。

双端口或4端口SCSI适配器
某些SCSI适配器在一块适配器卡上提供了2或4条SCSI总线。由于SCSI限制了能够连接到SCSI总线上的磁盘数量,这种做法通常是十分必要的。光纤通道的磁盘一般对连接到适配器的磁盘数量没有进行限制。


 

与存储有关的参数
您可以调整如下注册表参数,获得更高的吞吐量。

CountOperations
本参数允许您关闭系统和进程级别的I/O计数器。该计数器会影响磁盘和网络I/O请求的系统和磁盘计数。除了网络接口、IP和TCP计数器之外,物理和逻辑磁盘计数器不受本参数的影响。由于对进程和系统级别的I/O进行计数会产生可观的开销,而且系统仍然会分析物理、逻辑、网络接口、IP和TCP级别的I/O速率,因此在系统上使用此注册表参数关闭进程和系统计数器就非常有用。为了关闭进程和系统I/O计数器,需要在以下注册表条目中创建一个注册表值——以及I/O系统键(如果不存在)——并且将其值设置为0(REG_DWORD):

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Session Manager\I/O System\CountOperations.

为了使本设置生效,需要重新启动计算机。可以将CountOperations设置为1,或者删除CountOperations注册表条目,以重新开启进程和系统计数器。

NumberOfRequests
本参数允许您指定为某块给定适配器创建的SRB的数量。它能够提高性能,并且让Windows向逻辑磁盘发出更多的磁盘请求,这对于拥有并发能力的HW RAID 适配器来说尤其有用,因为每一个逻辑磁盘都由多块物理磁盘组成。但是,默认设置对于许多高速的HW RAID磁盘阵列来说通常不是最佳的设置。 可以将NumberOfRequests设置为32到96(十进制)之间的一个数值,改善磁盘阵列的整体性能。可以设置以下注册表条目: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MINIPORT_ADAPTER\Parameters
\DeviceN\NumberOfRequests (REG_DWORD)

用具体的适配器名称替换miniport_adapter。为每个设备建立一个条目,并且在每个条目中用Device1、Device2…替换 DeviceN ,具体情况视添加的设备数量而定。为了让设置生效,需要重新启动计算机。例如,如果两块Emulex LP9000 微型端口适配器的微型端口驱动程序名称为lp6nds35,可以创建如下注册表条目,并将它的值设置为96:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\lp6nds35\Parameters\Device0\NumberOfRequests

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\lp6nds35\Parameters\Device1\NumberOfRequests

DontVerifyRandomDrivers
本参数会阻止驱动程序验证程序处于调试的目的随机校验驱动程序。为了禁用驱动程序校验程序,可以将以下注册表条目的值设为1(REG_DWORD):

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Session Manager\Memory Management\DontVerifyRandomDrivers.

IIS 6.0 性能调整
选择正确的高性能硬件
选择能够满足预期Web负载(包括平均负载、峰值负载、容量、成长规划以及响应时间)的正确硬件十分重要。硬件瓶颈会让软件调整带来的性能提升大打折扣。在选择硬件时,请考虑表7所列出的各个因素:

表7. 为IIS 6.0选择硬件时的考虑事项

因素
考虑事项

处理器的数目、类型和速度
· 脚本(ASP或 ASP.NET)以及加密(SSL)都是十分耗用CPU资源的工作。此外,并发的客户端负载也会加重CPU的负担。在为系统选择处理器的速度和数量时,应该考虑到这些因素。

· 大容量的 L2 处理器缓存能够提供更出色的性能。

· 两颗CPU的综合性能通常无法与单颗具有双倍速度(相对于上述两颗速度较慢的 CPU 而言)的 CPU 相媲美。

物理内存(RAM)的数量
在添加更多的站点、内容脚本(特别是ASP.NET脚本)和应用程序池(或者工作进程)时,添加内存有助于提升系统的性能。

网络适配器的数目、类型和速度
网络适配器不应该成为瓶颈。型号较新的网卡可以卸载某些服务器功能,从而提升性能。更多细节信息,请参阅前文中的网络性能调整。

磁盘控制器的类型,物理磁盘的数量和容量
· IIS 能够将经常访问的文件缓存在内存中。但是,不经常访问的文件(“冷门”文件)必须在需要时从磁盘上读取,需要经常访问“冷门”文件的大型站点需要拥有良好的磁盘性能(连接到大量磁盘的RAID控制器)。

· IIS 日志文件的大小以及预计的增长情况都应该纳入考虑范围之内。

IIS可能依靠的其他服务器
· 速度缓慢的SQL Server 可能会制约连接到其上的IIS服务器的响应率,即使IIS 服务器拥有优秀的硬件组件。

· 如果将IIS服务器和SQL Server(或者任何其他CPU密集型组件)放在同一台服务器上,会限制每个组件能够使用的资源,并且影响系统的整体性能。


 

操作系统最佳实践
· 如果可能,以全新方式安装操作系统。升级可能会留下过期、不想要或者不是最优的注册表设置,以及先前安装的服务和应用程序,如果这些服务和应用程序会自动启动,那么将占用宝贵的资源。如果安装了另一个操作系统并且需要保留该系统,那么应该在不同的分区安装新的操作系统,否则新安装的系统将覆盖Program Files\Common Files下的设置。

· 为了降低磁盘访问冲突,应该将系统分页文件、操作系统、Web数据、ASP模板缓存以及IIS日志尽可能放在不同的物理磁盘上。

· 避免安装不必要的服务和应用程序。

IIS 6.0 优化
IIS 6.0 应用了新的进程模型。内核模式的HTTP侦听程序(Http.sys)接收并发送HTTP请求(甚至可以使用它的响应缓存来满足请求)。工作进程注册URL子空间,Http.sys将请求发送到相应的进程(如果使用应用程序池,则发送到进程集合)。

图 4 展示了IIS 5.0和IIS 6.0进程模型之间的差异。IIS 5.0使用WinSock在端口80接受连接。请求由 inetinfo 进程负责接收,然后或者在进程内执行请求,或者将它交给dllhost 进程在进程外进行处理(为了达到隔离的目的)。响应则由 inetinfo 进程发送回去。

 



图 4  IIS 5.0 和 IIS 6.0 的进程模型

IIS 6.0 进程依赖于内核模式的Web驱动程序Http.sys。在新的模型中,Http.sys负责管理连接和处理请求。请求可能通过Http.sys缓存得到满足,也可能被交给一个工作进程以便得到进一步处理(见图5)。可以配置多个工作进程,从而以较低开销实现了隔离。

Http.sys包括了一个响应缓存。当请求与响应缓存中的某个条目相匹配的时候,Http.sys直接从内核模式中发送缓存响应。图5展示了请求通过Http.sys得到处理的情况(请求也可能向上交给某个工作进程进行处理)。



图 5  IIS 6.0中的请求处理

由于Web服务器既包括内核模式的组件,也包括用户模式的组件,必须对二者同时进行调整才能获得最佳性能。因此,针对特定负载的IIS 6.0调整工作需要对如下内容进行配置:

· Http.sys(内核模式驱动程序)以及相关的内核模式缓存。

· 工作进程和用户模式IIS,包括应用程序池配置。

此外,我们还将在后文中讨论会对性能造成影响的其他参数。

内核模式的调整
与性能有关的Http.sys设置可以划分为两类:缓存管理以及连接和请求管理。所有的注册表设置都保存在以下条目中:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Http\Parameters

如果HTTP服务正在运行,必须首先停止服务,然后重新启动计算机,以便让设置生效。

缓存管理设置
Http.sys具有的优点之一便是内核模式缓存。如果响应位于内核缓存中,那么可能可以完全通过内核模式来满足某个HTTP请求,这显然可以极大降低CPU处理请求的开销。但是,IIS 6.0的内核模式缓存是一种基于物理内存的缓存,每个条目都需要占用一定的内存空间。

缓存中的条目只有在被使用的时候才能提供益处。但是,条目在任何时候都会占用物理内存,不论它是否被使用。所以,需要对缓存某个项目带来的益处(能够直接从缓存中满足请求)以及它在整个生命期中的开销(需要占用物理内存)进行评估,并且考虑可用资源(CPU、物理内存)和工作负载的情况。Http.sys 试图仅在缓存中保存有用(经常被访问)的项目,但是,如果针对特定工作负载来调整Http.sys缓存,Web服务器的性能还可以获得一定程度的提高。

以下是一些有用的Http.sys内核模式缓存设置:

· UriEnableCache. 默认值:1。设为非零值可以启用内核模式响应和分段缓存。对于大多数工作负载,缓存都应该保持启用。如果希望获得超低响应和较低的缓存利用率,那么请考虑禁用缓存。

· UriMaxCacheMegabyteCount. 默认值:0。设为非零值可以指定内核缓存可以使用的最大内存数量。默认值为0,允许系统自动调节缓存能够使用的内存数量。注意:只能设置可以使用的最大内存数量,而且系统可能不允许缓存增长到指定的大小。

· UriMaxUriBytes. 默认值:262144 字节(256 KB)。本参数设定了内核缓存中每个条目的最大长度。大于这个长度的响应或分段都不会被缓存。如果有足够的资金,可以考虑增加此参数的值。如果资金有限,而且大型的条目会挤掉较小的条目,那么可以将本参数设为更小的值。

· UriScavengerPeriod. 默认值:120秒。一个“清道夫”程序会定期扫描Http.sys缓存,在两次扫描期间没有被访问过的条目将被删除。可以将扫描周期设置为一个较高的值,以减少扫描次数。但是,如果访问频率低的老条目仍然保留在缓存中,缓存占用的内存将不断增加。如果将此期限设置得过低,扫描频率会过于频繁,而且可能导致缓存的过度清洗和扰动。

请求和连接管理设置
此外,Http.sys管理入站HTTP/HTTPS 连接,并且是在这些连接上处理请求的第一个层。它使用内部数据结构保存有关连接和请求的信息。虽然这样的数据结构可以按需创建(或释放),但如果在look-aside里表中保存部分数据结构留作备用,则可以实现更高的 CPU 效率。保存这样的储备有助于Http.sys利用更少的CPU资源来处理负载波动。注意:负载波动不一定由外部的负载波动而引起。一些旨在改善批处理或者中断调解的内部优化措施也可能导致负载波动和起伏。

储备有助于减少CPU的使用率和缩短延迟时间,同时能够增加Web服务器的处理能力,但是也会增加内存的使用率。在调整Http.sys的请求和连接管理行为的时候,需要牢记的因素便是:可用的服务器资源,性能目标以及工作负载的特性。您可以使用以下请求和连接管理设置:

· MaxConnections。 本设置用来控制Http.sys所允许的并发连接的数量。每一个连接都会耗用非分页池(一种宝贵和有限的资源)。默认值的设置相当保守,以限制连接占用的非分页池数量。对于配备了充足内存的专用Web服务器,如果预计会产生大量的并发连接,可以将此值设置得更高一些。此值设置得越大,占用的非分页池就越多,所以要务必小心,应该使用一个与系统配置相适应的正确数值。

· IdleConnectionsHighMark、IdleConnectionsLowMark和IdleListTrimmerPeriod. 这些值用来控制对非并行使用的连接结构的处理:在某个时间必须提供多少可用的连接(用于处理连接负载的波动)、释放列表的上下界限、以及连接结构剪切和补充的频率等。

· RequestBufferLookasideDepth 和 InternalRequestLookasideDepth 这些值控制与缓冲区管理有关的数据结构的处理工作,以及应该完成多少储备以应付负载波动情况。

用户模式设置
IIS 注册表设置
以下注册表设置可以在下面的条目下找到:

HKLM\System\CurrentControlSet\Services\Inetinfo\Parameters\

· MaxCachedFileSize(REG_DWORD),以字节为单位。决定了能够被缓存的文件大小(默认为256 KB)。实际值根据数据表中最大文件的数量和大小以及可用的RAM数量而定。对频繁访问的大型文件进行缓存可以降低CPU使用率,减少磁盘访问以及相关的延迟时间。

· MemCacheSize(REG_DWORD),以MB为单位。将IIS用户模式缓存限制为指定的大小(默认设置为根据可用内存的数量由IIS调整缓存的大小)。根据“热门”文件集合(频繁访问文件的集合)的大小以及RAM数量或者IIS进程地址空间(正常情况下应该在2GB以下),需要认真选择本参数的值。

· DisableMemoryCache(REG_DWORD)。如果设置为1(默认为0),则禁用用户模式的IIS缓存。在缓存命中率非常小的时候,可以完全禁用缓存,以避免与缓存代码路径有关的开销。

· MaxPoolThreads(REG_DWORD)。设置每个处理器能创建的池线程的最大数量(默认为4,范围不限。)每一个池线程都观察网络请求,然后处理它们。MaxPoolThreads 计数没有包括当前处理ISAPI应用程序的线程。如果CPU的平均使用率没有处于最佳状态,应该增加本参数的值,因为现有的所有线程都为繁忙状态,没有用于处理新请求的可用线程。

· PoolThreadLimit(REG_DWORD)。设置系统能创建的池线程的最大数量(默认值为处理器数量的4倍,范围不限)。PoolThreadLimit 必须大于或等于MaxPoolThreads。正常情况下,PoolThreadLimit = MaxPoolThreads ´ 处理器数量。仅仅设置其中的一个参数是不够的。如果同时指定了MaxPoolThreads 和PoolThreadLimit参数,则可以施加更严格的限制。

· ObjectCacheTTL(REG_DWORD),以秒为单位。控制没有被访问过的对象在IIS用户模式缓存中停留的时间长度(默认值为30秒,如设置为0xFFFFFFFF则禁用对象缓存清道夫线程)。如果系统配备了足够的内存,而且提交的内容不经常变化,那么可以增加本参数的值。如果系统内存不足而且用户模式缓存的大小在不断增长,则应该降低本参数。请参阅本节下面的 ActivityPeriod 部分。

· ActivityPeriod(REG_DWORD),以秒为单位。只有当文件在活动期限(默认为10秒钟,如果设为0则禁用本选项)内被重复命中,才允许缓存文件。本参数会降低由于缓存不经常访问的文件而引起的缓存开销,如果缓存内容变化不大,而且没有足够的可用内存,那么可以增加活动期限的值;或者,如果缓存上存在大量请求负载,可以降低活动期限的值。

· DataSetCacheSize(REG_DWORD)默认值为50。设置配置数据库数据集缓存中虚拟目录条目的最大数量。如果已经安装的虚拟目录的数量超过了默认值,可以增加本参数的值。在提交静态内容的时候,一个容量不足的数据集缓存会增加延迟时间(更低的吞吐量和更低的CPU使用率)。

IIS Metabase
以下设置可以在 W3SVC/ 下找到。

· AspMaxDiskTemplateCacheFiles。启用ASP脚本模板的磁盘缓存。ASP模板的编译是一件非常耗费处理器资源的工作。内存大小限制了可以缓存在内存中的模板的数量。从磁盘上的模板缓存中取回编译后的模板所需的开销比编译ASP内存缓存中没有的模板要小。请参见下文中的 AspScriptEngineCacheMax 一节。

· AspDiskTemplateCacheDirectory。如果可能,可以将其设置为不频繁使用的磁盘(例如,没有和操作系统、分页文件、IIS日志或者其他频繁访问的内容共享的磁盘)。默认目录是 “%windir%\system32\inetsrv\Template Disk cache\ASP Compiled Templates”。

· AspScriptEngineCacheMax。将其设置为内存容量所允许的最大的脚本引擎数(默认为125)。

· AspScriptFileCacheSize。设置为内存容量所允许的最大的ASP模板数量(默认250)。请参阅前文中的AspMaxDiskTemplateCacheFiles一节。

· AspExecuteInMTA。如果在交付某些ASP内容时希望对出现的错误或故障进行检测,请将本参数设置为1(启用)。例如,如果需要托管多个站点,而且每个站点都运行在它自己的工作进程之下,那么便可以启用本参数。错误一般可以在事件查看器中的COM+部分中看到。本设置启用了ASP中的多线程单元模型(默认值为0,表示禁用)。

· AspProcessorThreadMax。如果当前设置(默认为25)不足以满足负载的需求(可能会导致某些请求出现错误),可以增加本参数的值。

· CentralBinaryLoggingEnabled。通过将本参数设置为TRUE,可以启用集中的二进制日志记录。二进制IIS日志记录可以减少对CPU的使用,降低占用的磁盘空间以及减少磁盘I/O操作。集中的二进制日志可以被导向一个二进制文件,而无论托管站点的数量如何。分析二进制格式的日志需要一个后处理工具。

IIS 工作进程选项(IIS Admin UI、应用程序池属性)
在没有管理员干预、服务重启或者计算机重启的情况下,IIS管理界面上的IIS工作进程回收选项为发生的紧急故障或事件提供了有效的解决办法。这样的情况包括内存泄漏,泄漏会增加内存负担,或者导致工作进程进入不响应或空闲状态。在正常情况下,可能不需要启用回收选项,所以可以关闭它(或者对系统进行配置,以很低的频率执行回收工作)。在下面的章节中,黑体字名称是per-app-pool(应用程序池)变量。在使用脚本设置这些变量的时候,可以使用路径“ /LM/W3SVC/AppPools/n”,在这里n 代表应用程序池索引。

有三个选项,如下表所示:

· 回收选项。可以在“回收”选项卡中找到。

· 性能选项。 可以在“性能”选项卡中找到。

· 工作进程健康监视选项。可以在“健康”选项卡中找到。

表 8. 回收选项

参数
描述

PeriodicRestartRequests,DWORD,选项默认为禁用,默认值为35000
按照时间定期回收

PeriodicRestartRequests,DWORD,选项默认为禁用,默认值为35000
根据请求的(累计)数量定期回收

PeriodicRestartSchedule, MULTISZ,默认为禁用,默认为空字符串值
在指定的时间进行回收

·  PeriodicRestartMemory, DWORD,默认值为512 MB

· PeriodicRestartPrivateMemory, DWORD,默认值为192 MB

 
如果达到了以下两个条件之一,基于内存的回收(默认为禁用)将允许回收工作进程:

· 虚拟内存的最大容量

· 已使用内存的最大容量

如果面临不断增长的内存容量压力,可以其中一个参数或全部参数,基于严格的内存容量标准,频繁回收工作进程,以缓解内存压力。


 

表 9. 性能选项

参数
描述

IdleTimeout,DWORD,以分钟为单位,默认值为20
在进程的空闲时间超过指定的时间时,关闭工作进程。这样可以节省有限的内存资源,但是如果CPU负载繁重,需要频繁启动新的工作进程,则不建议采取这种做法,因为创建进程会带来一定的开销。

AppPoolQueueLength,DWORD,默认值为2000
限制每个应用程序池(App-Pool)的内核请求队列的长度。请求会消耗分页池,在对分页池具有大量需求的情况下,应该降低本参数的值。如果超过指定的长度,会导致服务器拒绝请求,并产生编号为503的非自定义错误。

CpuAccounting,BOOLEAN,默认为禁用(0),启用为1
监视CPU的使用情况。您可以按照百分比设置CPU的最大使用率(CpuLimit,DWORD,默认值为0)和监视工作的刷新周期(CpuResetInterval,DWORD,默认值为0,以分钟计)。如果达到了CPU的使用率限制,或者不采取任何操作(但是会在事件日志中写入一个事件),或者关闭工作进程(CPUAction,DWORD,默认值为0,表示“不采取任何操作”;最大值为1,表示“关闭工作进程”)。

MaxProcesses,默认:使用1个工作进程处理所有请求
可以在操作的Web Garden(Web园)模式中控制工作进程的总数量。在Web Garden模式中,几个工作进程负责处理单个应用程序池下的请求负载。没有通过不同的应用程序池为Web站点预先分配任何工作进程。在某些情况下,一个工作进程无法满足负载的处理需要(可以通过糟糕的CPU使用率和漫长的响应时间看出这一点),增加工作进程的数量则有助于改善系统的吞吐量和CPU使用率。在托管了多个站点的情况下,可以考虑采用Web Garden模式。此外,在其中一个进程突然崩溃的情况下,采用多个工作进程还提供了更多可靠性,而且几乎不会出现所有服务均中断的情况。与预先分配应用程序池相比,Web Garden模式更容易设置和控制。


 

表10. 健康选项

参数
描述

PingingEnabled,BOOLEAN, 默认值为1

PingInterval,DWORD,默认值为30秒
以固定时间间隔(PingInterval)Ping 工作进程(PingingEnabled)。如果没有响应,则认为工作进程发生错误,IIS将试图终止进程并产生一个新的进程。

RapidFailProtection,BOOLEAN,默认

RapidFailProtectionMaxCrashes, DWORD,默认为5个故障

RapidFailProtectionInterval, DWORD,默认为5分钟
设置在给定的时间段内(RapidFailProtectionInterval)允许产生的最大故障数量(RapidFailProtectionMaxCrashes),对不断快速产生故障的情况加以控制(RapidFailProtection)。如果到达了指定了故障率,应用程序池将被禁用,并且在事件日志中写入相关信息。

StartupTimeLimit,DWORD,默认为90秒
控制工作进程的启动时间,超过此时间,则认为其发生了故障。

ShutdownTimeLimit,DWORD,默认为90秒
控制工作进程的关闭时间,超过了此时间,则认为其处于不响应状态。


 

安全套接字层的调整参数
安全套接字层(Secure Sockets Layer,SSL)的使用会加重CPU的负担。SSL中最为耗费资源的部分为建立会话所需的开销(包括一次完整的握手),然后是重新连接的开销和加密/解密的开销。为了获得更好的SSL性能,请执行如下操作:

· 启用SSL会话的“保持活动”(keep-alive)特性。这样可以消除建立会话所需的开销。

· 如果可能,重新使用会话(特别是对于那些没有“保持活动”的流量)。

· 注意:密钥越长,安全性就越高,但是需要的CPU时间就越多。

· 注意:并不是所有的页面组件都需要加密。但是,混合的纯文本HTTP和HTTPS可能会导致客户端浏览器弹出一个警告,告知并不是所有的页面内容都得到了保护。

ISAPI
对于ISAPI,没有任何具体的调整参数。如果编写一个私有的ISAPI扩展,请确保代码在执行和资源使用方面具有高效率。请参阅后文中的 影响IIS性能的其他问题。

托管代码调整参数
· 确信已经预先编译了所有的脚本。可以在每个目录中调用一个.NET脚本来完成这项工作。在编译完成之后,需要复位IIS。在修改了Machine.config、 Web.config或任何.aspx脚本之后需要重新编译。

· 如果不需要会话状态信息,请确信在每个页面中关闭了此项目。

· 当用户在隔离模式(每个站点一个应用程序池)下运行包含ASP.NET脚本的多个主机的时候,应该监视内存使用情况。请根据预计将要并发运行的应用程序池的数量,为IIS服务器配备足够的内存。考虑在存在多个隔离进程的地方使用多个应用程序域(app-domains)。

影响IIS性能的其他问题
· 安装没有缓存意识的过滤器。安装没有HTTP缓存意识的过滤器会导致IIS禁用全部缓存,从而造成性能急剧下降。老的ISAPI过滤器(在IIS 6.0之前编写的过滤器)可能会存在这个问题。可以使用HTTP缓存的过滤器在配置数据库中被标记为“具有缓存意识”的过滤器。

· CGI 请求。出于性能的考虑,我们不建议使用CGI应用程序处理请求。由于需要频繁创建(和删除)CGI进程,会产生大量的系统开销。更好的替代办法是使用ISAPI程序和ASP(或ASP.NET)脚本。这些方式都可以使用隔离。

NTFS 文件系统设置
HKLM\System\CurrentControlSet\Control\FileSystem\ 下的 NtfsDisableLastAccessUpdate (REG_DWORD)1。

通过禁止更新最后一次访问的文件或目录的日期和时间戳记,这个针对整个系统的开关参数会降低磁盘I/O负载和缩短延迟。默认情况下本键不存在,因此需要额外添加。如果操作包含数千个目录的大型数据集(或者大量主机),禁用更新的效果十分明显。如果只需要保留信息Web供Web管理使用,我们建议用户使用IIS日志代替它。

警告:某些应用程序(例如增量备份工具)需要使用这些更新信息,如果没有这些信息,它们将无法正常工作。

Tcpip.sys 的IIS性能设置
请参阅前文中的 网络性能调整。

IIS的网络适配器调整和绑定
· 确信所有网络适配器设置都为最佳状态。

· 将每一块网络适配器分别绑定到一颗CPU(具体方法取决于网络适配器的数量、CPU的数量以及每块网络适配器上的端口数量)。

请参阅前文中的网络性能调整。

文件服务器性能调整
一般考虑事项
为了满足预期的文件服务器负载,选择正确的硬件十分重要,在选择硬件时需要考虑平均负载、峰值负载、容量、成长规划以及响应时间。硬件瓶颈会使软件调整获得的性能提升大打折扣。

在选择硬件和设置操作系统时,需要考虑以下问题。

表11. 选择正确的硬件以提升性能

问题
建议

处理器的数量、类型和速度
· 大容量的 L2 处理器缓存能够提供更出色的性能。

· 两颗CPU的综合性能无法与单颗具有双倍速度(相对于上述两颗速度较慢的 CPU 而言)的 CPU 相媲美。

内存(RAM)的数量
如果计算机内存不足,而且需要立即添加更多内存,Windows Server 2003 使用硬盘空间模拟系统内存。这些内存被称作虚拟内存,也经常被称为分页文件。

· 尽力避免将分页文件与操作系统文件放在同一个驱动器上。

· 避免将分页文件放在容错驱动器上,例如镜像卷或者RAID-5卷。分页文件不需要容错,由于需要将数据写入到多个位置,某些容错系统的写入速度会因此变得非常慢。

· 不要将多个分页文件放在同一个物理硬盘驱动器的不同分区上。

网络适配器的数量、类型和速度
· 网络适配器不应该成为系统瓶颈。型号较新的网络适配器可以卸载某些服务器功能,从而提高系统性能。

· 确信所有网络适配器设置都是最优的。

· 将每块网络适配器分别绑定到一颗CPU(具体方法取决于网络适配器的数量、CPU的数量以及每块网络适配器上的端口数目)。

· 更多细节信息,请参阅前文中的网络性能调整。

磁盘控制器的类型、物理磁盘的数量以及它们的整体容量
· 文件服务器将频繁接收访问的文件放入缓存。但是,必须从磁盘上读取访问不频繁的文件。为了处理针对大批文件的大量请求所带来的庞大数据量,磁盘性能必须非常出色(连接大量磁盘的RAID控制器)。

· 将系统分页文件、操作系统以及数据尽可能放在不同的物理磁盘上。

· 确信分配单元大小与卷的大小相匹配。


 

服务器消息块服务器模型
服务器消息块(Server Message Block,SMB)模型包括两个实体:客户端和服务器。

客户端通过重定向程序(Rdbss.sys和SMB 小型重定向程序Mrxsmb.sys)为服务器上所保存的文件接收请求。它通过TCP/IP,使用SMB协议发送请求。

服务器通过TCP/IP协议,从客户端接收多个请求,然后将请求发送到本地文件系统(Ntfs.sys),由它负责访问存储堆栈。



图 6  客户机-服务器通信的SMB模型

文件服务器的常规调整参数
下列注册表调整参数会影响文件服务器的性能。

PagedPoolSize
HKLM\System\CurrentControlSet\Control\SessionManager\MemoryManagement\ (REG_DWORD)

文件缓存空间和分页池空间共享系统虚拟地址中的一个公共区域。限制分页池可以得到更大的系统缓存,从而能够缓存更多的内容,实现更快的文件服务性能。

NtfsDisable8dot3NameCreation
HKLM\System\CurrentControlSet\Control\FileSystem\ (REG_DWORD)

默认值为 0。该参数用于确定 NTFS 是否为长文件名以及包含来自扩展字符集的文件名生成符合 8.3(DOS)命名协定的短文件名。如果该注册表项的值为 0,那么文件潜在可以有两个名称:用户指定的名称和 NTFS 生成的短名称。若用户指定的名称符合 8.3 命名协定,NTFS 则不再生成短名称。

修改该值不会更改文件的内容,但可以避免对文件创建短名称属性,并能更改 NTFS 显示和管理文件的方式。

Disablelastaccess
HKLM\System\CurrentControlSet\Control\FileSystem\. (REG_DWORD)

默认不创建该注册表项。

如果您有一个 NTFS 卷包含大量文件夹或文件,而且有一个程序依次对它们进行访问,那么用于生成Last Access Time(最后一次访问时间)更新的 I/O 带宽会占用 I/O 总带宽的很大比例。如要提高对文件夹或文件的访问速度,您可以将 disablelastaccess 设置为禁止更新 Last Access Time(最后一次访问时间)。在您使用了该命令并重新启动计算机之后,Last Access Time 将不再得到更新。如果您创建一个新文件,Last Access Time 则与 File Creation Time(文件创建时间)保持一致。

NumTcbTablePartitions
HKLM\system\CurrentControlSet\Services\Tcpip\Parameters\. (REG_DWORD)

默认创建该键。

该参数控制 TCB 表的分区数量。可以对 TCB 表进行分区,减少对其的争用,从而提高多处理器系统的可伸缩性。

TcpAckFrequency
注意:TcpAckFrequency 只能应用于 Windows Server 2003。 TcpAckFrequency 的推荐设置介于 TcpWindowSize 的值的三分之一和二分之一之间。

对于千兆网卡:

HKLM\system\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

对每个千兆网络适配器添加:

TcpAckFrequency (REG_DWORD) = 13(十进制)

注册表默认不包含该项。如果仅确认数据而不是针对所有的控制数据包,那么每 13 个数据包仅确认一次,而不是默认的两次。这样,在从客户端向服务器执行大量写入(上载)操作时,有助于降低网络堆栈(Network Stack)的数据包处理开销。

对于 FastEthernet 网卡:

HKLM\system\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

对每个 FastEthernet 网络适配器添加:

TcpAckFrequency (REG_DWORD) = 5(十进制)

注册表默认不包含该项。如果仅确认数据而不是针对所有的控制数据包,那么每 5 个数据包仅确认一次,而不是默认的两次。这样,在从客户端向服务器执行大量写入(上载)操作时,有助于降低网络堆栈(Network Stack)的数据包处理开销。

中断关联
中断关联指在多处理器服务器上将中断操作从一个特定设备绑定到特定的处理器上。这将在所指定的处理器上强制运行 ISR 和 DPC 例行程序。由于网络连接和文件服务器话路均位于相同上网络适配器上,因此将中断操作从网络适配器绑定到处理器,可以在一组指定的处理器上处理传入的数据包(SMB 请求、数据),从而提高局部性和可伸缩性。您无法在单处理器计算机上配置中断关联。

中断关联筛选器(Interrupt-Affinity Filter,IntFiltr)工具允许您更改系统中 CPU 的中断关联。

使用该实用程序,您可以将任何设备的中断操作指向一个特定的处理器或一组处理器(避免总是对系统中所有的 CPU 发送中断请求)。注意:不同的设备可以有不同的中断关联设置。该实用程序可应用于任何运行 Windows Server 2003 的服务器,无论采用何种处理器或中断控制器。

客户端计算机的常规调整参数
DormantFileLimit 
HKLM\system\CurrentControlSet\Services\lanmanworkstation\parameters\ (REG_DWORD)

默认不创建该注册表键。(仅针对 Windows XP 客户端计算机。)

指定在应用程序关闭文件后可以通过共享打开的最大文件数。

ScavengerTimeLimit
HKLM\system\CurrentControlSet\Services\lanmanworkstation\parameters\ (REG_DWORD)

Windows XP client computers only.

重定向器在开始清除休眠文件句柄(当前无法被任何应用程序所用的已缓存的文件句柄)之前所等待的时间(秒)。

DisableByteRangeLockingOnReadOnlyFiles
HKLM\System\CurrentControlSet\Services\LanmanWorkStation\Parameters\ (REG_DWORD)

仅针对 Windows XP 客户端计算机。

一些分布式应用程序会在对各个客户端进行同步时锁定某个只读文件的部分内容,它们要求关闭所有只读文件的文件句柄缓存和折叠(collapsing)功能。如果不在系统上运行这类应用程序,并且在客户端计算机上启用了折叠功能,那么就可以设定该参数。

TcpAckFrequency
注意:TcpAckFrequency 只能应用于 Windows XP 客户端。TcpAckFrequency的推荐设置介于 TcpWindowSize 的值的三分之一和二分之一之间。

对于Gigabit网卡:

HKLM\system\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

对Gigabit适配器添加:

TcpAckFrequency (REG_DWORD) = 13(十进制)

注册表默认不包含该项。

如果仅确认数据而不是针对所有的控制数据包,那么每 13 个数据包仅确认一次,而不是默认的两次。这样,在从客户端向服务器执行大量写入(上载)操作时,有助于降低网络堆栈(Network Stack)的数据包处理开销。

对于 FastEthernet 网卡:

HKLM\system\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

对每个 FastEthernet 适配器添加:

TcpAckFrequency (REG_DWORD) = 5(十进制)

注册表默认不包含该项。如果仅确认数据而不是针对所有的控制数据包,那么每 5 个数据包仅确认一次,而不是默认的两次。这样,在从客户端向服务器执行大量写入(上载)操作时,有助于降低网络堆栈(Network Stack)的数据包处理开销 。

Active Directory的性能调整
大型 Active Directory® 环境只有少数几个特殊的调整要求。

对 Boot.ini 文件使用 /3GB 开关参数
在服务器计算机上,大容量内存有助于减少磁盘 I/O 活动。使用 /3GB 开关参数,可以为 x86 服务器提供更多用户模式虚拟空间,并且改善Active Directory 的缓存。

Windows 2000 包含两种设置:

· 运用 /3GB 开关参数,主 Active Directory 缓存的最大容量可达1024MB。

· 不运用/3GB开关参数,主 Active Directory 缓存的容量仅被限制为512MB。

对于 Windows Server 2003,Active Directory 缓存可更自由地增长,但是大小受虚拟地址空间的限制。

关闭签名和密封功能
运行附带Service Pack 1(SP1)的 Windows XP 或更高版本的客户端计算机以及运行 Windows Server 2003 的服务器具备签名和密封功能以实现更高的安全性,而且这些功能在默认情况下为启用状态。默认状态下,Windows 2000 客户端并未启用签名和密封功能,但是安装了Service Pack 3(SP3)的 Windows 2000 提供了一个选项来启用该功能。具有安全网络的生产环境不需要启用该设置。Windows Server 2003 操作系统家族提供了一个用于禁用签名和密封功能的选项。您可以在此找到该设置:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ldap\ ldapclientintegrity = REG_DWORD 0x0

针对 Web 工作负载执行基准测试(WebBench)
考虑使用以下原则对 Web 工作负载执行基准测试

· 将 IIS 服务器以及其它相关计算机从企业网络流量中隔离出来。

· 允许通过充足的预热时间获得稳定的状态。

· 同步客户端时钟和 IIS 服务器时钟以确保正确测试基于时间的请求。

· 为了实现最佳性能,在 IIS 的管理用户界面(Admin UI)中,关闭所有回收、性能和电源选项,除非您遇到紧急情况而这些选项能帮上忙。更多信息,新参见本文前面的“IIS 6.0性能调整”一节。

· 如果使用 SSL,则选择一个合理且一致的键容量。

WebBench 4.1 提供了测量 Web 服务器性能的方法。WebBench 使用客户端计算机模拟 Web 浏览器。但是,不同于真正的浏览器,客户端不显示服务器通过响应其请求所发送的文件。相反,当客户端接收到服务器的响应时,随即记录与该响应相关联的信息,接着马上向服务器发送另一个请求。

下面三个表格列出了高端和低端服务器设置以及客户端计算机调整参数。

表 12. 高端服务器设置

类型
设置

IIS 设置
·  注册表(位于:HKLM\System\CurrentControlSet/Services\Inetinfo\Parameters\)

· MaxCachedFileSize (REG_DWORD) 1048576

· IIS Metabase(位于:W3SVC/)

· 通过设定 CentralBinaryLoggingEnabled = TRUE,启用集中记录的二进制日志文件

· SSL 调整参数:键容量为 1024 字节。如要进行富有挑战性的基准测试,可对所有服务器使用相同的键容量。

Http.sys 设置
· 注册表(位于:HKLM\System\CurrentControlSet/Services\HTTP\Parameters\)

UriMaxUriBytes (REG_DWORD) 1048576 (最大的文件)。

NTFS 文件系统设置
· 注册表(位于:HKLM\System\CurrentControlSet\Control\FileSystem\)

NtfsDisableLastAccessUpdate (REG_DWORD) 1

针对 IIS 的 TCPIP.SYS 性能设置
· 注册表(位于:HKLM\System\CurrentControlSet\Services\tcpip\parameters\)

MaxHashTableSize (REG_DWORD) 0xffff

请参见本文前面的“网络性能调整”一节。

针对 IIS 的网络适配器调整与绑定
· 每个网络适配器均绑定一颗 CPU。

请参见本文前面的“网络性能调整”一节。


 

低端服务器设置的特点如下:

· 单处理器、单网络适配器。

· 有限的物理内存——至少 256 MB;通常为 512 MB 的 RAM。

· 需执行分页操作。

· 对于大批 ASP 文件和严重耗费内存的动态内容,建议不要使用该服务器设置。

表 13. 低端服务器设置

类型
设置

IIS 设置
· 注册表(位于:HKLM\System\CurrentControlSet/Services\Inetinfo\Parameters\)

MaxCachedFileSize (REG_DWORD) 1048576

MemCacheSize (REG_DWORD) 10

· IIS Metabase(位于:W3SVC/)

通过设定 CentralBinaryLoggingEnabled = TRUE,使用集中保存的二进制日志文件

Http.sys 设置
· 注册表(位于:HKLM\System\CurrentControlSet\Services\http\parameters\)

UriMaxUriBytes (REG_DWORD) 1048576

RequestBufferLookasideDepth (REG_DWORD) 256

InternalRequestLookasideDepth (REG_DWORD) 256

LargeMemMegabytes (REG_DWORD) 150

NTFS 文件系统设置
· 注册表(位于:HKLM\System\CurrentControlSet\Control\FileSystem\)

NtfsDisableLastAccessUpdate (REG_DWORD) 1


 

表 14. 客户端计算机调整参数

类型
设置

我的计算机性能设置
· 针对程序优化处理器调度

· 针对程序优化内存应用

针对 IIS 的 TCPIP.SYS 性能设置
· 注册表(位于:HKLM\System\CurrentControlSet\Services\tcpip\parameters\)

MaxUserPort (REG_DWORD) 0xfffe

MaxHashTableSize (REG_DWORD) 0xffff

TcpWindowSize (REG_DWORD) 65536(在配备 100 BaseT Ethernet 网络适配器的客户端上修改注册表)

请参见本文前面的“网络性能调整”一节。


 

针对文件服务器工作负载执行基准测试(NetBench)
NetBench 7.02 是 eTesting Labs 的基准测试程序,允许您测量文件服务器处理客户端网络文件请求的性能。NetBench 可以为您提供服务器 I/O 吞吐量的总得分、平均响应时间以及各台客户端计算机的单独得分。您可以使用这些测试分数衡量、分析和预测服务器处理客户端请求的能力。在各项测试间通常要对数据卷进行格式化,以便清空工作区,确保以全新状态开始测试工作。如要提高性能和伸缩性,建议把客户端数据分散在多个数据卷上。

Windows Server 2003面向 NetBench 的注册表调整参数


设置

HKLM\System\CurrentControlSet\Control\SessionManager\
MemoryManagement\
PagedPoolSize = 192000000(十进制)(默认为0)

HKLM\System\CurrentControlSet\Control\FileSystem\
NtfsDisable8dot3NameCreation = 1(默认为0)

添加:Disablelastaccess = 1

默认不创建该注册表键。

HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\
添加:NumTcbTablePartitions = 8

默认不创建该注册表键。

HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\
Interfaces\
对每个Gigabit网络适配器添加:TcpAckFrequency (REG_DWORD) = 13(十进制) 。

默认不创建该注册表键。对于 FastEthernet 适配器,将该参数为 5。


 

客户端计算机针对 NetBench 的注册表调整参数


设置

HKLM\System\CurrentControlSet\
Services\LanmanWorkStation\
Parameters\
DisableByteRangeLockingOnReadOnlyFiles = 1;
针对 Windows XP 客户端计算机

HKLM\system\CurrentControlSet\
Services\Tcpip\Parameters\
Interfaces\
对每个Gigabit网络适配器添加:
TcpAckFrequency = 13(十进制)。

默认为不创建该注册表键。对于 FastEthernet 适配器,将该参数设为 5。

HKLM\system\CurrentControlSet\
Services\lanmanworkstation\
parameters\
添加 DormantFileLimit = 100(十进制)。

默认不创建该注册表键;针对 Windows XP 客户端计算机。

HKLM\System\CurrentControlSet
\Services\lanmanworkstation\
parameters\
ScavengerTimeLimit = 100(十进制);针对 Windows XP 客户端计算机。


 

针对Active Directory工作负载执行基准测试(DirectoryMark)
下列调整对于执行DirectoryMark 工作负载基准测试很有帮助。最好从一台强大的客户机上执行对大型服务器的 DirectoryMark 测试。这样,操作人员可以启动大量线程,同时还能接收中央数据报告。该设置需要一块Gigabit网络适配器以及性能大致相当的客户机和服务器,同时服务器至少拥有 2 GB 的内存。

添加针对描述属性的索引(服务器)
使用架构编辑器添加一个针对描述属性的索引,后者用于DirectoryMark Addressing 和 Messaging Search Mixes。

关闭磁盘碎片自动整理程序
在服务器启动 15 分钟后,磁盘碎片自动整理程序(Auto Defragmenter)随即启动。该程序将运行一个小时,以后每12个小时重新启动一次。基准测试要求测试结果可重复,因此建议关闭磁盘碎片自动整理程序,以便避免对正在运行的基准测试造成任何可能的干扰。如果已启用磁盘碎片自动整理程序,那么可以在事件日志中查看磁盘碎片整理程序的运行情况。

下方注册表参数用于关闭磁盘碎片自动整理程序:

HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\DSA Heuristics = REG_SZ 000001

在 TCP/IP 增加 MaxUserPorts 和 TcpWindowSize
频繁使用 LDAP 绑定需要广泛运用动态端口。在服务器和客户端计算机上,需要通过 TCP 保持这些端口开启几分钟,因此需要超出实际用量的可用 MaxUserPorts 端口。

可以调整下列注册表参数:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort = REG_DWORD 0xfffe

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpWindowSize = REG_DWORD 0xffff

 

针对网络工作负载执行基准测试(Ttcp、Chariot)
针对 NTttcp 的调整
NTttcp 是一个面向 Windows 和基于 Winsock 的 ttcp 端口,用于协助测量网络驱动程序在不同网络拓扑结构和硬件设置上的性能和吞吐量。NTttcp 向用户提供一个多线程的异步性能基准测试程序,可用来测量在现有网络设置上可取得的数据传输率。

选项:

· 单一线程应该能够提供最佳吞吐量。

· 仅在出现许多个客户端时,需要多个线程。

· 发布充足的用户接收缓冲区(使用“-a”选项),减少 TCP 复制。

· 不应该发布过多的用户接收缓冲区,因为在您需要使用其它缓冲区前,首批已发布的缓冲区将返回给您。

· 最好是将每组线程绑定给一个处理器(“-m”选项中的第二个分隔参数)。

· 每个线程均创建一个连接(监听)不同端口的套接字。

表 15. 针对 NTttcp 发送器和接收器的示范语法

语法
详细说明

针对发送器的示范语法

NTttcps –m 1,0,10.1.2.3 –a 2
· 单线程

· 绑定于CPU 0

· 连接到 IP 地址为 10.1.2.3 的计算机

· 发布两个重叠的发送缓冲区

· 默认的缓冲区容量:64 KB

· 默认的缓冲量:20 KB

针对接收器的示范语法

NTttcpr –m 1,0,10.1.2.3 –a 6 –t 1000
· 单线程

· 绑定于CPU 0

· 连接到 IP 地址为 10.1.2.3 的计算机

· 发布两个重叠的发送缓冲区

· 默认的缓冲区容量:64 KB

· 默认的缓冲量:20 KB


 

网络适配器
确认您已启用了所有卸载特性。

TCP
只有带宽-延迟乘积较大时,才可以针对Gigabit Ethernet(64 KB)为 TcpWindowSize 设定高于默认值的数值。

例如,在局域网上使用 Intel MT Gigabit 网卡时,可以针对 NTttcp 保留所有网络适配器和 TCP 设置的默认值。

· Intel MT 网络适配器默认卸载 LSO 及校验和(同时针对接收和发送)。

· Intel MT 网络适配器自行管理其资源,不需要您更改任何网络适配器资源值。

· 未应用Coalesce Buffers(合并缓冲区),但默认的中断调解模式运转良好。

针对Chariot 的调整
Chariot 是 NetIQ 的一个网络工作负载生成器,通过向网络施加负载来帮助用户预测网络应用程序的性能。

Chariot 的 High_Performance_Throughput 脚本工作负载可用来模拟 NTttcp 工作负载。有关该工作负载的调整考虑事项与 NTttcp 相同。

相关链接
请访问下列资源,了解更多信息:

· Windows Server 2003网站上的性能与伸缩性资源:http://www.microsoft.com/windowsserver2003/evaluation/performance/default.mspx。

访问这些类型时,会返回以下信息:

HTTP 错误 404 - 文件或目录未找到。

原因分析:

IIS6.0取消了对某些MIME类型的支持,例如ISO,致使客户端下载出错。

解决方法:

在IIS中属性->HTTP头->MIME类型->新建。在随后的对话框中,扩展名填入.cert,MIME类型是application。

然后重启IIS。

[ 2005/03/16 22:52 | by 网络毛毛虫 ]
  有许多种原因可能导致Web站点无法正常工作,这使得系统地检查所有问题变得很困难。下面将集中分析总结导致Web站点崩溃的最常见的问题。如果可以解决这些常规问题,那么也将有能力对付出现的一些意外情况。

   磁盘已满

  导致系统无法正常运行的最可能的原因是磁盘已满。一个好的网络管理员会密切关注磁盘的使用情况,隔一定的时间,就需要将磁盘上的一些负载转存到备份存储介质中(例如磁带)。

  日志文件会很快用光所有的磁盘空间。Web服务器的日志文件、SQL*Net的日志文件、JDBC日志文件,以及应用程序服务器日志文件均与内存泄漏有同等的危害。可以采取措施将日志文件保存在与操作系统不同的文件系统中。日志文件系统空间已满时Web服务器也会被挂起,但机器自身被挂起的几率已大大减低。

   C指针错误

  用C或C++编写的程序,如Web服务器API模块,有可能导致系统的崩溃,因为只要间接引用指针(即,访问指向的内存)中出现一个错误,就会导致操作系统终止所有程序。另外,使用了糟糕的C指针的Java模拟量(analog)将访问一个空的对象引用。Java中的空引用通常不会导致立刻退出JVM,但是前提是程序员能够使用异常处理方法恰当地处理错误。在这方面,Java无需过多的关注,但使用Java对可靠性进行额外的度量则会对性能产生一些负面影响。

   内存泄漏

  C/C++程序还可能产生另一个指针问题:丢失对已分配内存的引用。当内存是在子程序中被分配时,通常会出现这种问题,其结果是程序从子程序中返回时不会释放内存。如此一来,对已分配的内存的引用就会丢失,只要操作系统还在运行中,则进程就会一直使用该内存。这样的结果是,曾占用更多的内存的程序会降低系统性能,直到机器完全停止工作,才会完全清空内存。

  解决方案之一是使用代码分析工具(如Purify)对代码进行仔细分析,以找出可能出现的泄漏问题。但这种方法无法找到由其他原因引起的库中的泄漏,因为库的源代码是不可用的。另一种方法是每隔一段时间,就清除并重启进程。Apache的Web服务器就会因这个原因创建和清除子进程。

  虽然Java本身并无指针,但总的说来,与C程序相比,Java程序使用内存的情况更加糟糕。在Java中,对象被频繁创建,而直到所有到对象的引用都消失时,垃圾回收程序才会释放内存。即使运行了垃圾回收程序,也只会将内存还给虚拟机VM,而不是还给操作系统。结果是:Java程序会用光给它们的所有堆,从不释放。由于要保存实时(Just In Time,JIT)编译器产生的代码,Java程序的大小有时可能会膨胀为最大堆的数倍之巨。

  还有一个问题,情况与此类似。从连接池分配一个数据库连接,而无法将已分配的连接还回给连接池。一些连接池有活动计时器,在维持一段时间的静止状态之后,计时器会释放掉数据库连接,但这不足以缓解糟糕的代码快速泄漏数据库连接所造成的资源浪费。

   进程缺乏文件描述符

  如果已为一台Web服务器或其他关键进程分配了文件描述符,但它却需要更多的文件描述符,则服务器或进程会被挂起或报错,直至得到了所需的文件描述符为止。文件描述符用来保持对开放文件和开放套接字的跟踪记录,开放文件和开放套接字是Web服务器很关键的组成部分,其任务是将文件复制到网络连接。默认时,大多数shell有64个文件描述符,这意味着每个从shell启动的进程可以同时打开64个文件和网络连接。大多数shell都有一个内嵌的ulimit命令可以增加文件描述符的数目。

   线程死锁

  由多线程带来的性能改善是以可靠性为代价的,主要是因为这样有可能产生线程死锁。线程死锁时,第一个线程等待第二个线程释放资源,而同时第二个线程又在等待第一个线程释放资源。我们来想像这样一种情形:在人行道上两个人迎面相遇,为了给对方让道,两人同时向一侧迈出一步,双方无法通过,又同时向另一侧迈出一步,这样还是无法通过。双方都以同样的迈步方式堵住了对方的去路。假设这种情况一直持续下去,这样就不难理解为何会发生死锁现象了。

  解决死锁没有简单的方法,这是因为使线程产生这种问题是很具体的情况,而且往往有很高的负载。大多数软件测试产生不了足够多的负载,所以不可能暴露所有的线程错误。在每一种使用线程的语言中都存在线程死锁问题。由于使用Java进行线程编程比使用C容易,所以Java程序员中使用线程的人数更多,线程死锁也就越来越普遍了。可以在Java代码中增加同步关键字的使用,这样可以减少死锁,但这样做也会影响性能。如果负载过重,数据库内部也有可能发生死锁。

  如果程序使用了永久锁,比如锁文件,而且程序结束时没有解除锁状态,则其他进程可能无法使用这种类型的锁,既不能上锁,也不能解除锁。这会进一步导致系统不能正常工作。这时必须手动地解锁。

   服务器超载

  Netscape Web服务器的每个连接都使用一个线程。Netscape Enterprise Web服务器会在线程用完后挂起,而不为已存在的连接提供任何服务。如果有一种负载分布机制可以检测到服务器没有响应,则该服务器上的负载就可以分布到其它的Web服务器上,这可能会致使这些服务器一个接一个地用光所有的线程。这样一来,整个服务器组都会被挂起。操作系统级别可能还在不断地接收新的连接,而应用程序(Web服务器)却无法为这些连接提供服务。用户可以在浏览器状态行上看到connected(已连接)的提示消息,但这以后什么也不会发生。

  解决问题的一种方法是将obj.conf参数RqThrottle的值设置为线程数目之下的某个数值,这样如果越过RqThrottle的值,就不会接收新的连接。那些不能连接的服务器将会停止工作,而连接上的服务器的响应速度则会变慢,但至少已连接的服务器不会被挂起。这时,文件描述符至少应当被设置为与线程的数目相同的数值,否则,文件描述符将成为一个瓶颈。

   数据库中的临时表不够用

  许多数据库的临时表(cursor)数目都是固定的,临时表即保留查询结果的内存区域。在临时表中的数据都被读取后,临时表便会被释放,但大量同时进行的查询可能耗尽数目固定的所有临时表。这时,其他的查询就需要列队等候,直到有临时表被释放时才能再继续运行。

  这是一个不容易被程序员发觉的问题,但会在负载测试时显露出来。但可能对于数据库管理员(DataBase Administrator,DBA)来说,这个问题十分明显。

  此外,还存在一些其他问题:设置的表空间不够用、序号限制太低,这些都会导致表溢出错误。这些问题表明了一个好的DBA对用于生产的数据库设置和性能进行定期检查的重要性。而且,大多数数据库厂商也提供了监控和建模工具以帮助解决这些问题。

  另外,还有许多因素也极有可能导致Web站点无法工作。如:相关性、子网流量超载、糟糕的设备驱动程序、硬件故障、包括错误文件的通配符、无意间锁住了关键的表。

  (山东 王鑫)


  前段时间我市教育城域网网络结构调整,分给每校一个公网IP地址(网段:211.86.85.0),用于各校网站对外信息发布,要求每校至少配备两台专用服务器。由于学校资金紧张,Web服务器只能由一台普通的教师机来承担,不能满足学校对外网站24小时开放的要求。鉴于此,笔者曾利用“486做路由器”这一技术对学校网络结构进行过改造(详见《中国电脑教育报》2004年第43期G4版《也谈“486做路由器”在校园网中的应用》)。最近,笔者发现利用“网卡绑定多IP地址”这一简单技巧,可以将网络结构更为简化。下面谈谈操作过程及遇到的问题。

  一、改造前网络结构

  改造前学校网络结构如图1所示,其中网关服务器操作系统为Windows 2000 Server,配置成网络路由器,且添加两条静态路由(图2)。

  二、改造后网络结构

  网络结构改造思路:利用Windows 2000 Server中同一块网卡可以绑定多个IP地址这一原理,将公网IP地址211.86.85.244绑定到内网卡上,用网关服务器兼做Web服务器,从而简化网络结构。设置方法:选择“网上邻居→属性→内网卡→属性→“Internet协议(TCP/IP)→高级”,在“IP设置”选项卡中单击[添加],键入公网IP地址211.86.85.244,子网掩码255.255.255.248(图3)。简化后网络结构如图4所示。

  三、修改路由表

  网络结构改变后,在校园网内任一台电脑上均能正常访问Internet,但无法访问区教委网站(211.86.85.242)。经分析可能与网关服务器的路由表有关,于是进入命令行方式,输入“Route print”并回车(图5)。通过图5中矩形框中的一行可以看出,当网关服务器接收到IP为211.86.85.240~211.86.85.247的URL请求时,网关服务器会按照这条路由规则将其发送给指定的网关10.53.84.1——也就是在校园网内寻找211.86.85.240这个网段的地址,而不能正确地路由到默认网关172.18.15.29,从而造成无法访问。弄清楚这点就好办了,只需添加一条静态路由,将其URL请求指向默认网关即可。方法是在命令提示符下输入:

  route -p add 211.86.85.242 mask 255.255.255.255 172.18.15.29

  如果要访问211.86.85.240这个网段内其他的IP地址,同样可以按上述命令添加静态路由。

  四、安全问题

  网络结构改造前,网关服务器还同时兼做文件服务器,对内网用户开放共享,在内网卡绑定公网IP后,这些共享资源有可能暴露于Internet上,由此带来一些安全隐患。因此文件服务器要用另外一台教师机承担,并且将网关服务器的无关用户删除,增加用户密码的复杂度,避免在这些细小之处给非法侵入者可乘之机。

  (山东省莱州市三山岛街道过西小学 赵杰 赵秉玉)

Apache的mod_rewrite是提供了强大URL操作的杀手级的模块,可以实现几乎所有你梦想的URL操作类型,其代价是你必须接受其复杂性,因为mod_rewrite的主要障碍就是初学者不容易理解和运用,即使是Apache专家有时也会发掘出mod_rewrite的新用途。

换句话说:对mod_rewrite,或者是打退堂鼓永不再用,或者是喜欢它并一生受用。

ReWrite可以应用在以下方面或者解决以下问题:
URL的规划
规范的URL
说明:
在有些网站服务器上,一个资源会拥有多个URL,在实际应用和发布中应该被使用的是规范的URL,其他的则是简写或者是内部使用的。无论用户在请求中使用什么形式的URL,他最终看见的都应该是规范的URL。

方案:
对所有的不规范的URL执行一个外部的HTTP重定向,以改变它在浏览器地址栏中的显示及其后继的请求。下例中的规则集用规范的/u/user替换/~user,并修正了/u/user所遗漏的后缀的斜杠。



代码:
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]


规范的主机名
说明:
...
方案:
代码:
RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]
RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]


被移动过的DocumentRoot
说明:
通常,网站服务器的DocumentRoot直接对应于URL"/",但是,它常常不是处于最高一级,而可能只是众多数据池中的一个实体。比如,在Intranet站点中,有/e/www/(WWW的主页)、/e/sww/ (Intranet的主页)等等,而DocumentRoot指向了/e/www/,则必须保证此数据池中的所有内嵌的图片和其他元素对后继请求有效。

方案:
只须重定向URL /到/e/www/即可。这个方案看起来很简单,但只是有了mod_rewrite模块的支持,它才简单,因为传统的URL Aliases机制(由mod_alias及其相关模块提供)只是作了一个前缀匹配,DocumentRoot是一个对所有URL的前缀,因而无法实现这样的重定向。而用mod_rewrite的确很简单:

代码:
RewriteEngine on
RewriteRule ^/$ /e/www/ [R]


后缀斜杠的问题
说明:
每个网管对引用目录后缀斜杠的问题都有一本苦经,如果遗漏了,服务器会产生一个错误,因为如果请求是/~quux/foo而不是/~quux/foo/,服务器会去找一个叫foo的文件,而它是一个目录,所以就报错了。事实上,大多数情况下,它自己会试图修正这个错误,但是有时候需要你手工纠正,比如,在重写了许多CGI脚本中的复杂的URL以后。

方案:
解决这个微妙问题的方案是让服务器自动添加后缀的斜杠。对此,必须使用一个外部的重定向,使浏览器正确地处理后继的对诸如图片的请求。如果仅仅作一个内部的重写,可能只对目录页面有效,而对内嵌有使用相对URL的图片的页面则无效,因为浏览器有请求内嵌目标的可能。比如,如果不用外部重定向,/~quux/foo/index.html页面中对image.gif的请求,其结果将是/~quux/image.gif!。

所以,应该这样写:

代码:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]

又懒又疯狂的做法是把这些写入其宿主目录中的顶级.htaccess中,但是须注意,如此会带来一些处理上的开销。

代码:
RewriteEngine on
RewriteBase /~quux/
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]


集群网站的同类URL规划
说明:
我们希望在一个Intranet集群网站中,对所有WWW服务器建立一个同类的一致性的URL规划,也就是,所有的URL(对单个服务器来说,是本地的依赖于此服务器的!)是独立于服务器的!我们需要的是一个具有独立于服务器的一致性规划的WWW名称空间,即,URL不需要包含正确的物理的目标服务器,而由集群本身来自动定位物理的目标主机。

方案:
首先,目标服务器的信息来自(产生)于包含有用户、组以及实体的外部地图,其格式形如:

代码:
user1 server_of_user1
user2 server_of_user2
: :


这些信息被存入map.xxx-to-host文件。其次,如果URL在一个服务器上无效,需要引导所有的服务器重定向URL

代码:
/u/user/anypath
/g/group/anypath
/e/entity/anypath



代码:
http://physical-host/u/user/anypath
http://physical-host/g/group/anypath
http://physical-host/e/entity/anypath


以下规则集依靠地图文件来完成这个操作(假定,如果一个用户在地图中没有对应的项,则使用server0为默认服务器):

代码:
RewriteEngine on

RewriteMap user-to-host txt:/path/to/map.user-to-host
RewriteMap group-to-host txt:/path/to/map.group-to-host
RewriteMap entity-to-host txt:/path/to/map.entity-to-host

RewriteRule ^/u/([^/]+)/?(.*) http://${user-to-host:$1|server0}/u/$1/$2
RewriteRule ^/g/([^/]+)/?(.*) http://${group-to-host:$1|server0}/g/$1/$2
RewriteRule ^/e/([^/]+)/?(.*) http://${entity-to-host:$1|server0}/e/$1/$2

RewriteRule ^/([uge])/([^/]+)/?$ /$1/$2/.www/
RewriteRule ^/([uge])/([^/]+)/([^.]+.+) /$1/$2/.www/$3\


移动宿主目录到不同的网站服务器
说明:
通常,许多网管在建立一个新的网站服务器时,都会有这样的要求:重定向一个网站服务器上的所有宿主目录到另一个网站服务器。

方案:
很简单,用mod_rewrite。在老的网站服务器上重定向所有的URL /~user/anypath到http://newserver/~user/anypath。

代码:
RewriteEngine on
RewriteRule ^/~(.+) http://newserver/~$1 [R,L]


结构化的宿主目录
说明:
一些拥有几千个用户的网站通常都使用结构化的宿主目录规划,即,每个宿主目录位于一个带有特定前缀比如其用户名的第一个字符的子目录下。那么,/~foo/anypath代表/home/f/foo/.www/anypath,而/~bar/anypath代表/home/b/bar/.www/anypath。

方案:
可以使用下列规则集来扩展~以达到上述目的。

代码:
RewriteEngine on
RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /home/$2/$1/.www$3


文件系统的重组
说明:
这是一个不加雕琢的例子:一个大量使用针对目录的规则集以实现平滑观感,而从来不用调整数据结构的杀手级的应用。背景:net.sw从1992年开始,存放了我收集的免费的有效的Unix软件包。它是我的爱好也是我的工作,因为在学习计算机科学的同时,业余时间还做了多年的系统和网络的管理员。每周我都需要整理软件,因而建立了一个层次很深的目录结构来存放各种软件包:

代码:
drwxrwxr-x 2 netsw users 512 Aug 3 18:39 Audio/
drwxrwxr-x 2 netsw users 512 Jul 9 14:37 Benchmark/
drwxrwxr-x 12 netsw users 512 Jul 9 00:34 Crypto/
drwxrwxr-x 5 netsw users 512 Jul 9 00:41 Database/
drwxrwxr-x 4 netsw users 512 Jul 30 19:25 Dicts/
drwxrwxr-x 10 netsw users 512 Jul 9 01:54 Graphic/
drwxrwxr-x 5 netsw users 512 Jul 9 01:58 Hackers/
drwxrwxr-x 8 netsw users 512 Jul 9 03:19 InfoSys/
drwxrwxr-x 3 netsw users 512 Jul 9 03:21 Math/
drwxrwxr-x 3 netsw users 512 Jul 9 03:24 Misc/
drwxrwxr-x 9 netsw users 512 Aug 1 16:33 Network/
drwxrwxr-x 2 netsw users 512 Jul 9 05:53 Office/
drwxrwxr-x 7 netsw users 512 Jul 9 09:24 SoftEng/
drwxrwxr-x 7 netsw users 512 Jul 9 12:17 System/
drwxrwxr-x 12 netsw users 512 Aug 3 20:15 Typesetting/
drwxrwxr-x 10 netsw users 512 Jul 9 14:08 X11/

1996年7月,我决定通过一个漂亮的Web接口公开我的收藏。“漂亮”是指提供一个接口以直接浏览整个目录结构,同时不对这个结构做任何改变 - 甚至也不在结构顶部放置CGI脚本。为什么呢?因为这个结构还要能够被FTP访问,而且我不希望其中有任何Web或者CGI的成分。

方案:
这个方案分为两个部分:第一个部分,是用于在空闲时间建立所有目录页面的CGI脚本集。我把它们放在/e/netsw/.www/,如下:

代码:
-rw-r--r-- 1 netsw users 1318 Aug 1 18:10 .wwwacl
drwxr-xr-x 18 netsw users 512 Aug 5 15:51 DATA/
-rw-rw-rw- 1 netsw users 372982 Aug 5 16:35 LOGFILE
-rw-r--r-- 1 netsw users 659 Aug 4 09:27 TODO
-rw-r--r-- 1 netsw users 5697 Aug 1 18:01 netsw-about.html
-rwxr-xr-x 1 netsw users 579 Aug 2 10:33 netsw-access.pl
-rwxr-xr-x 1 netsw users 1532 Aug 1 17:35 netsw-changes.cgi
-rwxr-xr-x 1 netsw users 2866 Aug 5 14:49 netsw-home.cgi
drwxr-xr-x 2 netsw users 512 Jul 8 23:47 netsw-img/
-rwxr-xr-x 1 netsw users 24050 Aug 5 15:49 netsw-lsdir.cgi
-rwxr-xr-x 1 netsw users 1589 Aug 3 18:43 netsw-search.cgi
-rwxr-xr-x 1 netsw users 1885 Aug 1 17:41 netsw-tree.cgi
-rw-r--r-- 1 netsw users 234 Jul 30 16:35 netsw-unlimit.lst


其中的DATA/子目录包含了上述目录结构,即实在的net.sw,由rdist在需要的时候自动更新。第二个部分的遗留问题是:如何连接这两个结构为一个平滑观感的URL树?我希望在运行适当的CGI脚本而使用各种URL的时候,使用户感觉不到DATA/目录的存在。方案如下:首先,我把下列配置放在服务器上DocumentRoot中的针对目录的配置文件里,以重写公布的URL /net.sw/ 为内部路径 /e/netsw:

代码:
RewriteRule ^net.sw$ net.sw/ [R]
RewriteRule ^net.sw/(.*)$ e/netsw/$1


第一条规则是针对遗漏后缀斜杠的请求的!第二条规则才是真正实现功能的。接着,就是放在针对目录的配置文件/e/netsw/.www/.wwwacl中的杀手级的配置了:

代码:
Options ExecCGI FollowSymLinks Includes MultiViews

RewriteEngine on

# we are reached via /net.sw/ prefix
RewriteBase /net.sw/

# first we rewrite the root dir to
# the handling cgi script
RewriteRule ^$ netsw-home.cgi [L]
RewriteRule ^index\.html$ netsw-home.cgi [L]

# strip out the subdirs when
# the browser requests us from perdir pages
RewriteRule ^.+/(netsw-[^/]+/.+)$ $1 [L]

# and now break the rewriting for local files
RewriteRule ^netsw-home\.cgi.* - [L]
RewriteRule ^netsw-changes\.cgi.* - [L]
RewriteRule ^netsw-search\.cgi.* - [L]
RewriteRule ^netsw-tree\.cgi$ - [L]
RewriteRule ^netsw-about\.html$ - [L]
RewriteRule ^netsw-img/.*$ - [L]

# anything else is a subdir which gets handled
# by another cgi script
RewriteRule !^netsw-lsdir\.cgi.* - [C]
RewriteRule (.*) netsw-lsdir.cgi/$1


阅读提示:

注意前半部分中的标志L(最后),和无对应项('-')
注意后半部分中的符号!(非),和标志C (链)
注意最后一条规则的全匹配模式
代码:
NCSA imagemap和Apache mod_imap
说明:
许多人都希望在从NCSA网站服务器向较现代的Apache网站服务器转移中实现平滑过渡,即希望老的NCSA imagemap程序能在Apache的较现代的mod_imap支持下正常运作。但问题在于,到处都是通过/cgi-bin/imagemap/path/to/page.map引用imagemap程序的连接,而在Apache下,应该写成/path/to/page.map。

方案:
使用全局规则在空闲时间去除所有这些请求的前缀:

代码:
RewriteEngine on
RewriteRule ^/cgi-bin/imagemap(.*) $1 [PT]


在多个目录中搜索页面
说明:
有时会有必要使网站服务器在多个目录中搜索页面,对此,MultiViews或者其他技术无能为力。

方案:
编制一个明确的规则集以搜索目录中的文件。

代码:
RewriteEngine on

# first try to find it in custom/...
# ...and if found stop and be happy:
RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /your/docroot/dir1/$1 [L]

# second try to find it in pub/...
# ...and if found stop and be happy:
RewriteCond /your/docroot/dir2/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /your/docroot/dir2/$1 [L]

# else go on for other Alias or ScriptAlias directives,
# etc.
RewriteRule ^(.+) - [PT]


按照URL的片段设置环境变量
说明:
如果希望保持请求之间的状态信息,但又不希望使用CGI来包装所有页面,而只通过分离URL中的有用信息来编码。

方案:
可以用一个规则集来分离出状态信息,并设置环境变量以备此后用于XSSI或CGI。如此,一个/foo/S=java/bar/的URL会被解析为/foo/bar/,而环境变量STATUS则被设置为"java"。

代码:
RewriteEngine on
RewriteRule ^(.*)/S=([^/]+)/(.*) $1/$3 [E=STATUS:$2]


虚拟用户主机
说明:
如果需要为用户username支持一个www.username.host.domain.com的主页,但不是用在此机器上建虚拟主机的方法,而是用仅在此机器上增加一个DNS记录的方法实现。

方案:
对HTTP/1.0的请求,这是无法实现的;但是对HTTP/1.1的在HTTP头中包含有主机名的请求,可以用以下规则集来内部地重写http://www.username.host.com/anypath为/home/username/anypath:

代码:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^www\.([^.]+)\.host\.com(.*) /home/$1$2


为外来访问者重定向宿主目录
说明:
对不是来自本地域ourdomain.com的外来访问者的请求,重定向其宿主目录URL到另一个网站服务器www.somewhere.com,有时这种做法也会用在虚拟主机的上下文中。

方案:
只须一个重写条件:

代码:
RewriteEngine on
RewriteCond %{REMOTE_HOST} !^.+\.ourdomain\.com$
RewriteRule ^(/~.+) http://www.somewhere.com/$1 [R,L]


重定向失败的URL到其他网站服务器
说明:
如何重写URL以重定向对网站服务器A的失败请求到服务器B,是一个常见的问题。一般,可以用Perl写的CGI脚本通过ErrorDocument来解决,此外,还有mod_rewrite方案。但是须注意,这种方法的执行效率不如用ErrorDocument的CGI脚本!

方案:
第一种方案,有最好的性能而灵活性欠佳,出错概率小所以安全:

代码:
RewriteEngine on
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule ^(.+) http://webserverB.dom/$1


但是其问题在于,它只对位于DocumentRoot中的页面有效。虽然可以增加更多的条件(比如同时还处理宿主目录,等等),但是还有一个更好的方法:

代码:
RewriteEngine on
RewriteCond %{REQUEST_URI} !-U
RewriteRule ^(.+) http://webserverB.dom/$1


这种方法使用了mod_rewrite提供的“向前参照(look-ahead)”的功能,是一种对所有URL类型都有效而且安全的方法。但是,对网站服务器的性能会有影响,所以如果网站服务器有一个强大的CPU,那就用这个方法。而在慢速机器上,可以用第一种方法,或者用性能更好的ErrorDocument CGI脚本。

扩展的重定向
说明:
有时候,我们会需要更多的对重定向URL的(有关字符转义机制方面的)控制。通常,Apache内核中的URL转义函数uri_escape()同时还会对anchor转义,即,类似"url#anchor"的URL,因此,你不能用mod_rewrite对此类URL直接重定向。那么如何实现呢?

方案:
必须用NPH-CGI脚本使它自己重定向,因为对NPH(non-parseable headers [无须解析的HTTP头])不会发生转义操作。首先,在针对服务器的配置中(应该位于所有重写规则的最后),引入一种新的URL类型xredirect::

代码:
RewriteRule ^xredirect:(.+) /path/to/nph-xredirect.cgi/$1 \
[T=application/x-httpd-cgi,L]


以强制所有带xredirect:前缀的URL被传送到如下的nph-xredirect.cgi程序:

代码:
#!/path/to/perl
##
## nph-xredirect.cgi -- NPH/CGI script for extended redirects
## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
##

$| = 1;
$url = $ENV{'PATH_INFO'};

print "HTTP/1.0 302 Moved Temporarily\n";
print "Server: $ENV{'SERVER_SOFTWARE'}\n";
print "Location: $url\n";
print "Content-type: text/html\n";
print "\n";
print "\n";
print "\n";
print "\n";
print "\n";
print "\n";
print "
Moved Temporarily (EXTENDED)
\n";
print "The document has moved here.
\n";
print "\n";
print "\n";

##EOF##


这是一种可以重定向所有URL类型的方法,包括不被mod_rewrite直接支持的类型。所以,还可以这样重定向news:newsgroup:

代码:
RewriteRule ^anyurl xredirect:news:newsgroup


注意:无须对上述规则加[R]或[R,L],因为xredirect:会在稍后被其特殊的传送规则扩展。
文档访问的多路复用
说明:
你知道http://www.perl.com/CPAN的CPAN(Comprehensive Perl Archive Network)吗?它实现了一个重定向以提供,全世界的CPAN镜像中离访问者最近的一个FTP站点,也可以称之为FTP访问多路复用服务。CPAN是通过CGI脚本实现的,那么用mod_rewrite如何实现呢?

方案:
首先,我们注意到mod_rewrite从3.0.0版本开始,还可以重写"ftp:"类型。其次,对客户端顶级域名的路径最近的求取可以用RewriteMap实现。利用链式规则集,并用顶级域名作为查找多路复用地图的键,可以这样做:

代码:
RewriteEngine on
RewriteMap multiplex txt:/path/to/map.cxan
RewriteRule ^/CxAN/(.*) %{REMOTE_HOST}::$1 [C]
RewriteRule ^.+\.([a-zA-Z]+)::(.*)$ ${multiplex:$1|ftp.default.dom}$2 [R,L]

##
## map.cxan -- Multiplexing Map for CxAN
##

de ftp://ftp.cxan.de/CxAN/
uk ftp://ftp.cxan.uk/CxAN/
com ftp://ftp.cxan.com/CxAN/
:
##EOF##

依赖于时间的重写
说明:
在页面内容依时间不同而变化的场合,比如重定向特定页面,许多网管仍然采用CGI脚本的方法,如何用mod_rewrite来实现呢?

方案:
有许多类似TIME_xxx的变量可以用在重写条件中,利用STRING和=STRING的类型比较,并加以连接,就可以实现依赖于时间的重写:

代码:
RewriteEngine on
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^foo\.html$ foo.day.html
RewriteRule ^foo\.html$ foo.night.html


此例使URL foo.html在07:00-19:00时指向foo.day.html,而在其余时间,则指向foo.night.html,对主页是一个不错的功能...

对YYYY过渡为XXXX的向前兼容
说明:
在转变了大批.html文件为.phtml,使文档.YYYY过渡成为文档.XXXX后,如何保持URL的向前兼容(仍然虚拟地存在)?

方案:
只须按基准文件名重写,并测试带有新的扩展名的文件是否存在,如果存在,则用新的,否则,仍然用原来的。

代码:
# backward compatibility ruleset for
# rewriting document.html to document.phtml
# when and only when document.phtml exists
# but no longer document.html
RewriteEngine on
RewriteBase /~quux/
# parse out basename, but remember the fact
RewriteRule ^(.*)\.html$ $1 [C,E=WasHTML:yes]
# rewrite to document.phtml if exists
RewriteCond %{REQUEST_FILENAME}.phtml -f
RewriteRule ^(.*)$ $1.phtml [S=1]
# else reverse the previous basename cutout
RewriteCond %{ENV:WasHTML} ^yes$
RewriteRule ^(.*)$ $1.html



内容的处理
新旧URL(内部的)
说明:
假定已经把文件bar.html改名为foo.html,需要对老的URL向前兼容,即让用户仍然可以使用老的URL,而感觉不到文件被改名了。

方案:
通过以下规则内部地重写老的URL为新的:

代码:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo\.html$ bar.html


新旧URL(外部的)
说明:
仍然假定已经把文件bar.html改名为foo.html,需要对老的URL向前兼容,但是要让用户得到文件被改名的暗示,即,其浏览器的地址栏中显示的是新的URL。

方案:
作一个HTTP的强制重定向以改变浏览器和用户界面上的显示:

代码:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo\.html$ bar.html [R]


依赖于浏览器的内容
说明:
至少对重要的顶级页面,有时候有必要提供依赖于浏览器的最佳的内容,即对最新的Netscape提供最大化的版本,对Lynx提供最小化的版本,而对其他的浏览器则提供一个功能一般的版本。

方案:
对此,内容协商无能为力,因为浏览器不提供其那种形式的类型,所以只能在HTTP头"User-Agent"上想办法。以下规则集可以完成这个操作:如果HTTP头"User-Agent"以"Mozilla/3"开头,则页面foo.html被重写为foo.NS.html,而后重写操作终止;如果是"Lynx"或者版本号为1和2的"Mozilla",则重写为foo.20.html;而其他所有的浏览器收到的页面则是foo.32.html:

代码:
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/3.*
RewriteRule ^foo\.html$ foo.NS.html [L]

RewriteCond %{HTTP_USER_AGENT} ^Lynx/.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/[12].*
RewriteRule ^foo\.html$ foo.20.html [L]

RewriteRule ^foo\.html$ foo.32.html [L]



动态镜像
说明:
假定,需要在我们的名称空间里加入其他远程主机的页面。对FTP服务器,可以用mirror程序以在本地机器上维持一个对远程数据的最新的拷贝;对网站服务器,可以用类似的用于HTTP的webcopy程序。但这两种技术都有一个主要的缺点:此本地拷贝必须通过这个程序的执行来更新。所以,比较好的方法是,不采用静态镜像,而采用动态镜像,即,在有数据请求时自动更新(远程主机上更新的数据)。

方案:
为此,使用Proxy Throughput功能(flag [P]),以映射远程页面甚至整个远程网络区域到我们的名称空间:

代码:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^hotsheet/(.*)$ http://www.tstimpreso.com/hotsheet/$1 [P]

RewriteEngine on
RewriteBase /~quux/
RewriteRule ^usa-news\.html$ http://www.quux-corp.com/news/index.html [P]


反向动态镜像
说明:
...
方案:
代码:
RewriteEngine on
RewriteCond /mirror/of/remotesite/$1 -U
RewriteRule ^http://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1


通过Intranet取得丢失的数据
说明:
这是一种在受防火墙保护的(内部的)Intranet(www2.quux-corp.dom)上保存和维护实际数据,而虚拟地运行企业级(外部的)Internet网站服务器(www.quux-corp.dom)的巧妙的方法。这种方法是外部服务器在空闲时间从内部服务器取得被请求的数据。

方案:
首先,必须确保防火墙对内部服务器的保护,并只允许此外部服务器取得数据。对包过滤(packet-filtering)防火墙,可以如下制定防火墙规则:

代码:
ALLOW Host www.quux-corp.dom Port >1024 --> Host www2.quux-corp.dom Port 80
DENY Host * Port * --> Host www2.quux-corp.dom Port 80


按你的实际配置,只要对上例稍作调整即可。接着,建立通过代理后台获取丢失数据的mod_rewrite规则:

代码:
RewriteRule ^/~([^/]+)/?(.*) /home/$1/.www/$2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/home/([^/]+)/.www/?(.*) http://www2.quux-corp.dom/~$1/pub/$2 [P]


负载的均衡
说明:
如何均衡www.foo.com的负载到www[0-5].foo.com(一共是6个服务器)?

方案:
这个问题有许多可能的解决方案,在此,我们讨论通称为“基于DNS(DNS-based)的”方案,和特殊的使用mod_rewrite的方案:

DNS循环(DNS Round-Robin)
最简单的方法是用BIND的DNS循环特性,只要按惯例设置www[0-9].foo.com的DNS的A(地址)记录,如:

代码:
www0 IN A 1.2.3.1
www1 IN A 1.2.3.2
www2 IN A 1.2.3.3
www3 IN A 1.2.3.4
www4 IN A 1.2.3.5
www5 IN A 1.2.3.6


然后,增加以下各项:

代码:
www IN CNAME www0.foo.com.
IN CNAME www1.foo.com.
IN CNAME www2.foo.com.
IN CNAME www3.foo.com.
IN CNAME www4.foo.com.
IN CNAME www5.foo.com.
IN CNAME www6.foo.com.

注意,上述看起来似乎是错误的,但事实上,它的确是BIND中的一个预期的特性,而且也可以这样用。无论如何,现在www.foo.com已经被解析,BIND可以给出www0-www6 - 虽然每次在次序上会有轻微的置换/循环,客户端的请求可以被分散到各个服务器。可是,这并不是一个优秀的负载均衡方案,因为,DNS解析信息可以被网络中其他名称服务器缓冲,而一旦www.foo.com被解析为wwwN.foo.com,则其后继请求都将被送往www.foo.com。但是最终结果是正确的,因为请求的总量的确被分散到各个服务器了

DNS 负载均衡
一种成熟的基于DNS的负载均衡方法是使用http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html的lbnamed程序,它是一个Perl 5程序,带有若干辅助工具,实现了真正的基于DNS的负载均衡。

代理吞吐循环(Proxy Throughput Round-Robin)
这是一个使用mod_rewrite及其代理吞吐特性的方法。首先,在DNS记录中,将www0.foo.com固定为www.foo.com,如下:

代码:
www IN CNAME www0.foo.com.


其次,将www0.foo.com转换为一个专职代理服务器,即,由这个机器把所有到来的URL通过内部代理分散到另外5个服务器(www1-www5)。为此,必须建立一个规则集,对所有URL调用一个负载均衡脚本lb.pl。

代码:
RewriteEngine on
RewriteMap lb prg:/path/to/lb.pl
RewriteRule ^/(.+)$ ${lb:$1} [P,L]


以下是lb.pl:

代码:
#!/path/to/perl
##
## lb.pl -- load balancing script
##

$| = 1;

$name = "www"; # the hostname base
$first = 1; # the first server (not 0 here, because 0 is myself)
$last = 5; # the last server in the round-robin
$domain = "foo.dom"; # the domainname

$cnt = 0;
while () {
$cnt = (($cnt+1) % ($last+1-$first));
$server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
print "http://$server/$_";
}

##EOF##

最后的说明:这样有用吗?www0.foo.com似乎也会超载呀?答案是:没错,它的确会超载,但是它超载的仅仅是简单的代理吞吐请求!所有诸如SSI、CGI、ePerl等等的处理完全是由其他机器完成的,这个才是要点。
硬件/TCP循环
还有一个硬件解决方案。Cisco有一个叫LocalDirector的东西,实现了TCP/IP层的负载均衡,事实上,它是一个位于网站集群前端的电路级网关。如果你有足够资金而且的确需要高性能的解决方案,那么可以用这个。

反向代理
说明:
...
方案:
代码:
##
## apache-rproxy.conf -- Apache configuration for Reverse Proxy Usage
##

# server type
ServerType standalone
Listen 8000
MinSpareServers 16
StartServers 16
MaxSpareServers 16
MaxClients 16
MaxRequestsPerChild 100

# server operation parameters
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 15
Timeout 400
IdentityCheck off
HostnameLookups off

# paths to runtime files
PidFile /path/to/apache-rproxy.pid
LockFile /path/to/apache-rproxy.lock
ErrorLog /path/to/apache-rproxy.elog
CustomLog /path/to/apache-rproxy.dlog "%{%v/%T}t %h -> %{SERVER}e URL: %U"

# unused paths
ServerRoot /tmp
DocumentRoot /tmp
CacheRoot /tmp
RewriteLog /dev/null
TransferLog /dev/null
TypesConfig /dev/null
AccessConfig /dev/null
ResourceConfig /dev/null

# speed up and secure processing

Options -FollowSymLinks -SymLinksIfOwnerMatch
AllowOverride None


# the status page for monitoring the reverse proxy

SetHandler server-status


# enable the URL rewriting engine
RewriteEngine on
RewriteLogLevel 0

# define a rewriting map with value-lists where
# mod_rewrite randomly chooses a particular value
RewriteMap server rnd:/path/to/apache-rproxy.conf-servers

# make sure the status page is handled locally
# and make sure no one uses our proxy except ourself
RewriteRule ^/apache-rproxy-status.* - [L]
RewriteRule ^(http|ftp)://.* - [F]

# now choose the possible servers for particular URL types
RewriteRule ^/(.*\.(cgi|shtml))$ to://${server:dynamic}/$1 [S=1]
RewriteRule ^/(.*)$ to://${server:static}/$1

# and delegate the generated URL by passing it
# through the proxy module
RewriteRule ^to://([^/]+)/(.*) http://$1/$2 [E=SERVER:$1,P,L]

# and make really sure all other stuff is forbidden
# when it should survive the above rules...
RewriteRule .* - [F]

# enable the Proxy module without caching
ProxyRequests on
NoCache *

# setup URL reverse mapping for redirect reponses
ProxyPassReverse / http://www1.foo.dom/
ProxyPassReverse / http://www2.foo.dom/
ProxyPassReverse / http://www3.foo.dom/
ProxyPassReverse / http://www4.foo.dom/
ProxyPassReverse / http://www5.foo.dom/
ProxyPassReverse / http://www6.foo.dom/

##
## apache-rproxy.conf-servers -- Apache/mod_rewrite selection table
##

# list of backend servers which serve static
# pages (HTML files and Images, etc.)
static www1.foo.dom|www2.foo.dom|www3.foo.dom|www4.foo.dom

# list of backend servers which serve dynamically
# generated page (CGI programs or mod_perl scripts)
dynamic www5.foo.dom|www6.foo.dom


新的MIME类型,新的服务
说明:
网上有许多很技巧的CGI程序,但是用法晦涩,许多网管弃之不用。即使是Apache的MEME类型的动作处理器,也仅仅在CGI程序不需要在其输入中包含特殊URL(PATH_INFO和QUERY_STRINGS)时才很好用。首先,配置一种新的后缀为.scgi(for secure CGI)文件类型,其处理器是很常见的cgiwrap程序。问题是:如果使用同类URL规划(见上述),而用户宿主目录中的一个文件的URL是/u/user/foo/bar.scgi,可是cgiwrap要求的URL的格式是/~user/foo/bar.scgi/,以下规则解决了这个问题:

代码:
RewriteRule ^/[uge]/([^/]+)/\.www/(.+)\.scgi(.*) ...
... /internal/cgi/user/cgiwrap/~$1/$2.scgi$3 [NS,T=application/x-http-cgi]


另外,假设需要使用其他程序:wwwlog(显示access.log中的一个URL子树)和wwwidx(对一个URL子树运行Glimpse),则必须对这些程序提供URL区域作为其操作对象。比如,对/u/user/foo/执行swwidx程序的超链是这样的:

代码:
/internal/cgi/user/swwidx?i=/u/user/foo/


其缺点是,必须同时硬编码超链中的区域和CGI的路径,如果重组了这个区域,就需要花费大量时间来修改各个超链。

方案:
方案是用一个特殊的新的URL格式,自动拼装CGI参数:

代码:
RewriteRule ^/([uge])/([^/]+)(/?.*)/\* /internal/cgi/user/wwwidx?i=/$1/$2$3/
RewriteRule ^/([uge])/([^/]+)(/?.*):log /internal/cgi/user/wwwlog?f=/$1/$2$3


现在,这个搜索到/u/user/foo/的超链简化成了:

代码:
HREF="*"


它会被内部地自动转换为

代码:
/internal/cgi/user/wwwidx?i=/u/user/foo/


如此,可以为使用:log的超链,拼装出调用CGI程序的参数。

从静态到动态
说明:
如何无缝转换静态页面foo.html为动态的foo.cgi,而不为浏览器/用户所察觉。

方案:
只须重写此URL为CGI-script,以强制为可以作为CGI-script运行的正确的MIME类型。如此,对/~quux/foo.html的请求其实会执行/~quux/foo.cgi。

代码:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo\.html$ foo.cgi [T=application/x-httpd-cgi]


空闲时间内的内容协商
说明:
这是一个很难解的功能:动态生成的静态页面,即,它应该作为静态页面发送(从文件系统中读出,然后直接发出去),但是如果它丢失了,则由服务器动态生成。如此,可以静态地提供CGI生成的页面,除非有人(或者是一个cronjob)删除了这些静态页面,而且其内容可以得到更新。

方案:
以下规则集实现这个功能:
代码:
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^page\.html$ page.cgi [T=application/x-httpd-cgi,L]
这样,如果page.html不存在或者文件大小为null,则对page.html的请求会导致page.cgi的运行。其中奥妙在于,page.cgi是一个将输出写入page.html的(同时也写入STDOUT)的常规的CGI脚本,执行完毕,服务器则将page.html的内容发出。如果网管需要强制更新其内容,只须删除page.html即可(通常由一个cronjob完成)。

自动更新的文档
说明:
建立一个复杂的页面,能够在用编辑器写了一个更新的版本时自动在浏览器上得到刷新,这不是很好吗?这可能吗?

方案:
这是可行的! 这需要综合利用MIME多成分、网站服务器的NPH和mod_rewrite的URL操控特性。首先,建立一个新的URL特性:对在文件系统中更新时需要刷新的所有URL加上:refresh。

代码:
RewriteRule ^(/[uge]/[^/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1


然后,修改URL

代码:
/u/foo/bar/page.html:refresh


以内部地操控此URL

代码:
/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html


接着就是NPH-CGI脚本部分了。虽然,人们常说"left as an exercise to the reader",我还是给出答案了。

代码:
#!/sw/bin/perl
##
## nph-refresh -- NPH/CGI script for auto refreshing pages
## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
##
$| = 1;

# split the QUERY_STRING variable
@pairs = split(/&/, $ENV{'QUERY_STRING'});
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ tr/A-Z/a-z/;
$name = 'QS_' . $name;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
eval "\$$name = \"$value\"";
}
$QS_s = 1 if ($QS_s eq '');
$QS_n = 3600 if ($QS_n eq '');
if ($QS_f eq '') {
print "HTTP/1.0 200 OK\n";
print "Content-type: text/html\n\n";
print "&b&ERROR&/b&: No file given\n";
exit(0);
}
if (! -f $QS_f) {
print "HTTP/1.0 200 OK\n";
print "Content-type: text/html\n\n";
print "&b&ERROR&/b&: File $QS_f not found\n";
exit(0);
}

sub print_http_headers_multipart_begin {
print "HTTP/1.0 200 OK\n";
$bound = "ThisRandomString12345";
print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
&print_http_headers_multipart_next;
}

sub print_http_headers_multipart_next {
print "\n--$bound\n";
}

sub print_http_headers_multipart_end {
print "\n--$bound--\n";
}

sub displayhtml {
local($buffer) = @_;
$len = length($buffer);
print "Content-type: text/html\n";
print "Content-length: $len\n\n";
print $buffer;
}

sub readfile {
local($file) = @_;
local(*FP, $size, $buffer, $bytes);
($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
$size = sprintf("%d", $size);
open(FP, "&$file");
$bytes = sysread(FP, $buffer, $size);
close(FP);
return $buffer;
}

$buffer = &readfile($QS_f);
&print_http_headers_multipart_begin;
&displayhtml($buffer);

sub mystat {
local($file) = $_[0];
local($time);

($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
return $mtime;
}

$mtimeL = &mystat($QS_f);
$mtime = $mtime;
for ($n = 0; $n & $QS_n; $n++) {
while (1) {
$mtime = &mystat($QS_f);
if ($mtime ne $mtimeL) {
$mtimeL = $mtime;
sleep(2);
$buffer = &readfile($QS_f);
&print_http_headers_multipart_next;
&displayhtml($buffer);
sleep(5);
$mtimeL = &mystat($QS_f);
last;
}
sleep($QS_s);
}
}

&print_http_headers_multipart_end;

exit(0);

##EOF##
大型虚拟主机
说明:
Apache的功能很强,在有几十个虚拟主机的情况下运行得很好,但是如果你是ISP,需要提供几百个虚拟主机,那么这就不是一个最佳的选择了。

方案:
为此,需要用代理吞吐(Proxy Throughput)功能(flag [P])映射远程页面甚至整个远程网络区域到自己的名称空间:

代码:
##
## vhost.map
##
www.vhost1.dom:80 /path/to/docroot/vhost1
www.vhost2.dom:80 /path/to/docroot/vhost2
:
www.vhostN.dom:80 /path/to/docroot/vhostN

代码:
##
## httpd.conf
##
:
# use the canonical hostname on redirects, etc.
UseCanonicalName on

:
# add the virtual host in front of the CLF-format
CustomLog /path/to/access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b"
:

# enable the rewriting engine in the main server
RewriteEngine on

# define two maps: one for fixing the URL and one which defines
# the available virtual hosts with their corresponding
# DocumentRoot.
RewriteMap lowercase int:tolower
RewriteMap vhost txt:/path/to/vhost.map

# Now do the actual virtual host mapping
# via a huge and complicated single rule:
#
# 1. make sure we don't map for common locations
RewriteCond %{REQUEST_URL} !^/commonurl1/.*
RewriteCond %{REQUEST_URL} !^/commonurl2/.*
:
RewriteCond %{REQUEST_URL} !^/commonurlN/.*
#
# 2. make sure we have a Host header, because
# currently our approach only supports
# virtual hosting through this header
RewriteCond %{HTTP_HOST} !^$
#
# 3. lowercase the hostname
RewriteCond ${lowercase:%{HTTP_HOST}|NONE} ^(.+)$
#
# 4. lookup this hostname in vhost.map and
# remember it only when it is a path
# (and not "NONE" from above)
RewriteCond ${vhost:%1} ^(/.*)$
#
# 5. finally we can map the URL to its docroot location
# and remember the virtual host for logging puposes
RewriteRule ^/(.*)$ %1/$1 [E=VHOST:${lowercase:%{HTTP_HOST}}]
:


对访问的限制
阻止Robots
说明:
如何阻止一个完全匿名的robot取得特定网络区域的页面?一个/robots.txt文件可以包含若干"Robot Exclusion Protocol(robot排除协议)"的行,但不足以阻止此类robot。

方案:
可以用一个规则集以拒绝对网络区域/~quux/foo/arc/(对一个很深的目录区域进行列表可能会使服务器产生很大的负载)的访问。还必须确保仅阻止特定的robot,就是说,仅仅阻止robot访问主机是不够的,这样会同时也阻止了用户访问该主机。为此,就需要对HTTP头的User-Agent信息作匹配。

代码:
RewriteCond %{HTTP_USER_AGENT} ^NameOfBadRobot.*
RewriteCond %{REMOTE_ADDR} ^123\.45\.67\.[8-9]$
RewriteRule ^/~quux/foo/arc/.+ - [F]
阻止内嵌的图片
说明:
假设,http://www.quux-corp.de/~quux/有一些内嵌图片的页面,这些图片很好,所以就有人用超链连到他们自己的页面中了。由于这样徒然增加了我们的服务器的流量,因此,我们不愿意这种事情发生。

方案:
虽然,我们不能100%地保护这些图片不被写入别人的页面,但至少可以对发出HTTP Referer头的浏览器加以限制。

代码:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC]
RewriteRule .*\.gif$ - [F]

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !.*/foo-with-gif\.html$
RewriteRule ^inlined-in-foo\.gif$ - [F]


对主机的拒绝
说明:
如何拒绝一批外部列表中的主机对我们服务器的使用?

方案:
代码:
For Apache >= 1.3b6:

RewriteEngine on
RewriteMap hosts-deny txt:/path/to/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^/.* - [F]

For Apache <= 1.3b6:

RewriteEngine on
RewriteMap hosts-deny txt:/path/to/hosts.deny
RewriteRule ^/(.*)$ ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}/$1
RewriteRule !^NOT-FOUND/.* - [F]
RewriteRule ^NOT-FOUND/(.*)$ ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}/$1
RewriteRule !^NOT-FOUND/.* - [F]
RewriteRule ^NOT-FOUND/(.*)$ /$1

代码:
##
## hosts.deny
##
## ATTENTION! This is a map, not a list, even when we treat it as such.
## mod_rewrite parses it for key/value pairs, so at least a
## dummy value "-" must be present for each entry.
##

193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -

对代理的拒绝
说明:
如何拒绝某个主机或者来自特定主机的用户使用Apache代理?

方案:
首先,要确保Apache网站服务器在编译时配置文件中mod_rewrite在mod_proxy的下面(!),使它在mod_proxy之前被调用。然后,如下拒绝某个主机...

代码:
RewriteCond %{REMOTE_HOST} ^badhost\.mydomain\.com$
RewriteRule !^http://[^/.]\.mydomain.com.* - [F]

...如下拒绝user@host-dependent:

代码:
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} ^badguy@badhost\.mydomain\.com$
RewriteRule !^http://[^/.]\.mydomain.com.* - [F]


特殊的认证
说明:
有时候,会需要一种非常特殊的认证,即,对一组明确指定的用户,允许其访问,而没有(在使用mod_access的基本认证方法时可能会出现的)任何提示。

方案:
可是使用一个重写条件列表来排除所有的朋友:

代码:
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend1@client1.quux-corp\.com$
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend2@client2.quux-corp\.com$
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend3@client3.quux-corp\.com$
RewriteRule ^/~quux/only-for-friends/ - [F]


基于提交者(Referer)的反射器
说明:
如何配置一个基于HTTP头"Referer"的反射器以反射到任意数量的提交页面?

方案:
使用这个很技巧的规则集...

代码:
RewriteMap deflector txt:/path/to/deflector.map

RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}} ^-$
RewriteRule ^.* %{HTTP_REFERER} [R,L]

RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^.* ${deflector:%{HTTP_REFERER}} [R,L]


... 并结合对应的重写地图:

代码:
##
## deflector.map
##

http://www.badguys.com/bad/index.html -
http://www.badguys.com/bad/index2.html -
http://www.badguys.com/bad/index3.html http://somewhere.com/

它可以自动将请求(在地图中指定了"-"值的时候)反射回其提交页面,或者(在地图中URL有第二个参数时)反射到一个特定的URL。


其他
外部重写引擎
说明:
一个常见的问题: 如何解决似乎无法用mod_rewrite解决的FOO/BAR/QUUX/之类的问题?

方案:
可以使用一个与RewriteMap功能相同的外部RewriteMap程序,一旦它在Apache启动时被执行,则从STDIN接收被请求的URL,并将处理过(通常是重写过的)的URL(以相同顺序!)在STDOUT输出。

代码:
RewriteEngine on
RewriteMap quux-map prg:/path/to/map.quux.pl
RewriteRule ^/~quux/(.*)$ /~quux/${quux-map:$1}


代码:
#!/path/to/perl

# disable buffered I/O which would lead
# to deadloops for the Apache server
$| = 1;

# read URLs one per line from stdin and
# generate substitution URL on stdout
while (<>) {
s|^foo/|bar/|;
print $_;
}

这是一个作演示的例子,只是把所有的URL /~quux/foo/...重写为/~quux/bar/...,而事实上,可以把它修改以获得任何你需要的功能。但是要注意,虽然一般用户都可以使用,可是只有系统管理员才可以定义这样的地图。

一、有关CN域名交易涉及的名词解释

  1. 域名注册管理机构:中国互联网络信息中心,承担顶级域名系统的运行、维护和管理工作。

  2. 域名交易管理机构:指的是中国互联网络信息中心,其职责是负责运行和管理域名交易系统,维护域名交易中央数据库,认证域名交易服务机构提供域名交易服务;

  3. 域名交易服务机构:是经域名注册管理机构认证从事域名交易服务的机构;

  4. 域名注册服务机构:是指受理域名注册申请,直接完成域名在国内顶级域名数据库中注册的机构。

  5. 域名交易者:是依照本规则进行域名交易的人,包括卖方与买方。

  6. 域名交易状态查询:

  (1) 不可交易:在此状态下,域名无法交易,域名默认的状态或域名注册完毕后即为该状态;

  (2) 正常:当卖方通过中国互联网络信息中心的网站设置域名为可交易后,域名状态改为“正常”,在此状态下可以进行域名交易;

  (3) 交易等待验证:域名交易服务机构确认卖方提供信息,登录中国互联网络信息中心网站确认交易后,域名状态改为“交易等待验证”;

  (4) 交易进行中:卖方通过Email和域名密码确认交易,验证通过后,域名状态由“交易等待验证”转为“交易进行中”,此时域名被锁定。

  (5) 交易确认中:买方、卖方及交易服务机构三方签署交易协议,交易服务机构确认交易完成,域名状态由“交易进行中”转为“交易确认中”。

  7. 域名密码:也就是域名管理密码,是域名注册时自动生成域名密码,卖方可与注册服务机构进行联系索要。此密码同域名转移密码

  8. 域名过户:由域名注册服务机构在验证域名交易码后进行域名过户操作。

  二、域名交易的卖方流程

  1. 卖方通过域名和域名密码到中国互联网络信息中心网站进行域名状态更改,域名状态由“不可交易”转为“正常”后,域名便可进行交易。域名状态查询见:

  2. 卖方选择域名交易管理机构中国互联网络信息中心认证的域名交易服务机构进行域名交易。

  3. 卖方可以通过交易服务机构网站、或提交书面、email、传真提出域名交易申请,在提交申请时需同时接受交易服务机构制订的相关交易条款。

  4. 卖方及买方提交资料,交易服务机构对卖方和买方身份、交易域名的有效性及交易时间的有效性进行验证,符合规定可以进行交易。

  5. 域名交易服务机构在中国互联网络信息中心提供的链接请求交易,请求交易后系统将此域名状态由“正常”转为“交易等待验证”状态。在“交易等待验证”状态下,域名注册人的信息可以更改 ,但其他交易服务机构不能再对该域名提交交易申请。

  6. 域名交易服务机构请求交易后,中国互联网络信息中心开始进行域名审核,在此次交易过程中,如遇到违反相关规定域名正在进行交易,中国互联网络信息中心均可取消该域名的交易权利,强制撤销该域名正在进行的交易,并将该域名加入到域名禁止交易库中;域名状态由“交易等待验证”转为“正常”。

  7. 交易服务机构发出交易请求后,交易系统通过email形式给卖方发送密码验证邮件。

  8. 卖方通过Email里提供的链接和域名密码进行交易验证,验证通过后,域名状态由“交易等待验证”转为“交易进行中”,此时域名被锁定。

  若卖方因各种原因没有确认交易,14日之内交易超时,域名状态转为“正常”,卖方可重新申请进行交易,也可将域名从可交易列表中删除。

  9. 交易系统通过接口给交易服务机构发送域名已激活的通知。

  10. 买方登陆交易服务机构网站,寻找合适域名,同意交易服务机构所规定协议,即可进行域名交易。

  11. 交易服务机构确认后,进行交易撮合,买卖双方按照交易服务机构制订的交易流程进行议价。

  若三方对交易议价失败,域名交易服务机构取消交易,域名状态由“交易进行中”转为“正常”。此次交易终止,卖方可重新开始交易流程。

  交易撮合成功议价在有效时间范围内完成的,有效交易的时间范围为域名注册后的15日后到域名到期前15日前,即域名交易服务机构发出请求交易开始时间必须在域名注册后的15日后,域名交易结束时间必须在域名到期日前15日。

  12. 买方、卖方及交易服务机构三方签署交易协议,交易服务机构确认交易完成,填写买方信息,域名状态由“交易进行中”转为“交易确认中”。

  13. 域名交易服务机构确认交易完成后,可通过域名交易系统查询到域名交易码。

  14. 卖方提供域名过户资料给域名注册服务机构。

  按照域名注册服务机构的要求提交用以确认卖方变更注册人信息的必要审核材料(例如身份证、企业营业执照等)

  15. 域名交易服务机构将交易码发给卖方域名所在的注册服务机构。

  16. 注册服务机构在15日内登录到中国互联网络信息中心的域名交易系统上进行域名交易码的确认。

  17. 注册服务机构验证交易码完成后,域名状态由“交易确认中”转为“不可交易”,域名锁定解除。

  18. 注册服务机构更改域名密码,并修改相关注册人信息。注册服务机构以其规定的方式将密码通知买方。

  19过户完成,交易完毕。

  附交易流程图

  三、有关域名交易的申请与处理

  1. 适用于本域名交易的域名类型是什么?

  由中国互联网络信息中心负责注册管理,并提供解析服务的互联网络域名;

  2. 什么样的域名不可以进行域名交易?

  以gov.cn、edu.cn结尾及被禁止注册和限制注册的域名不能交易。

  3. 哪些类型的域名不能申请交易?

  a) 反对宪法所确定的基本原则的;

  b) 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;

  c) 损害国家荣誉和利益的;

  d) 煽动民族仇恨、民族歧视,破坏民族团结的;

  e) 破坏国家宗教政策,宣扬邪教和封建迷信的;

  f) 散布谣言,扰乱社会秩序,破坏社会稳定的;

  g) 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;

  h) 侮辱或者诽谤他人,侵害他人合法权益的;

  含有法律、行政法规禁止的其他内容的。

  4. 到哪里提出域名交易申请?

  可以到中国互联网络信息中心认证的域名交易服务机构提出申请。 例如:www.dnsdna.cn

  5 .申请域名交易卖方需要哪些材料?

  需要提交证明卖方为域名所有人的材料,具体材料以域名交易机构和注册服务机构的要求为准。

  6. 域名的密码怎样获得?

  每个注册服务机构的管理方式不同,域名密码可直接与注册服务机构联系。

  7. 域名交易的有效时间是什么?

  域名有效交易的时间范围为域名注册后的15日后到域名到期前15日前,即域名交易服务机构发出请求交易开始时间必须在域名注册后的15日后,域名交易结束时间必须在域名到期日前15日。

  8. 是否可以查询到域名交易情况?

  可以登录cnnic网站域名交易whois进行查询。同时,域名所有者可以通过我们的查询页面,输入域名和密码查询交易的详细信息。

  具体的见交易状态说明见名词解释。

  9. 交易完成后,多长时间可以过户成功?

  经注册服务机构验证成功后,注册服务机构应于15日内完成更改域名密码和修改相关注册人信息。

  10. 域名交易结束后,多长时间就能进行下次交易?

  只要域名状态为“正常”,就能进行下次交易,但要保证域名在有效交易时间内。

  11.域名密码与域名转移密码有什么区别?

  与域名交易密码相同。

  四、有关域名交易的更改及撤消

  12.是否可以撤销域名交易?

  可以在域名注册管理机构确认域名交易码之前,卖方均可与域名交易机构联系进行撤销。

  13.如果审核不通过后,交易如何再继续?

  如果审核不通过后,交易即被取消,不能继续交易。

  14.卖方没有确认域名交易,多长时间交易取消?

  若卖方因各种原因没有确认交易,14日之内交易超时,域名状态转为“正常”。

  五、交易费用的结转

  域名交易费用结算按照买卖双方和域名交易服务机构之间签订的三方协议为准。除此之外,在域名过户成功后,买方需要向域名注册服务机构缴纳一年域名费用 ,即续费一年。

  六、交易中涉及的其他问题

  15.没有收到系统发来的交易密码确认邮件怎么办?

  可以与域名交易管理机构联系,传真加盖卖方公章的申请补发交易密码确认邮件的申请。

  16.域名是否可以通过不同的域名交易机构申请交易?

  当域名交易机构发出交易请求后,其他交易服务机构不能再对该域名提交交易申请。

  17.交易过程中是否可以对域名信息进行修改?

  域名状态为“交易等待验证”状态时,域名注册人的信息可以更改;而在交易期间,域名状态变更为“交易进行中”,域名被锁定后,交易的域名信息均不能被修改;

  18.如果对已经交易完毕的域名有异议,如何处理?

  对已经完成的域名交易有异议的,可通过域名争议解决程序或任何法律程序加以解决。

  19.在交易过程中,需要注意以下事项:

  (1) 域名所有权属于卖方;

  (2) 域名状态设置为“正常”状态才能进行交易;

  (3) 提供的域名管理联系人的信息要真实准确,以保证能及时收到邮件;

  20.域名交易的好处

  (1) 培育和发展健康的域名交易市场;

  (2) 规范域名交易行为;

  (3) 促进域名资源的优化配置;

[ 2005/02/21 19:37 | by 网络毛毛虫 ]
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\Tds\Tcp, 看到那个PortNumber没有?0xd3d,这个是16进制,就是3389啦,我改...这个值是RDP(远程桌面协议)的默认值,也就是说用来配置以后新建的RDP服务的,要改已经建立的RDP服务,我们去下一个键值:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations这里应该有一个或多个类似RDP-TCP的子健(取决于你建立了多少个RDP服务),一样改掉PortNumber
一、   申请篇

(1)第一步

打开网站:http://www.hthost.net

(2)第二步



(3)第三步

Click here to open new window<br/>CTRL+Mouse wheel to zoom in/out

(4)第四步



(5)第五步

Click here to open new window<br/>CTRL+Mouse wheel to zoom in/out

(6)第六步

看到此画面就说明申请成功了
Click here to open new window<br/>CTRL+Mouse wheel to zoom in/out

(7)第七步

到邮箱收信

信的标题为: How to access your new HTHOST.NET account

信件内容:
Thank you for choosing HTHOST.NET!

Your Member ID is: im286@im286.com (登陆用户名)

Your new password is: im286 (登陆密码)

二、管理篇

1。FTP地址篇

(1)第一步

登陆站点:
https://admin.hthost.net  



(2)第二步

进入管理站点选项:



(3)第三步(查找FTP地址)






2。数据库篇

(1)第一步:进入



(2)第二步:建立



(3)第三步

提交完毕后,会看到这种图标,这时数据库还没建好,需要等几分钟

Click here to open new window<br/>CTRL+Mouse wheel to zoom in/out

(4)第四步
刷新后当看到这种图标时,说明数据库建立成功

Click here to open new window<br/>CTRL+Mouse wheel to zoom in/out

(5)第五步:查找数据库IP地址





这个就是你的数据库的IP地址,一般安装程序的时候默认的数据库地址是localhost,但是你用此空间安装程序的时候,需要将localhost改成这个IP地址(也就是说这个数据库是远程调用的)

(6)管理数据库:
数据库管理地址:https://admin.hthost.net/phpmyadmin/     (注意是https,不是http)






3。其他篇
还有其他功能,大家自己去琢磨吧,在主页面中,有如下图标,依次功能为:
(1)。管理EMAIL
(2)。管理子站点(注意:建立子站点以后,如果发现子站点的文件夹不能上传文件,请将XXX.IM286.COM的文件夹删除,再重新建立一个XXX.IM286.COM文件夹,再如果删除都不行,你就干脆把它改名,然后再建立XXX.IM286.COM文件夹)
(3)。管理站点文件
(4)。站点统计
(5)。还没试过


三、高级技巧篇

如果你感觉FTP太慢,那就用它提供的WEBFTP吧,里面有个上传ZIP压缩包就可以自动解压缩到服务器里

下面以安装DISCUZ论坛为例
(1)第一步:下载DISCUZ压缩包

http://www.discuz.net/viewthread.php?tid=97512&extra=page%3D1

(2)第二步:解压缩此文件




(3)第三步:由于DISCUZ论坛只需上传UPLOAD这个文件夹到服务器上,其他的文件夹不需要上传
所以我们只将UPLOAD文件夹做成压缩包(记住一定要做成ZIP格式的压缩包)






制作成果:




(4)第四步:打开WEBFTP页面,

Click here to open new window<br/>CTRL+Mouse wheel to zoom in/out

(5)第五步:上传









(6)第六步:查看上传结果

这时就能看到压缩包里的UPLOAD文件夹已经上传成功了




四、密码修改篇

当点右上角的Logout 退出系统的时候,系统就会强制要你修改密码


[ 2005/02/12 04:21 | by 网络毛毛虫 ]

一、硬件类(Hardware)
二、软件类(Software)
三、网络类(Network)
四、其它
CPU(Center Processor Unit)中央处理单元
mainboard主板
RAM(random access
memory)随机存储器(内存)
ROM(Read Only Memory)只读存储器
Floppy Disk软盘
Hard Disk硬盘
CD-ROM光盘驱动器(光驱)
monitor监视器
keyboard键盘
mouse鼠标
chip芯片
CD-R光盘刻录机
HUB集线器
Modem= MOdulator-DEModulator,调制解调器
P-P(Plug and Play)即插即用
UPS(Uninterruptable Power Supply)不间断电源
BIOS(Basic-input-Output
System)基本输入输出系统
CMOS(Complementary Metal-Oxide-Semiconductor)互补金属氧化物半导体
setup安装
uninstall卸载
wizzard向导
OS(Operation Systrem)操作系统
OA(Office AutoMation)办公自动化
exit退出
edit编辑
copy复制
cut剪切
paste粘贴
delete删除
select选择
find查找
select all全选
replace替换
undo撤消
redo重做
program程序
license许可(证)
back前一步
next下一步
finish结束
folder文件夹
Destination Folder目的文件夹
user用户
click点击
double click双击
right click右击
settings设置
update更新
release发布
data数据
data base数据库
DBMS(Data Base Manege
System)数据库管理系统
view视图
insert插入
object对象
configuration配置
command命令
document文档
POST(power-on-self-test)电源自检程序
cursor光标
attribute属性
icon图标
service pack服务补丁
option pack功能补丁
Demo演示
short cut快捷方式
exception异常
debug调试
previous前一个
column行
row列
restart重新启动
text文本
font字体
size大小
scale比例
interface界面
function函数
access访问
manual指南
active激活
computer language计算机语言
menu菜单
GUI(graphical user interfaces )图形用户界面
template模版
page setup页面设置
password口令
code密码
print preview打印预览
zoom in放大
zoom out缩小
pan漫游
cruise漫游
full screen全屏
tool bar工具条
status bar状态条
ruler标尺
table表
paragraph段落
symbol符号
style风格
execute执行
graphics图形
image图像
Unix用于服务器的一种操作系统
Mac OS苹果公司开发的操作系统
OO(Object-Oriented)面向对象
virus病毒
file文件
open打开
colse关闭
new新建
save保存
exit退出
clear清除
default默认
LAN局域网
WAN广域网
Client/Server客户机/服务器
ATM( Asynchronous
Transfer Mode)异步传输模式
Windows NT微软公司的网络操作系统
Internet互联网
WWW(World Wide Web)万维网
protocol协议
HTTP超文本传输协议
FTP文件传输协议
Browser浏览器
homepage主页
Webpage网页
website网站
URL在Internet的WWW服务程序上
用于指定信息位置的表示方法
Online在线
Email电子邮件
ICQ网上寻呼
Firewall防火墙
Gateway网关
HTML超文本标识语言
hypertext超文本
hyperlink超级链接
IP(Address)互联网协议(地址)
SearchEngine搜索引擎
TCP/IP用于网络的一组通讯协议
Telnet远程登录
IE(Internet Explorer)探索者(微软公司的网络浏览器)
Navigator引航者(网景公司的浏览器)
multimedia多媒体
ISO国际标准化组织
ANSI美国国家标准协会
able 能
activefile 活动文件
addwatch 添加监视点
allfiles 所有文件
allrightsreserved 所有的权力保留
altdirlst 切换目录格式
andotherinFORMation 以及其它的信息
archivefileattribute 归档文件属性
assignto 指定到
autoanswer 自动应答
autodetect 自动检测
autoindent 自动缩进
autosave 自动存储
availableonvolume 该盘剩余空间
badcommand 命令错
badcommandorfilename 命令或文件名错
batchparameters 批处理参数
binaryfile 二进制文件
binaryfiles 二进制文件
borlandinternational borland国际公司
bottommargin 页下空白
bydate 按日期
byextension 按扩展名
byname 按名称
bytesfree 字节空闲
callstack 调用栈
casesensitive 区分大小写
centralpointsoftwareinc central point 软件股份公司
changedirectory 更换目录
changedrive 改变驱动器
changename 更改名称
characterset 字符集
checkingfor 正在检查
chgdrivepath 改变盘/路径
chooseoneofthefollowing 从下列中选一项
clearall 全部清除
clearallbreakpoints 清除所有断点
clearsanattribute 清除属性
clearscommandhistory 清除命令历史
clearscreen 清除屏幕
closeall 关闭所有文件
codegeneration 代码生成
colorpalette 彩色调色板
commandline 命令行
commandprompt 命令提示符
compressedfile 压缩文件
conventionalmemory 常规内存
copydiskette 复制磁盘
copyrightc 版权(c
createdospartitionorlogicaldosdrive 创建DOS分区或逻辑DOS驱动器
createextendeddospartition 创建扩展DOS分区
createprimarydospartition 创建DOS主分区
createsadirectory 创建一个目录
currentfile 当前文件
defrag 整理碎片
dele 删去
deltree 删除树
devicedriver 设备驱动程序
dialogbox 对话栏
directionkeys 方向键
directly 直接地
directorylistargument 目录显示变量
directoryof 目录清单
directorystructure 目录结构
diskaccess 磁盘存取
diskcopy 磁盘拷贝
diskspace 磁盘空间
displayfile 显示文件
displayoptions 显示选项
displaypartitioninFORMation 显示分区信息
dosshell DOS 外壳
doubleclick 双击
driveletter 驱动器名
editmenu 编辑选单
emsmemory ems内存
endoffile 文件尾
endofline 行尾
enterchoice 输入选择
entiredisk 转换磁盘
environmentvariable 环境变量
everyfileandsubdirectory 所有的文件和子目录
existingdestinationfile 已存在的目录文件时
expandedmemory 扩充内存
expandtabs 扩充标签
explicitly 明确地
extendedmemory 扩展内存
fastest 最快的
fatfilesystem fat 文件系统
fdiskoptions fdisk选项
fileattributes 文件属性
fileFORMat 文件格式
filefunctions 文件功能
fileselection 文件选择
fileselectionargument 文件选择变元
filesin 文件在
filesinsubdir 子目录中文件
fileslisted 列出文件
filespec 文件说明
filespecification 文件标识
filesselected 选中文件
findfile 文件查寻
fixeddisk 硬盘
fixeddisksetupprogram 硬盘安装程序
fixeserrorsonthedisk 解决磁盘错误
floppydisk 软盘
FORMatdiskette 格式化磁盘
FORMatsadiskforusewithmsdos 格式化用于MS-DOS的磁盘
FORMfeed 进纸
freememory 闲置内存
fullscreen 全屏幕
functionprocedure 函数过程
graphical 图解的
graphicslibrary 图形库
groupdirectoriesfirst 先显示目录组
hangup 挂断
harddisk 硬盘
hardwaredetection 硬件检测
hasbeen 已经
helpfile 帮助文件
helpindex 帮助索引
helpinFORMation 帮助信息
helppath 帮助路径
helpscreen 帮助屏
helptext 帮助说明
helptopics 帮助主题
helpwindow 帮助窗口
hiddenfile 隐含文件
hiddenfileattribute 隐含文件属性
hiddenfiles 隐含文件
howto 操作方式
ignorecase 忽略大小写
incorrectdos 不正确的DOS
incorrectdosversion DOS 版本不正确
indicatesabinaryfile 表示是一个二进制文件
indicatesanasciitextfile 表示是一个ascii文本文件
insertmode 插入方式
insteadofusingchkdsktryusingscandisk 请用scandisk,不要用chkdsk
inuse 在使用
invaliddirectory 无效的目录
kbytes 千字节
keyboardtype 键盘类型
labeldisk 标注磁盘
laptop 膝上
largestexecutableprogram 最大可执行程序
largestmemoryblockavailable 最大内存块可用
lefthanded 左手习惯
leftmargin 左边界
linenumber 行号
linenumbers 行号
linespacing 行间距
listbyfilesinsortedorder 按指定顺序显示文件
listfile 列表文件
listof 清单
locatefile 文件定位
lookat 查看
lookup 查找
macroname 宏名字
makedirectory 创建目录
memoryinfo 内存信息
memorymodel 内存模式
menubar 菜单条
menucommand 菜单命令
menus 菜单
messagewindow 信息窗口
microsoft 微软
microsoftantivirus 微软反病毒软件
microsoftcorporation 微软公司
modemsetup 调制解调器安装
modulename 模块名
monitormode 监控状态
monochromemonitor 单色监视器
moveto 移至
multi 多
newdata 新建数据
newer 更新的
newfile 新文件
newname 新名称
newwindow 新建窗口
norton norton
nostack 栈未定义
noteusedeltreecautiously 注意:小心使用deltree
onlinehelp 联机求助
optionally 可选择地
or 或
pageframe 页面
pagelength 页长
pctools pc工具
postscript 附言
printall 全部打印
printdevice 打印设备
printerport 打印机端口
programfile 程序文件
pulldown 下拉
pulldownmenus 下拉式选单
quickFORMat 快速格式化
quickview 快速查看
readonlyfile 只读文件
readonlyfileattribute 只读文件属性
readonlyfiles 只读文件
readonlymode 只读方式
redial 重拨
repeatlastfind 重复上次查找
reportfile 报表文件
resize 调整大小
respectively 分别地
rightmargin 右边距
rootdirectory 根目录
runtimeerror 运行时出错
saveall 全部保存
saveas 另存为
scandisk 磁盘扫描程序
screencolors 屏幕色彩
screenoptions 屏幕任选项
screensaver 屏幕暂存器
screensavers 屏幕保护程序
screensize 屏幕大小
scrollbars 翻卷栏
scrolllockoff 滚屏已锁定
searchfor 搜索
sectorspertrack 每道扇区数
selectgroup 选定组
selectionbar 选择栏
setactivepartition 设置活动分区
setupoptions 安装选项
shortcutkeys 快捷键
showclipboard 显示剪贴板
singleside 单面
sizemove 大小/移动
sorthelp S排序H帮助
sortorder 顺序
stackoverflow 栈溢出
standalone 独立的
startupoptions 启动选项
statusline 状态行
stepover 单步
summaryof 摘要信息
swapfile 交换文件
switchto 切换到
sync 同步
systemfile 系统文件
systemfiles 系统文件
systeminfo 系统信息
systeminFORMation 系统信息程序
tableofcontents 目录
terminalemulation 终端仿真
terminalsettings 终端设置
testfile 测试文件
testfileparameters 测试文件参数
theactivewindow 激活窗口
togglebreakpoint 切换断点
tomsdos 转到MS-DOS
topmargin 页面顶栏
turnoff 关闭
unmark 取消标记
unselect 取消选择
usesbareFORMat 使用简洁方式
useslowercase 使用小写
useswidelistFORMat 使用宽行显示
usinghelp 使用帮助
verbosely 冗长地
videomode 显示方式
viewwindow 内容浏览
viruses 病毒
vision 景象
vollabel 卷标
volumelabel 卷标
volumeserialnumberis 卷序号是
windowshelp windows 帮助
wordwrap 整字换行
workingdirectory 正在工作的目录
worm 蠕虫
writemode 写方式
writeto 写到
xmsmemory 扩充内存

网络安全方面的专业词汇

Access Control List(ACL) 访问控制列表
access token 访问令牌
account lockout 帐号封锁
account policies 记帐策略
accounts 帐号
adapter 适配器
adaptive speed leveling 自适应速率等级调整
Address Resolution Protocol(ARP) 地址解析协议
Administrator account 管理员帐号
ARPANET 阿帕网(internet的前身)
algorithm 算法
alias 别名
allocation 分配、定位
alias 小应用程序
allocation layer 应用层
API 应用程序编程接口
anlpasswd 一种与Passwd+相似的代理密码检查器
applications 应用程序
ATM 异步传递模式
attack 攻击
audio policy 审记策略
auditing 审记、监察
back-end 后端
borde 边界
borde gateway 边界网关
breakabie 可破密的
breach 攻破、违反
cipher 密码
ciphertext 密文
CAlass A domain A类域
CAlass B domain B类域
CAlass C domain C类域
classless addressing 无类地址分配
cleartext 明文
CSNW Netware客户服务
client 客户,客户机
client/server 客户机/服务器
code 代码
COM port COM口(通信端口)
CIX 服务提供者
computer name 计算机名
crack 闯入
cryptanalysis 密码分析
DLC 数据链路控制
decryption 解密
database 数据库
dafault route 缺省路由
dafault share 缺省共享
denial of service 拒绝服务
dictionary attack 字典式攻击
directory 目录
directory replication 目录复制
domain 域
domain controller 域名控制器
domain name 域名
域名其实就是入网计算机的名字,它的作用就象寄信需要写明人们的名字、地址一样重
要。域名结构如下:计算机主机名.机构名.网络名.最高层域名。域名用文字表达,比
用数字表达的IP地址容易记忆。加入Internet的各级网络依照DNS的命名规则对本网内
的计算机命名,并负责完成通讯时域名到IP地址的转换 。
DNS 域名服务器
DNS(Domain Name System,域名系统)是指在 Internet上查询域名或IP地址的目录服务系
统。在接收到请求时,它可将另一台主机的域名翻译为IP地址,或反之。大部分域名系
统都维护着一个大型的数据库,它描述了域名与 IP地址的对应关系,并且这个数据库被
定期地更新。翻译请求通常来自网络上的另一台计算机,它需要IP地址以便进行路由选择。
DDE 动态数据交换
DHCP 动态主机配置协议
encryption 加密
EGP 外部网关协议
FDDI 光纤分布式数据接口
FAT 文件分配表
FTP(File Transfer Protocol) 文件传送协议
filter 过滤器
firmware 固件
flooding 淹没
GSNW NetWare网关服务
GDI(graphical device interface) 图形设备界面
GUI 图形用户界面
HTML 超文本标记语言
HTTP 超文本传送协议
IGP 内部安全性
ICMP(Internet Control Message Protocol) 网际控制报文协议
ICMP用来发送关于IP数据报传输的控制和错误信息的TCP/IP协议。当一个IP数据报不能传送
到目的地时,可能是因为目的地的机器暂停服务或者信息交通阻塞,路由器可能使用ICMP将
失败信息通知发送者。
IGMP(Internet Group Management Protocol,Internet群组管理协议)
这种TCP/IP协议允许Internet主机参加多点播送(multicasting)----一种向计算机群广播
信息的有效手段
IIS 信息服务器
IP(Internet Protocol) 网际协议
IRC 网上交谈
ISP 网络服务提供者
IPX 互连网分组协议
IPC 进程间通信
IRQ 中断请求
IP address IP地址
IP地址称作网络协议地址,是分配给主机的一个32位地址,由4个字节组成,分为动
态IP地址和静态IP地址两种。动态IP地址指的是每次连线所取得的地址不同,而静
态IP地址是指每次连线均为同样固定的地址。一般情况下,以电话拨号所取得的地址
均为动态的,也就是每次所取得的地址不同。
IP masquerade IP伪装
IP spoofing IP欺骗
LAN 局域网
LPC 局部过程调用
NNTP 网络新闻传送协议
PPP 点到点协议
称为点对点通信协议(Point to Point Protocol),是为适应那些不能在网络线上的使
用者,通过电话线的连接而彼此通信所制定的协议。
PDC 主域控制器
Telnet 远程登陆
TCP/IP 传输控制协议/网际协议
TCP/IP通信协议主要包含了在Internet上网络通信细节的标准,以及一组网络互连的协
议和路径选择算法。TCP是传输控制协议,相当于物品装箱单,保证数据在传输过程中不
会丢失。IP是网间协议,相当于收发货人的地址和姓名,保证数据到达指定的地点。
TFTP 普通文件传送协议
TFTP是无盘计算机用来传输信息的一种简化的FTP协议。它非常之简单,所以可固化在硬
盘上,而且支持无认证操作。TFTP是一种非常不安全的协议。
Trojan Horse 特洛伊木马
URL 统一资源定位器
UDP 用户数据报协议
VDM 虚拟DOS机
UUCP 是一种基于猫的使用已经很久的文件传输协议,有时候还使用它在Internet上传输
Usenet新闻和E-mail,尤其是在那些间断性联网的站点上。现在很少站提供匿名的UUCP来
存取文件。而它做为一种文件传输协议,只有那些没有入网而使用猫的用户使用此方法。
WWW 万维网
WWW(Word Wide Web)是Internet最新的一种信息服务。它是一种基于超文本文件的
交互式浏览检索工具。用户可用WWW在Internet网上浏览、传递、编辑超文本格式的文件。
WAN 广域网
virtual server 虚拟服务器
Usenet
用户交流网Usenet是网络新闻服务器的主要信息来源。Usenet完全是一个民间自发建立
的,使用Internet交换信息但又不完全依赖Internet进行通讯的用户交流网络。使用Usenet
的自愿者共同遵守一些约定的网络使用规则。
USER name 用户名
USER account 用户帐号
Web page 网页
OpenGL 开放图形语言
ODBC 开放数据库连接
PCI 外设连接接口
………………………………………………………………………………………………
authentication 认证、鉴别
authorization 授权
Back Office Microsoft公司的一种软件包
Back up 备份
backup browser 后备浏览器
BDC 备份域控制器
baseline 基线
BIOS 基本输入/输出系统
Binding 联编、汇集
bit 比特、二进制位
BOOTP 引导协议
BGP 引导网关协议
Bottleneck 瓶径
bridge 网桥、桥接器
browser 浏览器
browsing 浏览
channel 信道、通路
CSU/DSU 信道服务单元/数字服务单元
Checksum 校验和
Cluster 簇、群集
CGI 公共网关接口
CGI(Common Gateway Interface公用网关接口是一个可以产生相同结果或结果随用户输入
而变化的程序。它可以用一种解释性的界面语言编写,也可以用一种编译方式的编程语言
编写。CGI规定了Web服务器调用其它可执行程序的接口协议标准。Web服务器通过调用CGI程
序实现和Web浏览器的交互,也就是CGI程序接受Web浏览器发送给Web服务器的信息,进行处
理,并将响应结果再回送给Web服务器和Web浏览器。CGI程序一般完成Web网页中表单数据的
处理、数据库查询和实现与传统应用系统的集成等工作。CGI程序虽然可以用任何程序设计
语言编写,但是用C语言编写的CGI程序具有执行速度快、安全性高等特点。
CGI-based attack(基于CGI攻击)它利用公共网关接口的脆弱点进行攻击,通常借助www站
点进行
crash(崩溃) 系统突然失效,需要从新引导
CD-ROM 只读型光盘
Component 组件
data link 数据链路
datagram 数据报
default document 缺省文档
digital key system 数字键控系统
disk mirroring 磁盘镜像
distributed file system 分布式文件系统
data-driven attack(数据驱动攻击)依靠隐藏或者封装数据进行的攻击,那些数据可不被察觉
的通过防火墙。

DNS spoofing(域名服务器电子欺骗)攻击者用来损害域名服务器的方法,可通过欺骗DNS的高速
缓存或者内应攻击来实现的一种方式(通常为攻击者假扮合法的DNS服务器角色)
DoS(嘿嘿,可不是DOS哦,这个是deniad of service,极为服务拒绝)用户恶意使用网络信息服
务器时,将拒绝为合法的用户提供服务。
eavesdropping 窃听、窃取
encrypted tunnel 加密通道
enterprise network 企业网
Ethernet 以太网
External security 外部安全性
environment variable 环境变量
fax modem 传真猫
file attribute 文件属性
file system 文件系统
file 文件
FORM 格式
fragments 分段
frame relay 桢中继
firewall 防火墙
Firework(防火墙)是加强加 Internet 与 Intranetp(内部网)之间安全防范的一个或一组系统。防火
墙可以确定哪些内部服务允许外部访问,哪些外人被许可访问所允许的内部服务,那些外部服务可由
内部人员访问。为了使防火墙发挥效力,来自和发往 Internet 的所有信息都必须经由防火墙出入。
防火墙只允许授权信息通过,而防火墙本身不能被渗透。
gated daemon gated进程(好象是一种早期的UNIX寻径服务)
gateway 网关
global account 全局帐号
global group 全局组
group 组
group account 组帐号
group identifier 组标识符
HCL 硬件兼容性表
hash 散表
HPFS 高性能文件系统
Home directory 主目录
home page 竹叶
hop 驿站、中继段
host 主机
hyperlink 超文本链接
highjacking 劫持终端,即为攻击者捕获另一个用户会话的控制。这
是很少发生的,一旦发生就表明目标的安全性已经被破坏。
其实NetXRay在这一点就做的很好。
HTPASSWD 一种用密码来保护WWW(UNIX)上的站点的系统
icon 图标
impersonation attack 伪装攻击
index server 索引服务器
ISA 工业标准结构
Inherieted Rights Filter 继承权限过滤器
ISDN 综合业务数字网
interactive user 交互性用户
intermediate system 中介系统
internal security 内部安全性
Internet Explorer(IE) IBM的万维网浏览器
Internet server 因特网服务器
Interpreter 解释程序
intranet 内联网,企业内部网
intruder 入 侵 者
IMAP 一种邮件协议
是Internet Message Access Protocal 的缩写。IMAP 提供了一个在远程服务器上管理邮件的手
段,它与POP 协议相似,但功能比POP 要多,功能包括:只下载邮件的标题、建立多个邮箱和在
服务器上建立保存邮件的文件夹。
Java Virtual Machine Java虚拟机
java script 基于Java语言的一种脚本语言
jack in 一句黑客常用的口语,意思为破坏服务器安全的行为
kernel 内核
keys 密钥
keyspace 密钥空间
Keystroke Recorder(按键记录器) 一些用语窃取他人用户名和密码的工具
LAN Server 局域网服务器
Local security 局部安全性
log 日志、记录
logging 登录
logoff 退出、注销
logical port 逻辑端口
logon 注册
logon script 登录脚本
LFN 长文件名
logic bomb(逻辑炸弹)一种可导致系统加锁或者故障的程序或代码。
mass browser 主浏览器
MAPI
是Messaging Application Progrmming Interface 的缩写。微软和其它一些公司开发了MAPI,
可使Windows 应用程序接入到从Microsoft Mail 到Novell MHS的多种消息系统。但是, MAPI
仅限于在日常工作的水平上工作,即感知邮件的应用程序,它可在网络上交换邮件与数据。
member server 成员服务器
menu 菜单
message 消息
multilink 多链接
MIME 多媒体Internet邮件扩展
MPR 多协议路由器
multiprocessing 多重处理
Module 模块
multihomed host 多穴主机
MUD
MUD的英文全名是Multiple User Dimension、Multiple User Dialogue或
Multiple User Dungeon,译为“多人世界”、“多人对话”或“多人地牢”,
俗称“泥巴”游戏。
named pipes 命名管道
NDS NetWare目录服务
NetBEUI NetBIOS扩展用户接口
NetBIOS gateway NetBIOS网关
NetWare 网络操作系统(不好意思,我忘了是那个公司开发的了)
network 网络
NetBIOS 网络基本输入/输出系统
NDIS 网络驱动程序接口规范
NetDDE 网络动态数据交换
NIC 网络接口卡
network layer 网络层
Network Monitor 一个网络监控程序
network operating system 网络操作系统
network printer 网络打印机
network security 网络安全
network user 网络用户
NFS 网络文件系统
node 节点
npasswd UNIX的一种代理密码检查器,在提交给密码文件前,它将对潜在的密码进行筛选。
OSPF 开放最短路径优先协议
OSI Model 开放系统互连模式
out-of-band attack 带外攻击
packet filter 分组过滤器
password 口令
path 路径
payload 净负荷
PBX 专用交换机
PCS 个人通信业务
peer 对等
permission 权限
plaintext 明文
PPTP 点到点隧道协议
port 端口
prority 优先权
protocol 协议
potential browser 潜在浏览器
POP 互联网电子邮件协议标准
是Post Office Protocol 的缩写,是互联网电子邮件协议标准。我们可以通过有POP
服务功能的主机传送及接收电子邮件。该协议的缺陷是,当你接收电子邮件时,所有
的信件都从服务器上清除,下载到你的本地硬盘。当然也有一些客户端程序可以将电
子邮件留在服务器上,或设置成超过一定大小的文件不可下载。随着邮件采用多媒体
格式,邮件会越来越大,我们希望能够灵活掌握下载什么文件、何时下载,这就需要
IMAP 协议。目前POP的版本为POP3。
process 进程
proxy 代理
proxy server 代理服务器
代理服务就是代理Web用户去取得资料回来,通常使用WWW软件要去连结远方的终端取得资
料时,必须送出要求信号然后再一个字节一个字节的传送回来。有了proxy的设定以后,要
求资料的信号会先送到Proxy Server。当Proxy Server得到用户的请求时,首先会到cache
中寻找有没有同样的资料,如果有,就由Proxy Server直接将资料传给用户,如果cache没
有资料,Proxy Server就会利用网络上所可以使用的频宽,到远端站台取回资料,一边储存
在cache中,一边传送给用户。即使线路阻塞,还是比用户自己直接抓取要来得快速的。
paseudorandom 伪随机
phreaking 指控制电话系统的过程
RAS 远程访问服务
Remote control 远程控制
RPC 远程过程调用
remote boot 远程引导
route 路由
router 路由器
routing 路由选择
RIP 路由选择信息协议
routed daemon 一种利用RIP的UNIX寻径服务
routing table 路由表
R.U.P 路由更新协议
RSA 一种公共密匙加密算法。而RSA也许是最流行的。
script 脚本
search engine 搜索引擎
SSL 安全套接层
secure 密码
SID 安全标识符
sender 发送者
SLIP 串行线网际协议
server 服务器
server-based network 基于服务器的网络
session layer 会话层
share、sharing 共享
share-level security 共享级安全性
SMTP 简单邮件传送协议
SNMP 简单网络管理协议
Site 站点
SCSI 小型计算机系统接口
snffer 检错器
snooping 探听
standalone server 独立服务器
strong cipher 强密码
stream cipher 流密码
strong password 强口令
SQL 结构化查询语言
subnet mask 子网掩码
subdirectory 子目录
subnet 子网
swap file 交换文件
SACL 系统访问控制表
S/Key 安全连接的一次性密码系统,在S/Key中,密码从不会经过网络发送,因此不可能被窃取。
sniffer(嗅探器) 秘密捕获穿过网络的数据报文的程序,黑客一般用它来设法盗取用户名和密码的。
spoofing(电子欺骗) 任何涉及假扮其他用户或主机以对目标进行未授权访问的过程
time bomb(时间炸弹) 指等待某一特定时间或事件出先才激活,从而导致机器故障的程序
TCPDUMP 是UNIX中捕获数据包的实用工具,常被用语获得详细的网络通信记录的。
Traceroute 一个UNIX上的常用TCP程序,用语跟踪本机和远程主机之间的路由
T0,DS0 56或者64kbps
T1,DS1 24路PCM数字话,总速率为1.544Mbps
T3,DS3 28个T1信道,作品能够速率为44.736Mbps
thin client 瘦客户机
thread 线程
throughput 吞吐量
transport layer 传输量
Transport Protocol 传输协议
trust 信任
tunnel 安全加密链路
vector of attack 攻击向量
Virtual directory 虚目录
Virtual Machine 虚拟机
VRML 虚拟现实模型语言
volume 文件集
vulnerability 脆弱性
weak passwurd 弱口令
well-known ports 通用端口
workstation 工作站
X.25 一种分组交换网协议
zone transfer 区域转换


[ 2005/02/09 23:17 | by 网络毛毛虫 ]
环境:win2003server
目的:php4.3.10/PHP 5.0.2+apache2.0.52+mysql4.1.9+zend+serv-u
我找了那么多文章没有可以让我满意的,下面是我的配置手记,可以让很多人方便地配置服务器,虽然win2003下跑php觉得很奇怪,呵呵

apache_2.0.52-win32-x86-no_ssl.msi
php-4.3.10-Win32.zip
mysql-noinstall-4.1.9-win32.zip
phpMyAdmin-2.6.1
zend 2.5.7
HF-ServU6002-LDR.zip
诺顿

1,安装apache_2.0.52-win32-x86-no_ss
比如将其安装在d盘,安装过程就不用说了,NEXT就可以,安装完了就可以在任务栏的地方看将这样的图标 ,表示已经启动成功。打开网页

http://127.0.0.1,出现安装成功的页面。

接下来对 Apache 的配置文件进行配置,使其支持PHP,用记事本打开 Apache2\conf\下的 httpd.conf 文件,找到:
DirectoryIndex index.html index.html.var
在后面加  index.php :
DirectoryIndex index.html index.html.var index.php
为了使 Apache 识别 PHP 的相关扩展名,找到:
<Directory "D:/Apache2/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

在后面添加如下两行:
AddType application/x-httpd-php .php .phtml .php3 .php4
AddType application/x-httpd-php-source .phps
指定 php 模块,找到并定位到如下这行:
#LoadModule ssl_module modules/mod_ssl.so
在下面添加:
如果是php5
LoadModule php5_module D:\PHP\php5apache2.dll
  使它指向 PHP5 目录下的 php5apache2.dll 文件,路径一定要准确。
  为了指定 Apache 识别中文,我们指定 GB2312 为默认编码。应该找到并定位到下面这行
如果是php4
LoadModule php4_module d:/php/sapi/php4apache2.dll



找到:AddDefaultCharset ISO-8859-1
将其修改为:
AddDefaultCharset GB2312

保存 httpd.conf 重起 Apache


2.php(gd+iconv+curl)
php4的话
下载 php-4.3.10-Win32.zip
解压缩到你的d盘(举例),文件夹命名为php,
把目录下的php.ini-recommended改名为php.ini放到C:\WINDOWS下
把dlls下需要的东西拷贝到你的system32下:
如果要iconv就拷个iconv.dll过去
然后比如在php.ini中把
;extension=php_gd2.dll
;extension=php_curl.dll
;extension=php_iconv.dll
前的“;”去掉就支持gd+iconv+curl了
找到; Directory in which the loadable extensions (modules) reside.

设置 extension_dir = "D:\PHP\extensions\"




如果安装PHP 5.0.2
将下载来的 PHP5 RC3(php-5.0.0RC3-Win32.zip) 解压缩到 D:\PHP\ 目录下。复制 D:\PHP\ 目录下的 php5ts.dll 文件到 C:\windows\
  复制 D:\PHP\ 目录下的下列 dll 文件于 C:\windows\system32\ 目录下:
  fdftk.dll
  fribidi.dll
  gds32.dll
  libeay32.dll
  libintl-1.dll
  libmhash.dll
  libmysql.dll
  libmysqli.dll
  ntwdblib.dll
  ntwdblib.dll
  yaz.dll
  其中 libmysql.dll 为 MySQL 4.1 之前版本的扩展支持,libmysqli.dll 为 MySQL 4.1 之后版本的扩展支持。因为我上面下载的是

MySQL 4.0.20 ,所以其实复制 libmysql.dll 即可。
  复制 C:\PHP5\ 目录下的 php.ini-dist 文件到 C:\windows\ 目录下,并改名为 php.ini ,并用记事本打开编辑:
  定位到下面两行:
; Directory in which the loadable extensions (modules) reside.
extension_dir = "./"
  修改下面一行使它指向 D:\PHP\ext\ 目录,修改后如下:
; Directory in which the loadable extensions (modules) reside.
extension_dir = "D:\PHP\ext\"

测试 PHP 是否配置成功:

  打开记事本,输入如下这行代码:
<?php phpinfo(); ?>
保存为 phpinfo.php 文件,存放于 Apache2\htdocs\ 目录下,好了,打开浏览器,在地址栏中输入: http://localhost/phpinfo.php 并回

截图就算了,太大,太长了
到此 PHP 的配置大功告成.

3.安装mysql-noinstall-4.1.9-win32
假设把它解压到D:\mysql目录下,在cmd下打开该目录下的bin文件夹,
然后 mysqld-nt install 把MYSQL安装为服务


让php5加载mysql的办法
COPY php.ini 到winnt目录下
增加如下语句到以下位置
extension_dir = d:php5ext
;Windows Extensions
去除;extension=php_mysql.dll的分号
COPY libmysql.dll到winntsystem32目录下

4,安装phpMyAdmin-2.6.1
打开phpmyadmin下的config.inc.php文件
$cfg['Servers'][$i]['host'] = 'localhost'; // MySQL hostname or IP address
$cfg['Servers'][$i]['auth_type'] = 'config'; // Authentication method (config, http or cookie based)?
$cfg['Servers'][$i]['user'] = 'root'; // MySQL user
$cfg['Servers'][$i]['password'] = ''; // MySQL password (only needed
// with 'config' auth_type)
将host,user和password修改成你自己的IP地址,用户和密码


  如果是php4,phpMyAdmin可能会提示:
php_mbstring extension找不到(把php.ini里面;extension=php_mbstring.dll的前面的";"去掉就可以--别忘记重起apache)
$cfg['PmaAbsoluteUri'] 没有设置(直接$cfg['PmaAbsoluteUri'] = '你的路径';)
解决Client does not support authentication protocol  2005-02-08 12:55:51 Post by: clinch  view:2

好多朋友升级了mysql为4.10以上会发生此错误,php4.x下phpmyadmin之类的程序连接不上数据库,是因为mysql4.10以上改变了用户密码验证协

议,php的连接模块也需要更换新的,php5默认就是这种新的连接模块...

不想更换可以这样:
CODE  
# SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
# FLUSH PRIVILEGES;



5,安装Zend
直接装ZendOptimizer-2[1].5.7-Windows-i386,按提示,下去就可以完成了
不过他会自己写进去你的php.ini一些东西哦,可以不管

6,安装Serv-U 6.0.0.2和诺顿服务器版本
这一步和顺序无关,想装就装吧
这个直接安装就可以,安装汗化和破解版本
看中文就知道什么意思了

好了,现在一个最新的服务器环境配置就搞定了

 
分页: 8/15 第一页 上页 3 4 5 6 7 8 9 10 11 12 下页 最后页 [ 显示模式: 摘要 | 列表