我们有一个IIS服务器,它承载了数百个独立的networking应用程序,而承载这些应用程序的物理数据库服务器将在短时间内离线进行维护(我们预计这个过程不到15分钟)。
在此期间,我们希望将所有进入网站的stream量redirect到“我们正在进行维护”页面。
我意识到我可以做到这一点,通过去每一个Web应用程序,并设置IIS重写规则,将用户发送到该应用程序中的所有请求的另一个页面。 但是,这样做要比做数据库维护要花费更长的时间!
我已经尝试了三件事,其中没有一件已经工作:
我一直在寻找一个简单的方法来对所有的网站进行统一的规则,然后在一个同样无痛的步骤中“去除”这个规则。 到目前为止,我的尝试都没有奏效。 我曾尝试把这个重写规则放在W:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config的全局web.config中:
<configuration> <system.webServer> <rewrite> <rules> <rule name="redirect all requests" stopProcessing="true"> <match url="^(.*)$" ignoreCase="false" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" /> </conditions> <action type="Redirect" url="http://www.somedomain.com/maintenance" appendQueryString="true" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
这没有奏效。 我们在IIS中运行.NET 4.0 64位,但“以防万一”我把同样的东西放在32位和2.0全局web.config文件中,仍然没有改变。
我见过的另外一个build议是app_offline.htm“special”文件 ,但是我们又回到了将文件部署到所有应用程序的应用程序根目录所花费的时间比实际执行维护时间更长的问题。
我们所有的网站都使用一个IP设置在IIS中。 这对我们甚至没有SNA的作品,因为我们所有的应用程序共享一个SSL证书(这是一个UCC)。 发生在我身上的一件事是,也许我可以在IIS中设置一个网站,将所有stream量都匹配到我们正在使用的IP,并且没有指定主机头的值。 希望是我可以给它一个更高的“优先级”,并在它开始时将所有的stream量匹配到这个IP,在其他站点有机会匹配之前。 我可以设置该网站为所有请求提供相同的页面,而不pipe请求URL如何。
在进行维护时启动该站点,并在完成时停止。
但是,我也无法得到这个工作,因为IIS似乎匹配HTTP请求到一个更具体的网站之前不太具体。 因此,通过忽略这个“告诉用户我们离线”网站的主机头值,除非请求没有匹配另一个网站的主机头值,否则不会匹配。 这使我们回到了同样的问题,不得不手动去每个Web应用程序,并执行一个动作,使其脱机,然后把它恢复在线,当我们完成维护
有一个简单的方法来完成这个? 看来我们当然不是第一个遇到这个问题的。
-Josh
我会用你的第三种方法"We're offline" Site in IIS
,说你把它命名为Offline
,如果它没有指定主机头,它将提供没有被任何其他具有匹配主机头的站点拾取的请求。 为了防止这个,你只需停止所有其他网站。
假设您安装了IIS脚本,请打开一个提升的PowerShell:
import-module webadministration
现在您可以停止除脱机之外的所有网站:
Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Stop-WebSite
当SQL Server备份时,再次启动它们:
Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Start-WebSite
如果您还有FTP站点,则这些命令将显示错误,因为您无法将FTP站点传送到Stop-WebSite cmdlet,但对于所有网站仍然适用。
如果您的站点通常不运行,则必须在第二个命令中排除它们,如:
Where {$_.Name -ne "Offline" -and $_.Name -ne "foobar.com"}
如果您没有安装用于IIS的PowerShell cmdlet,则可以使用appcmd.exe执行相同的操作,尽pipe如此,我还没有使用过。
我们所有的网站都使用一个IP设置在IIS中。
1)拿一个旧的桌面,运行实时Linux发行版,给它与IIS框相同的IP,不要连接到networking
2)在实时Linux机器上启动nginx,并根据您的喜好制作停机页面,使用连接到您的笔记本电脑的离线开关/集线器进行testing
3)拔出IIS盒以太网电缆,并将其插入到实时Linux盒子中。
4)清除交换机上的mac addrcaching(或滚动电源)。 你的停机时间现在是现场。
安装Apache并在path\to\apache\conf\extra\httpd-vhosts.conf
创build如下所示的虚拟主机:
<VirtualHost *:80> DocumentRoot C:/Apache/htdocs ServerName anyname.net # Other directives here </VirtualHost>
然后在上述设置中指定的文档根目录下,创build一个带有离线消息的index.html文件。
以下步骤非常重要,在运行Apache之前,必须停止可能使用端口80的所有服务。 你可以在这个链接中find他们大多数的列表
我知道这是旧的,但我只是在一个旧的Windows 2008 R2的框中做到这一点。 这是问题标题的更多答案。 关于问题的细节,那么只需要一种方法来设置“ 我们在IIS中是脱机的网站”。
这不仅仅依赖于IIS和静态HTML。 IIS的“HTTPredirect”function不能处理你想要的东西,但有另一种方法来模拟它。 只需更改站点的所有“错误页面”以指向维护页面。 是的,只有当您可以在IIS中使用整个“站点”时,这才起作用。
在我的情况下,该网站的根文件夹中有一个“default.htm”文件(例如c:\ InetPub \ wwwroot)。 因此, 所有 “错误页面”都被configuration为“在此站点执行URL”并使用path“/default.htm”。 由于我在文件中使用绝对URL(即以“/”开头),因此无论公共URL如何,其内容在浏览器中都能正确执行。
这个configuration的最终结果是对网站的任何/所有请求服务于我的维护页面的内容。 请求的内容并不重要。
此外,请注意,IIS将通过在根文件夹中生成web.config文件来影响此更改。 这是它为我创造的:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <httpErrors> <remove statusCode="502" subStatusCode="-1" /> <remove statusCode="501" subStatusCode="-1" /> <remove statusCode="500" subStatusCode="-1" /> <remove statusCode="412" subStatusCode="-1" /> <remove statusCode="406" subStatusCode="-1" /> <remove statusCode="405" subStatusCode="-1" /> <remove statusCode="404" subStatusCode="-1" /> <remove statusCode="403" subStatusCode="-1" /> <remove statusCode="401" subStatusCode="-1" /> <error statusCode="401" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> <error statusCode="403" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> <error statusCode="404" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> <error statusCode="405" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> <error statusCode="406" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> <error statusCode="412" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> <error statusCode="500" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> <error statusCode="501" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> <error statusCode="502" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" /> </httpErrors> </system.webServer> </configuration>