暂时将IIS中的* all * HTTP / HTTPS请求重定向到“服务器维护”页面


10

我们有一台IIS服务器,它承载数百个单独的Web应用程序,并且承载这些应用程序的物理数据库服务器将在短期内脱机进行维护(我们预计将花费不到15分钟的时间)。

在此期间,我们希望将任何网站的所有流量重定向到“我们正在接受维护”页面。

我意识到我可以通过转到每个Web应用程序并设置IIS重写规则将用户发送到该应用程序中所有请求的另一个页面的方式来做到这一点。但是,与数据库维护相比,这样做需要更长的时间!

我已经尝试了三件事,但都没有奏效:

全局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文件放在同一位置,并且仍然没有变化。

App_Offline.htm“特殊文件”

我看到的另一个建议是app_offline.htm“特殊”文件,但我们又遇到了同样的问题,即将该文件部署到我们所有应用程序的应用程序根目录所需的时间比实际执行维护所需的时间更长。

IIS中的“我们处于脱机状态”站点

我们所有的站点都通过一个IP在IIS中设置。即使没有SNA,这也对我们有用,因为我们所有的应用程序都共享一个SSL证书(这是UCC)。我想到的一件事是,也许我可以在IIS中设置一个站点,该站点将所有流量与我们正在使用的IP匹配,并且指定主机头值。希望我可以给它一个更高的“优先级”,并让它在启动时将所有流量与该IP匹配,然后再与其他任何站点进行匹配。我可以将该站点设置为为所有请求提供相同的页面,而不考虑请求URL。

进行维护时启动该站点,并在完成后停止该站点。

但是,我也无法使它正常工作,因为IIS似乎先将HTTP请求匹配到更具体的站点,然后再将其具体化。因此,通过忽略此“告诉我们我们处于离线状态”的网站的主机标头值,除非请求没有与另一个网站相匹配的主机标头值,否则它不会被匹配。这使我们回到了同样的问题,即必须手动转到每个Web应用程序并执行操作以使其脱机,然后在完成维护后使其重新联机

有没有简单的方法可以做到这一点?看来我们当然不是第一个遇到此问题的人。

-乔什


一种选择是安装apache实例或另一台Web服务器,并在其中设置对不起的网站。然后,当时间到了时,停止IIS并启动apache并让其处理所有请求。
phoebus

我们通常这样做的方法是在服务器前面的设备(例如负载平衡器)上显示抱歉页面。
phoebus

Answers:


6

我将采用您的第三种方法"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进行相同的操作,不过几年来我还没有使用过。


2

我们所有的站点都通过一个IP在IIS中设置。

1)取一个旧的台式机,运行实时Linux发行版,给它相同的IP作为IIS中,也没有将其连接到网络

2)在实时Linux盒上启动nginx,并根据需要创建停机页面,并使用连接到您的笔记本电脑的离线开关/集线器对其进行测试

3)拔下IIS盒以太网电缆,然后将其插入实时Linux盒中。

4)清除交换机上的mac addr缓存(或滚动电源)。您的停机时间站点现已上线。


0

安装Apache并创建虚拟主机,如下所示path\to\apache\conf\extra\httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot C:/Apache/htdocs
    ServerName anyname.net

    # Other directives here
</VirtualHost>

然后在上述设置中指定的文档根目录中,创建带有脱机消息的index.html文件。

下一步非常重要,您必须在运行Apache之前停止所有可能使用端口80的服务。您可以在此链接中找到其中的大多数列表


0

我知道这很旧,但是我只需要在旧的Windows 2008 r2机器上执行此操作。这是问题标题的更多答案;关于问题的详细信息,它只是设置“ IIS中的我们离线站点”的一种方法。

除了IIS和静态HTML外,它不依赖其他任何内容。IIS的“ HTTP重定向”功能无法满足您的需求,但是还有另一种模拟它的方法。只需更改站点的所有“错误页面”以指向维护页面即可。是的,仅当您可以在IIS中使用整个“站点”时,此方法才有效。

就我而言,该站点的根文件夹中只有一个“ default.htm”文件(例如c:\ InetPub \ wwwroot)。因此,所有 “错误页面”都配置为“在此站点执行URL”并使用路径“ /default.htm”。由于我在文件中使用绝对URL(即以“ /”开头),因此无论公共URL看起来是什么,其内容都能在浏览器中正确执行。

此配置的最终结果是,对该站点的任何/所有请求都将提供我的维护页面的内容。要求是什么都没关系。

另外,请注意,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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.