我有几个 asp.net web 应用程序,一些运行 asp.net 1.1,一些运行 2.0,还有一些运行 3.5,过去这些都运行在带有 iis6 的 Windows 2003 上,我为每个站点都创建了一个应用程序池。过了一段时间,我在网上读到,最好对每个版本的 .net 框架使用一个应用程序池,这样所有 2.0 应用程序都在一个应用程序池上运行,而所有 3.5 应用程序都可以自行运行,依此类推。
现在,我正在使用 iis7.5 迁移到 Windows 2008 R2,并且没有 1.1 或 3.5,因此应用程序池只有 2.0 选项。最好仍然按框架版本分离 Web 应用程序吗?或者每个应用程序池不是都有自己的框架实例吗?
答案1
实际上,.net 2.0 和 .net 3.5 实际上运行并使用相同版本的 ASP.NET(以及 CLR),因此无论何时您想要运行 .net 3.0 或 3.5,都应该选择 2.0 版本。
现在就应用程序池隔离而言,首先您需要为 CLR/asp.net 的每个版本设置单独的应用程序池,这意味着 4.0 和 2.0 必须分开,但 2.0、3.0 和 3.5 可以顺利地在同一个 AppPool 中共存。
就最佳实践而言,它实际上取决于您托管的应用程序的负载和类型以及许多其他标准,但我真的会使用 AppPool Isolation,特别是对于:
- 尝试以以下方式保持应用程序之间的隔离:
a)测量和监控这样您就可以轻松看到它们各自消耗的 CPU、内存和其他资源。b
)能够卸载(回收)行为不当的应用程序/网站。c
) 隔离有不同层次的服务期望例如,您可能知道某些应用程序至关重要,而其他应用程序则不那么重要。请记住,如果在完全信任模式下运行,单个应用程序出现错误可能会导致工作进程崩溃,从而影响在同一应用程序池中运行的所有其他应用程序。d
) 隔离出现错误的应用程序不同的安全要求例如,您可能需要以某些权限运行其中一些应用程序(例如使用 Kerberos 访问 SQL Server,或将文件写入磁盘,或者您不希望其他应用程序访问的其他内容)。这样,您可以使用不同的凭据运行每个 AppPool,从而提供操作系统级别的隔离和保护。
您决定在同一个应用程序池中托管多个应用程序的一个原因是,如果所有应用程序都共享重要的代码片段,例如,如果您托管一个大型 CMS 应用程序并且将运行 20 个不同的实例,则通过使用相同的进程,操作系统可以更好地共享内存和其他资源,这将使它们更有效率。
然而我认为,除非您托管大量网站(我的意思是> = 500),否则我建议将每个网站隔离在其自己的应用程序池中,特别是如果它们不在 Medium Trust 或 PHP、ASP、ISAPI 等其他框架中运行,因为这些框架提供了太多权力来做一些不应该被允许的事情(例如读取其他网站的配置或内存)。