65.9K
CodeProject 正在变化。 阅读更多。
Home

网站在 IIS 上的部署

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (45投票s)

2009年1月3日

CPOL

11分钟阅读

viewsIcon

366397

本文旨在深入探讨 IIS。

网站在 IIS 上的部署

在过去的几天里,我在部署我的应用程序时遇到了很多问题。我发现正确部署应用程序和开发应用程序一样重要。如果应用程序部署不当,可能会对您的应用程序造成很大损害。在这里,我想与大家分享我的学习经验。

对于部署,我们首先需要了解 IIS 及其请求处理,然后我们将着手部署网站以及 IIS 中的各种可用配置、其主要功能、优缺点等。

IIS

IIS 在根级别是一个 Windows 服务,负责处理特定端口上接收到的请求。为此,一个名为“万维网发布服务”的服务在系统上运行。要部署应用程序,我们会创建一个虚拟目录,然后将其转换为一个应用程序。实际上,虚拟目录只不过是 IIS 中用于共享物理路径以便通过 Web 服务器访问的配置条目。

Final2.JPG

完整的配置(及其所有设置)存储在本地系统的元数据库文件中。IIS 元数据库是 IIS6.x 中的一个基于 XML 的数据存储,可以通过 IIS 管理控制台进行配置。

IIS 和 URL 处理

通常,Web 应用程序通过浏览器进行访问和处理。浏览器将请求发送到服务器(此处是 IIS),然后由 IIS 实际处理请求。IIS 执行的步骤如下:

  • 首先,IIS 检查请求的 URL。它还会检查端口,如果未配置默认端口 80,则 URL 还需要端口号。
  • 如果我们的 URL 是“http://webserver/store/books.aspx”,那么这里的 webserver 显示的是虚拟目录的名称,books.aspx 是请求的文件。
  • 每个文件扩展名都在 IIS 中注册,并与 ISAPI 扩展连接,每个文件都连接到一个 DLL 文件。
  • 每个文件扩展名都与 ASP.NET 运行时连接,并与相应的 aspnet_isapi.dll ISAPI 扩展连接。这些在安装时会自动添加。使用此功能可以管理不同版本的框架(如 ASP.NET 1.0、1.1 和 2.0),并可以为每个网站进行配置。
  • IIS 6 分为几个组件:其中有一个内核驱动程序,如下图所示,负责接收来自客户端的 HTTP 请求,然后将其转发给注册了特定 URL 的任何进程。也就是说,任何应用程序注册到内核模式驱动程序都可以接收 HTTP 请求,而无需运行整个服务器。
  • IIS 启动工作进程,提供隔离机制,每个工作进程运行一个或多个应用程序,无论是基于 ASP.NET 的还是其他类型的。

IIS 6.0 进程模型

Web 服务器现在被分成几个组件。IIS 6.0 包括一个名为 HTTP.SYS 的内核模式驱动程序,该驱动程序负责接收来自客户端的 HTTP 请求。内核将请求转发给注册了特定 URL 的任何进程。

所有可靠性和安全选项都在应用程序池级别配置。因此,在 IIS6.0 上运行 ASP.NET 时,machine.config 中具有 <processModel> 元素的经典 ASP.NET 进程模型被禁用,因为为 <processModel> 引入的所有选项都已为 IIS6.0 工作进程配置。

Final1.JPG

WAS 监视每个工作进程,如果一个进程失败,它会重新启动它,以免应用程序突然中断。

Deploy7.jpg

  • 我们可以为每个工作进程定义不同的标识,即它允许通过为工作进程配置的帐户的权限进行额外的隔离,这些通过 IIS 管理控制台中的应用程序池进行配置,也就是说,每个应用程序池都有自己的工作进程,并且可以为这些应用程序池分配每个虚拟目录,正如我在上一节中所讨论的。每个应用程序池可以运行任意数量的应用程序。
  • 应用程序池允许我们轻松地将不同的 Web 应用程序配置为在不同的帐户下运行,具有不同的资源使用限制,并提供更多的 Web 应用程序隔离。

管理虚拟目录

管理虚拟目录包括创建虚拟目录及其所有设置。安装 IIS 时,会自动创建一个名为“c:/Inetpub/wwwroot”的目录。此目录中的任何文件都将显示为位于 Web 服务器的根目录下。使用 wwwroot 目录创建虚拟目录组织性很差,请尽量避免。这就是为什么我选择了以下第二种选项。

创建虚拟目录

  1. 转到运行并键入 inetmgr,然后按 Enter。您将看到 IIS 管理控制台,如下所示,并按照屏幕截图操作。

Deploy8.jpg

2. 单击下一步。根据需要设置网站的别名。

Deploy9.jpg

3. 单击下一步并浏览应用程序的物理路径。

Deploy10.jpg

4. 设置权限,我们有五种选项:

Deploy11.jpg

  • 读取:这是最基本的权限,访问应用程序的网页是必需的。
  • 运行脚本:aspx 页面需要此权限,而静态 HTML 页面不需要,因为 aspx 页面需要更多权限才能执行操作。
  • 执行:这允许用户运行普通的可执行文件或 CGI 应用程序。这可能存在安全风险,因此仅在真正需要时才允许。
  • 写入:这允许添加、修改或删除 Web 服务器上的文件。此权限绝不应被允许。
  • 浏览:这允许用户检索虚拟目录中文件的完整列表,即使文件内容受到限制。通常禁用此选项。

5. 右键单击虚拟目录,转到属性,然后单击创建以将其设置为应用程序。

Deploy12.jpg

虚拟目录设置

IIS 在创建虚拟目录后,使其设置的配置非常容易。只需右键单击虚拟目录并选择属性。然后将出现属性窗口。下面我将尝试探讨一些最重要的设置。

文件映射:如前所述,IIS 将 aspx 页面的请求转发给 ASP ISAPI 扩展,并将 ASP.NET 页面的请求发送给 ASP.NET ISAPI 扩展。IIS 根据请求的 URL 的文件名扩展名来决定 ISAPI 扩展,并且这些映射可以按虚拟目录进行。要查看它,请在虚拟目录的属性中,单击“虚拟目录”选项卡上的“配置”按钮。

Deploy13.JPG

序号 文件扩展名 描述
1 .aspx 这些是 ASP.NET 网页
2 .ascx 这些是 ASP.NET 用户控件。它们不能直接访问,要访问它们必须托管在 ASP.net 页面上。
3 .asmx 这些是 ASP.NET Web 服务,用于通过 HTTP 将功能公开给其他应用程序。
4 .asax 这些是用于全局应用程序文件,用于全局事件,例如应用程序启动时。
5 .ashx 这些是 HTTP 处理程序,允许在不使用完整的 ASP.NET 网页模型的情况下处理请求。
6 .axd 这些用于 trace.axd 应用程序扩展,它允许在调试时跟踪消息。
7 .rem 和 .soap 这些扩展名标识 IIS 正在托管一个可以被 .NET Remoting 调用对象的实例。
8 .cs,.csproj,.licx,.config,.resx,.webinfo 这些文件由 ASP.NET 使用,但不能被客户端直接调用。虽然,ASP.NET 会注册它们,以便它可以明确阻止用户访问这些文件,而不管 IIS 的安全设置如何。

通常,如果我们一次安装了多个版本的 ASP.NET,我们可能希望在不同目录中配置不同的映射。

默认文档:“默认文档”选项卡允许指定虚拟目录的默认文档。例如,如果用户只输入“http://MyServer/MyApplication”,IIS 会自动将用户重定向到该默认页面。如果找不到页面,IIS 将返回 HTTP 404(未找到页面错误)。要查看和设置默认页面,请在虚拟目录的属性中,单击“默认文档”选项卡。

Deploy14.jpg

自定义错误:“自定义错误”选项卡允许我们为特定类型的 HTTP 错误(请参见下图)指定一个错误页面。可以使用 ASP.NET 配置来替换 HTTP 错误或应用程序错误为自定义消息。只有当 Web 请求成功到达 ASP.NET 服务时,此功能才有效。

Deploy15.jpg

管理应用程序池(工作进程)

作为默认安装,会创建一个名为“DefaultAppPool”的应用程序池。它以网络服务身份运行,每个在默认网站上运行的 Web 应用程序都使用此默认池。

创建应用程序池

首先,让我们尝试了解,当我们还需要其他应用程序池时,我们已经有一个应用程序池叫做*DefaultAppPool*。主要有三个原因:

  • 稳定性问题:如果服务器上有多个应用程序正在运行,如果它们都在同一个池中,那么如果这个池出现任何问题,所有使用这个池的应用程序都会受到影响。
  • 内存泄漏:如果有一个资源密集型应用程序,或者一个有内存泄漏的老应用程序在一个应用程序池中运行,那么定期回收它是一个完美的候选。在这种情况下,运行在不同应用程序池中的应用程序不会受到影响。
  • 安全性:安全配置是拥有多个应用程序池的另一个主要原因。假设,我们希望一个应用程序能够向客户端计算机写入一些日志,那么我们应该有一个应用程序池,它应该以 LocalSystem 的帐户运行,而其他的可能不需要相同的权限,所以它们可以以不同的帐户运行。
  • 管理:这也是拥有独立池的原因之一。可能服务器上为不同的客户托管了多个站点,但又不允许访问其他池的资源。

注意:回收应用程序池(工作进程)意味着停止已经占用大量资源的旧工作进程,并为应用程序池启动一个新的实例。

要创建应用程序池,请按照以下步骤操作(请记住,机器上应已安装 IIS):

  1. 转到运行 -> 输入 inetmgr,然后单击确定。您将看到以下窗口。

Deploy1.jpg

2.

Deploy18.jpg

3.

Deploy19.jpg

这里有两个选项:

  • 第一种,如果您想使用默认设置(当您想用新设置创建它时使用此选项)。
  • 第二种,如果您想创建一个新池,但设置与另一个池相同,那么您可以选择此选项,然后从下拉列表中选择模板池(这将为您节省再次进行相同设置的时间)。

4. 您可以通过右键单击创建的池并选择属性来配置应用程序池。

Deploy20.jpg

5. 您可以通过在应用程序池的属性窗口(如上图)中选择“标识”选项卡来配置每个应用程序池的标识。

Deploy21.jpg

在这里,下拉列表中有三个选项:

网络服务:此帐户是限制帐户,权限最少。它主要用于需要访问网络并需要从网络中的其他计算机访问的应用程序。

本地服务:此帐户比网络服务拥有更多的限制,并且主要用于不需要额外网络访问的服务。

本地系统:通常推荐使用此帐户,因为它具有最高的系统权限。它可以对本地系统执行任何操作。所以基本原则是,您应该提供应用程序所需的权限,这样它就不能轻易被黑客攻击。

您还可以通过指定此帐户的 Windows 用户名和密码来将其配置为使用您自己的用户帐户。

应用程序池配置:

右键单击应用程序,然后转到虚拟目录选项卡。

Deploy22.jpg

更改应用程序池,然后单击应用按钮。

部署应用程序

部署无非是将应用程序的已发布代码复制到目标机器并根据需要配置环境。这对于简单的应用程序是正确的,但对于使用数据库或访问其他资源的应用程序,则需要执行额外的步骤。

  1. 将必需文件复制到目标机器:检查所有程序集是否已到位。如果不是,请使用 gacutil.exe 进行安装。
  2. 创建并配置数据库
  3. 根据需要添加 IIS 文件映射
  4. 更新 web.config 以进行任何应用程序设置或连接字符串等。
  5. 其他设置可以根据需要进行,正如我们上面讨论过的,例如应用程序池等。

希望大家喜欢这篇文章。请发表您的评论,这将对我改进本文以及我未来的文章有很大帮助。

在 IIS 上部署网站 - CodeProject - 代码之家
© . All rights reserved.