IIS应用程序池、工作进程和应用程序域

90

有人可以解释一下IIS中应用程序池、工作进程和应用程序域之间的区别吗?它们是如何协同工作的?我已经阅读了几篇文章,但还是有些困惑。

  1. 在IIS中创建的每个网站都成为一个应用程序吗?
  2. 每个应用程序是否关联一个工作进程?
  3. 应用程序域在这里起什么作用?
4个回答

105

我试着用其他词语来表达它们。

在服务器上,您可以拥有许多运行在一起的asp.net站点。每个站点都是一个应用程序域

您必须为每个站点分配一个应用程序池。许多应用程序域(站点)可以共享同一个应用程序池,因为它们共享相同的进程和帐户 - 并且它们具有池的相同设置。如果此池重新启动,则该池下的所有站点都将重新启动。

现在,每个池可以有一个或多个工作进程。每个工作进程都是运行您的站点的不同程序,具有它们自己的静态变量、不同的启动停止调用等。不同的工作进程之间不会相互通信,交换数据的唯一方法是使用公共文件或公共数据库。如果您有多个工作进程,并且其中一个进行长时间计算,那么另一个可以处理Internet呼叫并显示内容。

当您将多个工作进程分配给单个池时,您就创建了所谓的Web Garden,如果计算机是一个处理机,则您的站点就像是从多台计算机运行。

app domains, with pools and processes

每个工作进程可以有多个线程。
更多的工作进程将如何影响您:
当您只有一个工作进程时,所有静态变量都是相同的,在应用程序中使用lock来同步它们,一切都更简单。
当您分配多个工作进程时,仍然需要使用lock来处理静态变量,静态变量在您的站点的许多运行中并没有不同,并且如果您有一些常见资源(例如在磁盘上创建缩略图),则需要使用Mutex来同步您的工作进程。
还有一点需要注意的是,当您增加更多的工作进程时,异步页面加载可能会更加平滑。但是,asp.net的会话处理程序存在一个小问题,即为了加载页面而锁定了整个进程-这既好又不好,具体取决于您是否知道它并处理它或更改它。
让我们来谈一下只有多个工作进程的一个站点。在这里,您面临的问题是需要使用 Mutex 同步您的公共资源更改。但使用会话的页面/处理程序不是异步的,因为会话会锁定它们。这很好,因为您避免了自己同步多个点的工作。
关于此主题的一些问题:
在共享同一会话的情况下处理另一个 Web 应用程序时 Web 应用程序被阻止
对 Web 服务的 jQuery Ajax 调用似乎是同步的
ASP.NET 服务器不以异步方式处理页面
完全替换 ASP.Net 的会话 现在,这个会话锁并不影响不同的网站。
在不同的网站中,更多的工作进程可以帮助避免一个长时间运行的进程阻塞其他网站。
此外,在不同的网站中,更多的池也可以帮助,因为每个池至少有一个工作进程。但是请记住并自己查看使用进程资源管理器,每个工作进程都会占用计算机更多的内存。一台具有16G内存和一个SQL服务器的大型服务器不能拥有太多不同的工作进程-例如在具有100个共享站点的服务器上,您不能拥有100个不同的池。

我正在弄清楚它与IIS 5处理方式的不同之处,与IIS 6及以上版本相比。因此,在IIS 5中,您有一个工作进程和多个应用程序域,而在IIS 6中,您有多个工作进程(w3wp.exe),每个应用程序池一个。在IIS 6.0中,inetinfo根据请求重定向到不同的工作进程。我说得对吗?这是我的来源http://dotnetslackers.com/articles/iis/ASPNETInternalsIISAndTheProcessModel.aspx - Ravi
@user460103 是的,iis5只有一个工作进程(多个应用程序域可以通过小技巧实现,但它们不能一起工作)。当您在一个站点上有多个工作进程时,是的,iis6可以将您重定向到不同的工作进程。 - Aristos
IIS 是否为每个 Web 请求启动一个新进程?还是它会启动一个新线程? IIS 会为每个 Web 请求启动一个新进程吗?还是启动一个新线程? - variable
@variable 启动一个新线程 - 进程将一直保持运行状态,或者按照您在池中设置的方式进行循环利用... - Aristos
如果有多个进程,那么会话如何工作呢?我以为会话是每个进程的。 - variable
@variable 会话具有对所有进程通用的数据库(SQL或内存)。 SQL会话是您使用数据库服务器设置的内容(建立连接,查看表等),内存会话是一项服务,可保持所有进程共享的数据,并且ASP.NET与相同的服务通信,无论进程或线程如何。此外,会话基于ASP.NET添加到用户的cookie锁定到用户-因此,cookie保持会话与用户的连接。 - Aristos

18
  • 一个 IIS 服务器可以有多个应用程序池。
  • 一个 Web 应用程序绑定一个应用程序池。
  • 一个应用程序池可能有多个工作进程(当启用“Web Garden”时)。
  • 一个工作进程可以有多个应用程序域。一个应用程序域仅存在于一个工作进程中。
  • 一个应用程序域可能有多个线程。一个线程可以在不同时间被不同的应用程序域共享。

对 ASP.NET 开发人员的意义:为了使您的网站具有可扩展性,请勿使用内存中会话并且请勿使用静态类变量锁进行同步。


7
  1. 是的,但并非每个应用程序都是网站。您可以有一个嵌套在网站下面的应用程序。

  2. 是的,每个应用程序都必须有一个工作进程(应用程序池),但一个应用程序池可以为多个应用程序提供服务。单个Web应用程序可以分布式(Web园/农场),这意味着它将在多个进程中运行。

  3. 每个进程将在自己的应用程序域中运行(每个应用程序池都是单独的应用程序域)。


来自MSDN。

创建Web应用程序:

一个应用程序是指位于Web站点根目录下的内容组或位于单独文件夹中的内容组。

应用程序池:

应用程序池定义了一组具有共同设置的一个或多个工作进程,为分配给该应用程序池的一个或多个应用程序提供服务请求。因为应用程序池允许一组Web应用程序共享一个或多个类似配置的工作进程,所以它们为将一组Web应用程序与服务器计算机上的其他Web应用程序隔离提供了一种方便的方法。进程边界分隔每个工作进程;因此,一个应用程序池中的应用程序问题不会影响其他应用程序池中的Web站点或应用程序。应用程序池显著增加了Web基础架构的可靠性和可管理性。


IIS进程具有多个应用程序域(应用程序池),每个应用程序池可以拥有多个网站。那么,多个网站是否驻留在单个应用程序域中?如果一个网站出现问题,它会导致整个应用程序域和其中所有驻留的网站崩溃吗? - Ravi
如果你崩溃了一个池子,那么是的,所有连接到它的站点都会停止 - 然后重新启动。 - Aristos
1
不是的。如果配置了 Web Garden,一个应用程序可能会跨越多个工作进程。 - Wiktor Zychla
@Wiktor - 我并没有排除那种可能。不过,我更新了答案以澄清。 - Oded

3

从源链接中得知:-http://weblogs.asp.net/owscott/archive/2007/09/02/application-vs-appdomain.aspx

应用程序是IIS术语,但它是ASP.NET利用的一个术语。基本上,它创建了一个沙箱,或一组边界,将不同站点或站点的部分与其他站点或站点的部分分开。

AppDomain是.NET术语。(在IIS7中,AppDomains在IIS中扮演更大的角色,但在很大程度上它是一个ASP.NET术语)

工作进程用于处理Web应用程序的请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接