1.1 IIS的前世今生
通过了解IIS的历史,读者可以理清IIS的发展脉络,更深入地了解IIS的特性。
1.1.1 IIS的历史
微软Internet信息服务(Internet Information Service,IIS),是在Windows平台上提供的一款微软官方的Web容器服务。打一个形象的比喻,IIS在Windows上的作用等同于Apache服务在Linux服务器上的作用,缺少了IIS,Windows操作系统就无法向用户发布Web网站。
IIS是一个支持HTTP协议和FTP协议的Web服务器。仅靠IIS本身是没办法直接运行ASP.NET或PHP等Web应用程序的,这点也和Apache类似,它需要有Tomcat的参与才能运行JSP技术的动态网站;IIS也需要ASP.NET平台的配合才能运行ASP.NET Web应用程序。
IIS作为一种操作系统内建的服务程序,是随着Windows操作系统一同发布的,每当有新版本的Windows服务器操作系统发布,就会有新版本的IIS随之发布。从1993年第一个版本算起,至今已经历经12个版本,22年的时间,以下是IIS各个版本的演进简史:
IIS的第一个版本1.0是在1993年随着Windows NT 3.5.1介质作为免费插件的形式发布的。
IIS 2.0随着Windows NT 4.0操作系统一同发布。
IIS 3.0随着Windows NT 4.0 Service Pack2介质发布,并首次支持了微软ASP技术(微软第一种动态页面技术),使得程序员可以开发动态页面服务。
IIS 4.0随着Windows NT 4.0 Option Pack发布,并为用户提供了IIS管理控制台程序,使得管理员可以可视化地管理IIS。
IIS 5.0随着Windows Server 2000发布,支持了多种验证方式和WebDAV协议,并改进了ASP技术。
IIS 5.1随着Windows XP Professional发布,功能与IIS 5.0类似。
IIS 6.0随着Windows Server 2003和Windows XP Professional 64位版本一同发布,对IIS的工作进程做了重大改进,支持了多种验证方式,并启用w3wp.exe作为Web网站工作进程容器。
IIS 7.0随着Windows Vista和Windows Server 2008发布,IIS 7.0是一个完全重新设计的版本,IIS 7.0将IIS进行了组件化设计并极大地提升了IIS性能。
IIS 7.5随着Windows 7和Windows Server 2008 R2发布,把命令行工具改为PowerShell实现。
IIS 8.0随着Windows 8和Windows Server 2012发布,支持NUMA架构,并改进了应用程序池初始化的性能。
IIS 8.5随着Windows 8.1和Windows Server 2012 R2发布,增强了IIS日志功能,并首次支持了ETW日志,同时改进了应用程序池空闲和工作状态切换的性能。
IIS 10随着Windows 10和Windows Server 2016发布,完美支持HTTP 2.0。
1.1.2 IIS各个版本的重要演进
进入21世纪以来,IIS最主要的版本是IIS 5.0到IIS 8.5这几个版本。IIS从一个青葱少年变得日臻成熟,逐渐成为Web容器的主力军,在Web容器市场占有了较大份额。下面将归纳几个版本的重要演进。
1. 持续改进的IIS工作进程
在IIS 5.0以前的版本,Web网站的工作进程(Web网站也是一段程序,也需要在进程中运行)都是IIS自身服务程序进程InetInfo.exe。IIS管理服务代码和Web网站业务逻辑代码混在一起的弊端是:当有一方代码出现严重问题,例如指针越界错误,就会导致IIS服务和Web网站一起崩溃;另一个缺点是IIS服务管理代码占用了部分进程内的资源,使得Web网站代码申请资源会受到不同程度的限制。
IIS 5.0版本对Web网站的工作进程作出了重大改进:把Web网站工作进程与IIS服务进程做了分离,使用DLLHost.exe作为Web网站代码的宿主进程,InetInfo.exe仅作为IIS管理服务代码的运行进程。但是DLLHost.exe进程是Windows操作系统上通用的DLL宿主进程,并没有对Web网站的运行场景作出优化。
IIS 6.0以后的版本将IIS工作进程改进为w3wp.exe,内含专门运行代码的线程和专门负责I/O的线程,该工作进程在以后的版本中被固定了下来。
2. 配置文件增加可读性和移植性
早期的IIS功能单一,配置项较少,配置文件仅用来保存简单的设置数据。随着IIS功能的扩展,可配置项越来越多,并且IIS越来越多地需要在负载均衡群集内进行部署,这使得IIS配置文件内保存的配置项越来越多,并且需要支持在Web服务器之间互相移植。从IIS 6.0起,IIS配置文件从二进制格式转变为Metabase.xml的XML格式文件。从IIS 7.0起,XML格式的配置文件变成三个XML文件,并保存在单独的Config文件夹中。使用XML格式保存配置项便于管理员阅读和排错,更方便配置文件在Web服务器之间互相复制移植。
3. 不断地提高Web网站的运行性能
IIS把网络I/O操作从用户态迁移到内核态,使用专门的w3wp.exe进程来运行Web网站,对64位计算的支持和对应用程序池对象的功能的改进等方面都是为了不断地提升Web网站在IIS上运行的性能。
4. 组件化的设计和丰富的接口使IIS越来越开放
自IIS 7.0起,IIS使用组件化设计并提供了丰富的扩展接口,这使得IIS变得越来越开放了。当今的IIS不仅能支持微软自己的ASP.NET动态页面技术,第三方也可以通过编写ISAPI扩展的形式支持其他的动态页面技术。目前已经可以运行在IIS上的有PHP、Python、ActivePerl、Ruby,甚至是JSP。