【问题标题】:IIS app pools, worker processes, app domainsIIS 应用程序池、工作进程、应用程序域
【发布时间】:2021-04-22 09:27:15
【问题描述】:

谁能解释 IIS 中应用程序池、工作进程和应用程序域之间的区别?另外,它们是如何协同工作的?我已经阅读了几篇文章,但仍然有些混乱。

  1. 在 IIS 中创建的每个网站都会成为应用程序吗?
  2. 每个应用程序是否与一个工作进程相关联?
  3. 应用程序域在哪里出现?

【问题讨论】:

    标签: asp.net iis


    【解决方案1】:
    1. 是的,但并非每个应用程序都是网站。您可以拥有一个嵌套在网站下的应用程序。

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

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


    来自 MSDN。

    Create a Web Application:

    应用程序是网站根级别的一组内容或网站根目录下单独文件夹中的一组内容。

    Application Pools:

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

    【讨论】:

    • 所以 IIS 进程有多个应用程序域(应用程序池),每个应用程序池可以有多个网站。那么多个网站是否位于单个应用程序域中?如果某个网站出现问题,它会关闭整个应用程序域以及其中的所有网站吗?
    • @user460103 如果您使池崩溃,那么是的,所有连接到它的站点都会停止 - 并再次重新启动。
    • 2.不可以。如果配置了网络花园,一个应用程序可能跨越多个工作进程。
    • @Wiktor - 我没有排除这一点。但是,更新了答案以澄清。
    【解决方案2】:

    来自源链接:-http://weblogs.asp.net/owscott/archive/2007/09/02/application-vs-appdomain.aspx

    应用程序是一个 IIS 术语,但它是 ASP.NET 使用的。 本质上,它创建了一个沙箱,或一组边界来分隔 与其他网站不同的网站或网站的一部分。

    AppDomain 是一个 .NET 术语。 (在 IIS7 中,AppDomains 的作用更大 在 IIS 中,但大多数情况下它是一个 ASP.NET 术语)

    worker进程用于处理web应用的请求。

    【讨论】:

      【解决方案3】:

      我试着用其他词来表达。

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

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

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

      当您将多个工作进程分配给单个池时,您就创建了所谓的网络花园,如果一台计算机是一台处理机器,您的网站就像在多台计算机上运行。 p>

      每个工作进程可以有很多线程。

      更多工作进程如何影响您:
      当您有一个工作进程时,一切都会变得更简单,在您的应用程序中,所有静态变量都是相同的,您可以使用lock 来同步它们。
      当您分配多个工作进程时,您仍然继续将lock 用于静态变量,静态变量在您的站点的许多运行中没有什么不同,并且如果您有一些公共资源(例如在磁盘上创建缩略图)然后你需要将你的工作进程与Mutex同步。

      还有一个注意事项。听起来,当您制作更多工作进程时,您可能会获得更流畅的异步页面加载。 asp.net 的会话处理程序存在一个小问题,即锁定页面加载的整个过程——这取决于你是否知道并处理它——或者改变它。

      所以让我们只讨论一个具有许多工作进程的站点。在这里,您面临需要将公共资源更改与Mutex 同步的问题。但是使用会话的页面/处理程序不是异步的,因为会话锁定了它们。这是一个很好的开始,因为您避免自己进行许多点的同步。

      关于这个话题的一些问题:
      Web app blocked while processing another web app on sharing same session
      jQuery Ajax calls to web service seem to be synchronous
      ASP.NET Server does not process pages asynchronously
      Replacing ASP.Net's session entirely

      现在这个会话锁定不会影响不同的站点。

      在不同的站点中,更多的工作进程可以帮助一个站点不阻塞另一个运行时间较长的进程。
      同样在不同站点之间,更多的池也可以提供帮助,因为每个池至少有一个工作进程,但请记住并使用进程资源管理器自己查看,每个工作进程占用您计算机的更多内存,以及一台具有 16G 内存的大型服务器并且一台 SQL 服务器不能有太多不同的工作进程 - 例如在具有 100 个共享站点的服务器上,您不能有 100 个不同的池。

      【讨论】:

      • 我发现它与 IIS 5 处理它的方式与 IIS 6 及更高版本不同。因此,在 IIS 5 中,与 IIS 6 相比,您有一个工作进程和多个应用程序域,每个应用程序池都有多个工作进程 (w3wp.exe)。在 IIS 6.0 中,inetinfo 根据请求重定向到不同的工作进程。我在这里吗?这是我的来源dotnetslackers.com/articles/iis/…
      • @user460103 是的 iis5 有一个工作进程(多个应用程序域只能有一个小黑客,但它们不能一起工作。)当您在一个站点上有多个工作进程时,是的 iis6 可以将您重定向到不同的工作进程。
      • IIS 是否为每个 Web 请求启动一个新进程?还是它会启动一个新线程?
      • @variable 启动一个新线程 - 进程始终保持运行状态,或者它们回收您在池中设置它们的方式...
      • 好的,如果有多个进程,那么会话如何工作 - 我认为会话是每个进程的
      【解决方案4】:
      • 一个 IIS 服务器可能有多个应用程序池。
      • 一个 Web 应用程序绑定到一个应用程序池。
      • 一个应用程序池可能有多个工作进程(启用 Web Garden 时)。
      • 一个工作进程可以有多个应用程序域。一个应用程序域只存在于一个工作进程中。
      • 一个应用程序域可能有多个线程。一个线程可以在不同的时间被不同的应用程序域共享。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-15
        • 2011-06-29
        • 2021-10-14
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多