揭秘 IIS 应用程序池
IIS 中的应用程序池可能有点神秘。由于它们是自动创建的,所以很多时候管理员和开发人员都不会过多考虑它们。
但是,当应用程序池出现问题时,情况可能会变得非常复杂。优化应用程序池还能显著提升性能。了解应用程序池对于确保 IIS 服务器良好运行以及应用程序运行更高效至关重要。
什么是应用程序池?
要了解应用程序池,我们首先必须了解应用程序,就 IIS 而言。
应用程序是一组用于提供内容的文件夹和文件。任何网站都会分配一个默认应用程序,即使它只包含 HTML 和图片。下图展示了 Web 服务器/网站/应用程序之间的关系:
应用程序池是应用程序的容器。它的作用是将您的应用程序与其他服务器上的应用程序隔离。应用程序池中的每个应用程序共享一个工作进程 (w3wp.exe)。您可以让多个应用程序共享同一个工作进程,也可以为每个应用程序分配一个工作进程。
设置应用程序池时,您有几种选择。让我们比较一下几种模式。
单个池中的多个应用程序
在这种配置下,所有应用程序共享同一个进程池/进程。您可能出于以下原因想要这样做:
- 更简洁的设计
- 进行更改时,只需进行一次即可。
- 缓存机制得到改进,代码可以在应用程序之间共享和缓存。
您可能不想这样做的一些原因:
- 一次崩溃就会导致所有应用程序瘫痪。
- 高负载应用程序会降低其他应用程序的运行速度。
- 所有应用程序共享相同的安全配置文件
- 一个应用程序所需的设置可能会导致另一个应用程序无法正常工作。
每个应用程序都有自己的应用程序池
在这种模式下,每个应用程序都有自己独特的处理流程。
你可能出于以下原因想要这样做:
- 独立运行——如果一个应用程序出现故障,不会影响其他应用程序。
- 独立性能——高负载应用程序(很可能)不会减慢其他应用程序的速度。
- 每个应用程序都可以单独配置安全设置。
您可能不想这样做的一些原因:
- 设置无法全局更改,必须逐个更改。
- 不具备常见的代码缓存优势。
- 可能会比单个池产生更多开销。
这没有“万能药”,具体情况取决于您的网站和组织的需求。为了获得最佳效果,您肯定需要进行一些尝试。
应用程序池设置
应用程序池有一些重要的设置需要考虑。如果选择基本设置,则无法获得太多功能:
这仅允许您更改 CLR 版本和托管管道模式。但选择高级设置,您将获得更多选项:
以下是我经常看到被修改的一些内容:
-
.NET CLR - 虽然没有充分的理由运行较低版本的 .NET,但这种情况确实会发生。通常,当默认应用程序池框架为 2.0 时,我会进行此设置。
-
启用 32 位应用程序- 这是为了向后兼容而设置的常见选项。例如,我最近参与开发的一个应用程序就需要启用此功能,因为它使用了用 C++ 编写的 32 位 DLL,如果没有此设置,该应用程序将无法运行。
-
托管管道模式- 这是另一种用于向后兼容的模式。某些较旧的 ASP 应用程序可能需要经典模式。
-
队列长度——这是一个限流设置,虽然比较粗略,但很有用。它的意思是队列中最多可以有 1000 个请求,超过这个数量,访客将收到 503 错误。
-
限制- 这是另一种限制措施,用于控制您希望此应用程序池消耗的 CPU 时间的最大百分比。
-
限制操作指定达到限制时要执行的操作。您可以终止进程、限制其运行速度或不执行任何操作。
-
限制间隔用于微调限流。达到上述限制值后,此设置控制在循环之前可以保持该状态的分钟数。如果时间过长,可能会在不再需要限流时仍然保持限流状态。如果时间过短或设置过短,则会一直保持限流状态。
-
身份——这一点很重要,因为这是应用程序池要模拟的用户。大多数情况下,应用程序池身份是最佳选择,但有时您需要特定用户来运行进程。在这种情况下,您可以让应用程序池在该用户的帐户下运行,并授予其相应的权限。除非绝对必要,否则不要这样做。我在实际应用中经常看到这种情况,尤其是在高安全性的应用程序中。
正如我之前所说,网站调优并没有万能的灵丹妙药。这完全取决于你的组织以及网站的使用方式。在一个网站上效果很好的调优方案,在另一个网站上可能就适得其反。
如何创建应用程序池
在 IIS 中创建应用程序池非常简单。您可以进入 IIS 管理器,在“应用程序池”功能窗格中,右键单击并创建一个新的应用程序池:
或者,您也可以使用 PowerShell 创建一个(我更喜欢这种方式):
$appPoolName = 'jeremyscoolapp'
if(!(Test-Path IIS:\AppPools\$appPoolName))
{
$appPool = New-Item $appPoolName
$appPool | Set-ItemProperty -Name "managedRuntimeVersion" -Value 'v4.0'
}
Set-ItemProperty iis:\Sites\WebsiteName -Name applicationpool -Value $appPoolName
在这个脚本中,你可以看到我为应用程序池定义了一个名称。然后,我检查它是否已存在。如果不存在,我就创建一个新的应用程序池。接着,我使用 Set-ItemProperty 命令将运行时版本更改为 4.0。你可以用这种方法设置应用程序池的任何参数。
要查看可更改的选项,请在 PowerShell 提示符下键入以下命令:
Get-Item IIS:\AppPools\DefaultAppPool | Select-Object *
如果 DefaultAppPool 与您的应用程序池名称不同,请将其替换为您的应用程序池名称。
结论
希望本文能让您对 IIS 中的应用程序池有一个良好的了解。由于应用程序池通常是自动创建的,管理员往往不会过多考虑如何配置它们。许多网站使用默认设置也能正常运行。如果您需要自定义配置或遇到负载问题,现在您应该对应用程序池以及如何进行更改有了充分的了解。
我在Pluralsight新推出的课程《IIS管理基础》中涵盖了这一主题以及更多IIS相关内容。如果您对学习IIS管理感兴趣,欢迎查看该课程。
文章来源:https://dev.to/pluralsight/demystifying-iis-application-pools-40d6






