【发布时间】:2009-04-14 18:55:38
【问题描述】:
背景信息:文件复制很糟糕
目前,我们有一个跨 8 个不同 IIS 服务器负载平衡的大型、高流量 ASP.NET Web 应用程序。由于站点的性质,.aspx 文件和 .ascx 控件的微小更改全天经常发生,并且在经过测试和发布后,通过 xcopy 部署定期复制到每个公共网络服务器10 分钟。
当然,这是非常低效的,因为每个服务器都必须拥有整个站点的冗余副本,我们希望消除 10 分钟的发布延迟。
可能的改进:从共享存储托管
我们现在可以选择使用带有 iSCSI 接口的集中式存储来集中托管整个站点,每个服务器都认为远程存储是本地驱动器。发布将是即时的和全系统的。
注意:无法将驱动器从 UNC 共享中托管,因为站点结构中有许多不同的目录,每个目录都需要用于 ASP.NET 的 FileSystemWatcher 来监视更改,因此 SMB 最大命令计数很快就达到了。是的,我们知道 MaxCmds 和 MaxMpxCt 注册表设置。
问题:Web.config 更改触发大量重新编译
我们预见到的问题是,文件系统结构的某些更改可能导致几乎每个已编译的 .aspx 或 .ascx 都必须重新编译,从而导致请求排队和服务器已关闭的感觉。大多数资源并未在系统范围内使用,因此在更改时重新编译它们几乎不会导致资源中断。站点上所有页面使用的全局母版页可能会导致此问题,但这可以通过代码轻松管理。
罪魁祸首是 web.config 文件。对 web.config 文件的更改会导致整个 Web 应用程序循环使用,并进行重新编译。因此,我们目前不复制 web.config 更改。任何 web.config 更改都需要将 Web 服务器从负载平衡器中移除,应用(和测试)更改,然后使用垃圾请求预热服务器,然后再将其放回负载平衡器上。
但是,如果 web.config 文件与 Web 应用程序目录结构的其余部分一样位于集中式存储上,则该文件只有一个副本,并且无法再对各个服务器进行修补和预热。
问题
有没有办法让 ASP.NET Web 应用程序从名为 Web.config 的文件以外的源获取其行进命令?
理想情况下,每台服务器都有一个文件,例如:
- default.aspx
- global.asax
- Web-ServerA.config
- Web-ServerB.config
- ...
- Web-ServerN.config
无论如何,名称“web.config”是在哪里定义的?是否有可以在每台服务器上设置的注册表设置?是否可以在 machine.config 或全局 web.config 中创建条目来指定要使用的文件?
超出范围的事情
我很清楚,我不是在问如何为调试、测试和实时设置不同的 AppSettings。还有其他主题涵盖了这一点,我的所有 web.config 大部分时间都是相同的,唯一需要它们不同的时候是执行更新时。
我们没有将 web.config 用于任何 appSettings 信息;这是针对真正重要的东西,例如程序集引用、httpHandler 定义和其他无法数据库化的 system.web 设置。
更新
我尝试在注册表中搜索 Web.config,除了指出我最近编辑过 web.config 文件的应用程序之外,什么也没找到,我显然做了很多。那里没有帮助。
【问题讨论】:
-
目前是 IIS6,但升级到 IIS7 是长期计划。在我看来,需要 IIS7 的解决方案就可以了。
标签: asp.net web-config replication load-balancing