背景信息:文件复制是Lame
目前,我们在8个不同的IIS服务器上负载均衡的大量高流量ASP.NET Web应用程序。由于站点的性质,对.aspx文件和.ascx控件的微小更改在一天中经常发生,并且经过测试和发布后,将通过xcopy部署按计划复制到每个公共Web服务器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应用程序的其他目录结构一样)位于集中式存储上,则只有该文件的一个副本,并且单个服务器无法再进行修补和预热。 / p>
问题
有没有办法让ASP.NET Web应用程序从名为Web.config的文件以外的来源获取其行进命令?
理想情况下,每台服务器会有一个文件,例如:
无论如何定义名称“web.config”在哪里?是否有可以基于每个服务器设置的注册表设置?是否可以在machine.config或全局web.config中创建一个条目来指定要使用的文件?
超出范围的事情
我很清楚,我不是在问如何为调试,测试和实时提供不同的AppSettings。还有其他主题可以解决这个问题,我的所有web.configs在大多数情况下都是相同的,我需要它们的唯一不同之处就是执行更新时。
我们没有使用web.config来获取任何appSettings信息;这是非常重要的东西,比如程序集引用,httpHandler定义和其他无法数据库化的system.web设置。
更新
我尝试在注册表中搜索Web.config,除了注意到我最近编辑过web.config文件的应用程序之外什么都没找到,我显然做了很多。没有帮助。
答案 0 :(得分:1)
我的第一个问题是你在web.config&中保留了什么?你能把它移到数据库吗?我们将每个配置设置保存在数据库的表中,并使用machine.config存储数据库连接信息。
不确定会有多少重写,但它会避免你的问题。
另一种选择是将配置项保存在外部文件中,并从web.config引用它。在aspnet wp被回收之前,不会重新读取对该文件的更改,但是允许您更改设置,然后通过IISRESET循环每个服务器。
<configuration>
<appSettings file="OtherFile.config">
...
答案 1 :(得分:0)
好奇,您使用的文件系统是什么? NTFS不是共享存储文件系统。换句话说,您一次不能有多个节点写入文件系统。
我建议在IIS下的网站下使用虚拟目录。这可能需要对代码的布局进行一些重组,但不应该太重要。因此,您可以使用特定于该计算机的web.config获取站点的根目录目录,然后将vdir映射到您设置的任何共享文件系统资源。