Web服务器的性能和可靠性问题绝大部分是由于质量低劣的Web应用造成。inetinfo.exe运行在用户态下,应用程序失进程本身下运行败会导致inetinfo.exe挂起,IIS服务失效。过去的IIS被设计成为只有一个进程--inetinfo.exe,IIS在用户模式下运行,运行在用户模式下的应用程序不直接与硬件通信,它们调用的winsock,winsock将数据传入内核模式的组件(例如网卡驱动程序)。
毛病1:
从性能上,inetinfo进程作为用户态进程工作。用户模式和内核模式之间的转换是一项开销很大的操作。服务器首先从内核模式的TCP/IP栈将传入的HTTP请求传递给用户模式的Winsock,由Winsock将请求传递给IIS。这叫Context Switching
毛病2:
违背了操作系统稳定性的基本原则:
1 把系统代码和用户代码隔离;
2 把应用程序进行隔离。
web服务的所有组成部分都运行在inetinfo.exe,包括系统代码,也包括用户代码。
对质量低劣的代码优化,对提供虚拟主机的ISP来说,通常一台服务器上承载多个web应用, 不可能ISP来排错, 一个web应用出问题,会株连九族。还有客户代码和操作系统代码在共享同一个进程,应用代码有可能对系统代码造成威胁,黑客可能使自己的代码让inetinfo执行一些底层的系统操作,同时inetinfo以system系统权限运行,因此缓冲区溢出会使入侵者获得system权限,进行任何操作。
IIS 5.0减轻这类问题。在IIS 5.0中,我们可以将应用程序保护设置为低级(IIS进程)、中级(缓冲池)、高级(隔离),在IIS 5.0中,应用一旦崩溃,一般不会波及到IIS本身,因为应用程序在Inetinfo之外的进程中运行,但所有Web应用都会终止——在默认情况下,应用程序保护是中级,所有的应用程序都在一个DLLhost.exe池之中运行。在这种情况下,排解故障很不容易,因为要确定哪一个应用程序导致了问题非常困难。就算你程式隔离设成'高'(web应用隔离在多个dllhost.exe的进程中,这要消耗很多资源),这dllhost.exe 只负责动态程式。比如说asp程式。 在IIS5.0,Static 内容是由inetinfo.exe负责,比单一进程内运行速度要慢,因为很多应用程序的执行还是依赖inetinfo,会有更多的context switching, 崩溃的应用虽然不会对其它进程中的应用,但是还是无法恢复,仍要对整个inetinfo重启,来重启崩溃的应用,也没解决安全问题(inetinfo仍然使用System特权)还有,但如果我们想要在一个池(一个dllhost.exe的实例)中运行两个应用程序,在另一个池(另一个dllhost.exe的实例)中运行另外两个应用,该怎么办?IIS 5.0没有提供命名dllhost.exe实例的途径,因而也就不能将两个特定的应用放入某个池运行。
IIS6.0全新的设计:
(1)IIS 6.0体系设计中最重大的变化是加入了http.sys驱动程序。
在Win 2K和NT 4.0中,用户模式和内核模式之间的转换是一项开销很大的操作,服务器首先从内核模式的TCP/IP栈将传入的HTTP请求传递给用户模式的Winsock,由Winsock将请求传递给IIS。从内核模式到用户模式的切换很快发生,但不可避免地给处理过程带来瞬间的延迟。当负载较大时,这种延迟不断累加,同时由于这种转换是必不可少的,所以管理员根本没有办法优化处理过程。
IIS 6.0体系设计中最重大的变化是加入了http.sys驱动程序,http.sys驱动程序的任务是处理HTTP请求,而且它在内核模式下执行操作。不要小看这一改变,将处理HTTP请求的任务从IIS 5.0、IIS 4.0的用户模式改变到IIS 6.0的内核模式标志着新一代IIS服务器的诞生。微软在http.sys驱动程序中采用了许多优化的算法, http.sys直接从应答缓冲区提取静态内容,不必再切换到用户模式。
(2)WAS组件运行在用户态,非共享的svchost.exe中,IIS初始化时, WAS读取Metabase信息,初始化http.sys路由表(如何根据客户请求的url把请求传递到相应的应用程序池Z)。在IIS运行时,负责工作进程管理。在IIS 6.0中,W3SVC作为一个独立的进程运行,Web应用的故障不可能波及W3SVC,因为W3SVC之内根本没有第三方的代码运行。W3SVC总是处于运行状态,因此它能够监视Web应用的健康状况,并在必要时采取行动。由于这一策略,服务器能够根据用户指定的参数监视和重新启动应用程序。
(3) 默认情况下,IIS 6.0在工作进程隔离模式下运行,在这种模式中,对于每一个Web应用,IIS 6.0都用一个独立的w3wp.exe的实例来运行它。w3wp.exe也称为工作进程(Worker Process),或W3Core。 可靠性的提高是因为一个Web应用的故障不会影响到其他Web应用,也不会影响http.sys,每一个Web应用由W3SVC单独地监视其健康状况。安全性的提高是由于应用程序不再象IIS 5.0和IIS 4.0的进程内应用那样用System帐户运行,默认情况下,w3wp.exe的所有实例都在一个权限有限的“网络服务”帐户下运行,必要时,还可以将工作进程配置成用其他用户帐户运行。如果缓冲区溢出攻击成功入侵了一个Web应用,攻击者只能访问当时运行工作进程的帐户有权访问的资源,默认的网络服务帐户不能写入Inetpub文件夹,执行权限也极其有限,所以象CodeRed蠕虫之类的攻击根本不可能得逞。 在工作进程隔离模式中,IIS可以配置成定期重新启动应用程序池中的工作进程,从而更好地管理那些有错误的工作进程。这确保了池中的应用程序运行正常,并且可以恢复丢失的系统资源。
(4)另一个与应用程序池有关的特性是,IIS 6.0允许将应用程序池配置成一个Web园(Web Garden)。每个应用程序池默认情况下只有一个工作进程工作,但管理员可以设定多个工作进程来为同一个应用池工作。web garden是在同一台服务器内。来自客户的请求通过http.sys在多个工作进程之间进行平均分配,同时自动排除故障的工作进程。Web花园提供了相对简易的WEB集群。web garden 其实是一个应用程序的池(application pool), 多个进程在该池中处理web 请求。
(5) inetinfo.exe负责所有www以外的服务和metabase
还有些特点:
1 在管理方面,改良了IIS元素数据库,使用xml格式。可以直接用。
2 另外也支持Remote Desktop 及 HTMLA - 可以完全控制IIS服务器
3 支持的最大并发进程2000, iis5.0支持的最大并发进程为80(同一台服务器同时运行更多的站点)
4 另外值得一谈的是IIS6.0默认是安全模式,不用urlscan, urlscan功能很多都包含在里头了,默认只能运行html,asp, axp.net全都禁止
5 另外还有新的Ftp user isolation mode, 让管理员可以把用户目录设置成根目录,让用户无法 cd .. 看到其他用户目录。