从共享驱动器托管的网站中的特定于服务器的web.config

时间:2009-04-14 18:55:39

标签: asp.net web-config replication load-balancing

背景信息:文件复制是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的文件以外的来源获取其行进命令?

理想情况下,每台服务器会有一个文件,例如:

  • 的Default.aspx
  • 的global.asax
  • 网络ServerA.config
  • 网络ServerB.config
  • ...
  • 网络ServerN.config

无论如何定义名称“web.config”在哪里?是否有可以基于每个服务器设置的注册表设置?是否可以在machine.config或全局web.config中创建一个条目来指定要使用的文件?

超出范围的事情

我很清楚,我不是在问如何为调试,测试和实时提供不同的AppSettings。还有其他主题可以解决这个问题,我的所有web.configs在大多数情况下都是相同的,我需要它们的唯一不同之处就是执行更新时。

我们没有使用web.config来获取任何appSettings信息;这是非常重要的东西,比如程序集引用,httpHandler定义和其他无法数据库化的system.web设置。

更新

我尝试在注册表中搜索Web.config,除了注意到我最近编辑过web.config文件的应用程序之外什么都没找到,我显然做了很多。没有帮助。

2 个答案:

答案 0 :(得分:1)

我的第一个问题是你在web.config&中保留了什么?你能把它移到数据库吗?我们将每个配置设置保存在数据库的表中,并使用machine.config存储数据库连接信息。

不确定会有多少重写,但它会避免你的问题。

另一种选择是将配置项保存在外部文件中,并从web.config引用它。在aspnet wp被回收之前,不会重新读取对该文件的更改,但是允许您更改设置,然后通过IISRESET循环每个服务器。

<configuration>
   <appSettings file="OtherFile.config">
...

答案 1 :(得分:0)

  1. 好奇,您使用的文件系统是什么? NTFS不是共享存储文件系统。换句话说,您一次不能有多个节点写入文件系统。

  2. 我建议在IIS下的网站下使用虚拟目录。这可能需要对代码的布局进行一些重组,但不应该太重要。因此,您可以使用特定于该计算机的web.config获取站点的根目录目录,然后将vdir映射到您设置的任何共享文件系统资源。