IIS 7 部署指南
时间:2011-01-28 来源:飞鸿逝影
由于我的机器上装的是win7的系统,IIS是7.5的,所以讲到部署的时候,所指的IIS及图中所涉及到的IIS都默认是在IIS7.5下。
不过,即使使用Windows Server2008或者其他的装了IIS7的系统,在部署上也没有什么差别。
此文分两部分,前一部分说明基础的部署过程,后一部分进行更更详细的讲述,包括一些原理性的东西,以帮助理解。
IIS7基础部署过程
部署IIS按照,一般情况下,按照以下步骤进行:
1 安装IIS。
控制面板》程序和功能》打开或关闭Windows功能,确保已选中“Internet信息服务”项。
完成之后,打开IIS管理器,界面如下图所示,
注意图中“Web平台安装程序”(Microsoft Web Platform Installer)不是必需的。
2 部署站点。
“添加网站”,弹出如下图所示的“添加网站”对话框:
网站名称:指定网站的名称;
应用程序池:建议采用默认的应用程序池,即自动创建的应用程序池,名称与网站名称相同。
物理路径:即要部署的Web站点的物理路径;
传递身份验证:选择“应用程序用户”即可,一般而言无远程控制管理等特定需求的话,无需指定特殊用户;
类型:一般选择“http”,如果是安全连接(用SSL加密)则采用“https”,其他的我没用过;
IP地址:不指定的话,默认就是本机的IP;
端口:指定访问端口,不要与已有站点的端口重复,最好也不要与本机其他应用程序所使用的端口重复,
可使用DOS下的netstat命令查看当前正在使用的端口;
主机名:可以不填写,不过作为网站类应用程序而非基础应用平台的话,最好填写。
立即启动网站:勾选此选项,则站点会立即启动,如果端口与已有启动网站的端口相同,则不会启动。
设置完成之后,点击“确定”,则添加了一个新的站点,如下图所示:
3 进行相关设置
其一,检查“.NET编译”,如下图:
打开如下所示的界面:
如果站点中的某些文件(例如App_Code文件夹中的文件)如果是用C#编写的,则选择“C#”。
其二,设置应用程序池,如下图所示,点击左边的“应用程序池”,在右边
的列表中找到刚才创建的RainfeSoft应用程序池,选择图中所示的选项,弹出如下窗口。
选择所使用的.NET Framework版本,并设置托管管道模式。对于老的站点建议采用经典模式,
这样就不需要做太多的改动,对于ASP.NET 4.0的站点,建议用集成模式。关于这一点,后半部分将做详细的说明。
其三,设置权限。对于有上传下载的站点而言,权限的设置尤其重要。如下图,右击站点,点击“编辑权限”。
弹出如下窗口:
此处的配置跟IIS6.0相似。
至此,Web站点的基本设置已经完成。对于需要进行的一些特殊处理,如模块映射等等,将在下面的这一部分涉及。
IIS7部署详细探讨
从操作上来讲,IIS7的部署跟以前IIS6的部署的差别不是很大,主要的不同点是,IIS7在部署上的操作界面等都更加友好。
下面主要阐述细节处理上的一些比较重要的地方。
l 模块(Module)
IIS7 Web服务器的核心特性集已经组件化成30多个模块了,给部署带来了极大的灵活性。这些模块,要么是Win32的dll,
要么是包含.NET 类型的程序集(之所以没说成是dll,是因为现在dll的概念已经较当初的概念有所变化,
传统上所指的dll是可执行文件或者动态链接库文件,而在.NET中特指.NET程序集文件,
详见《Applied Microsoft .NET Framework Programming》),通常前者被称为本机模块,后者被成为托管模块,
这里的模块不是动态建模或者业务模块中的那个模块,这里可以理解为一个HttpModule。
要提供某些功能,则必须配置甚至开发某些模块,处理程序映射。
例如,我们的项目在开发中用到了服务器端包含指令#include,那么我们就必须给所请求的相关文件配置ServerSideIncludeModule,
使得服务器能够正确的解析.inc文件,那么在IIS6中我们的做法是配置一个相关的扩展名文件到ssinc.dll的映射,
其他的依此类推。如果在项目中继承IHttpModule实现了自己的模块,在IIS7中集成模式下,要启用这个模块,
就必须在“模块”中进行此模块的映射配置,如下图:
右击“模块”》“打开功能”,弹出如下界面:
在此处添加你所开发的模块即可。
下面进一步详述模块。
在IIS7中模块有全局模块和局部模块,全局模块的配置对服务器上的所有站点生效,而局部模块仅仅对某个站点生效。
如果希望Web服务器上的所有应用程序都使用这个模块,在需要这全局范围内注册该模块,使其对服务器上的每个工作进程生效。
注意,全局的模块的配置一般而言仅对本机模块才有必要,因为涉及到代码执行的安全性问题,所以需要管理员权限。
关于这个细节,做ASP.NET控件开发的人可能比较清楚,在反编译微软自己的Web控件或者第三方控件的时候,
经常看到控件类的上方写了一个AspNetHostingPermissionAttribute,并指定了他的两个枚举类型属性,
分别是SecurityAction和AspNetHostingPermissionLevel枚举。此特性,可能在控件开发中用的不多,
因为不进行设置的话默认继承Control类的该类特性,但是对于开发上传下载控件而言,此特性就很值得关注。
注意,在此强调一下,配置本机模块需要管理员权限,对于服务器工作进程的所有可用的资源而言,
本机代码拥有无节制的访问权限,这意味着,在配置这样的模块时,你必须确保你的模块不包含任何恶意的代码,否则后果很严重。
另外,配置此模块,对应的将是对%windir%\System32\inetsrv\config\applicationHost.config中<globalModules>配置节的更改,
所以你需要备份此文件(对于环境变量,用set命令在DOS下查看即可)。其实,前面所将的配置,
以及后面即将提到的一些配置都是对配置文件的更改,如果你熟悉底层细节,不用弄的这么复杂,直接改动相应的配置文件即可。
那么,对于配置局部模块,只需要点击具体的站点,再双击“模块”即可,过程与上面的类似,
不过这些配置只写到当前站点的配置文件中,即web.config中。顺带说一下,集成模式和经典模式下,
配置文件的格式稍有不同,特别是在模块的配置上,细节的话参见MSDN。
IIS
根据Http协议,我们知道,当用浏览器向Web服务器发送一个请求的时候,服务器返回一个响应文件,
通常叫做响应报文,包含状态行、响应头和响应体,浏览器解析其中的html标签,最终将文件中的信息显示处理。
这期间,IIS就负责接收请求并将请求到的结果回应到客户端,并产生日志,如果配置了的话。IIS保存了本地文件的信息,
诸如那些文件的安全级别,如何将文件隔离到不同的应用程序中,哪个地址该映射到哪个应用程序,等等。
如今的IIS采用工作进程隔离模式,不同于以往的IIS隔离模式。工作进程隔离模式渗透到了IIS6及其以后版本的各个核心组件当中,
当以此模式运行时,我们才能将应用程序指派到不同的应用程序池当中。一个应用程序池中的每个应用程序共享相同的工作进程,
每一个工作进程都有一个可执行的工作进程实例,即我们常看到的w3wp.exe,因此,当一个应用程序池中的应用程序崩溃的时候,
就不会影响到其他池中的应用程序,World Wide Web Publishing Service服务和IIS Admin service服务能够继续运行,
http.sys能够正常的加载。工作进程是运行于用户模式(与内核模式相对应)下的一个应用程序,其作用包括处理请求返回静态页、
调用ISAPI扩展或过滤、运行CGI处理程序,它由WWW Service Administration 和 Monitoring来控制管理。
IIS通常默认以NetworkService角色的身份来运行,在win7下是IIS_IUSERS,此角色拥有站点访问的最低限度的权限。
经典模式与集成模式
前面多次提到经典模式和集成模式,但是一直没有进行深入的说明。
集成模式是IIS7以后才有的,在这以前所使用的都属于经典模式。经典模式仅支持本机代码,
如果需要支持托管代码,则需要安装Web服务扩展,这就是我们在Windows Server 2003上的IIS管理器中所看到的,
Web服务扩展中列出了ASP.NET v2.0等Web服务扩展。
常在Asp.net2.0和Asp.net4.0之间用aspnet_regiis.exe –iru命令切换的人印象应该很深刻。
不过托管模块的那套身份验证诸如windows身份验证,form身份验证就只有托管代码才能直接使用,
像.html及.xml等后缀名的文件是没法直接使用的,需要进一步的配置才行。原因很简单,
经典模式采用2种请求处理管道,一个管道用于本机代码 ISAPI 筛选器和扩展组件。另一个管道用于托管代码应用程序组件,如 ASP.NET。
但是集成模式不同,它没有Web服务扩展这一说,也仅仅使用一个请求处理管道。
它将Web服务扩展的运行时(如ASP.NET的运行时)集成到IIS里面来,随后将请求的处理分发到各个所配置的模块当中,
所以模块配置的灵活性成为了IIS7的最大亮点,从而使得它能够同时对本机模块和托管模块提供最直接的支持。
一个请求来了,不管它所请求的是何种类型的资源,都由IIS统一截获,如此一来,统一的身份验证就变得更为简单,
当然前提是你得知道IIS7的应用程序生命周期,开发自己的模块对响应的事件进行注册、捕获和处理。
由于这里仅说明部署上的一些细节问题,所以对开发方面的东西不会涉及,感兴趣的朋友可以打开MSDN对该方面的问题进行详细了解。
我想,那些懂得一些架构设计的人对IIS7的这种架构设计的好处会有更为深刻的体会。
处理程序映射
在IIS7中,不论使用哪种模式,都可能需要对“处理程序映射”进行配置。如下图:
双击该项,单击下图中相应的项进行配置。
例如,在我们的MapleTr4.0中,要处理.inc文件及用到服务器端指令#include的.htm和.html页面,需要作如下配置:
点击“添加模块映射”,弹出如下窗口,进行配置如下图所示。我们需要将所有的.inc及.htm和.html文件进行如下的映射配置。
关于IIS7的部署,写到这里,我想已经差不多了。通过我所讲述的部署过程及一些原理性的说明,
大家再举一反三,进行渗透式的理解,问题会变得更加简单。有道是:山穷水复疑无路,柳暗花明又一村,
万变不离其踪,IIS管理器中列出来的那么多项,配置来配置去,不过是在相关的配置文件中进行改动改动而已,只要你熟悉配置文件语法。