web-dev-qa-db-ja.com

IIS)の*すべての* HTTP / HTTPSリクエストを一時的に「サーバーメンテナンス」ページにリダイレクトします

IIS数百の個別のWebアプリをホストするサーバーがあり、これらのアプリをホストする物理データベースサーバーは、メンテナンスのために短期間オフラインになります( 15分未満かかります)。

その期間中、どのWebサイトについても、すべてのトラフィックを「現在メンテナンス中」のページにリダイレクトします。

すべてのWebアプリにアクセスし、IIS書き換えルールを設定して、そのアプリ内のすべてのリクエストに対してユーザーを別のページに送るようにすることで、これを行うことができることに気づきました。しかし、それより長くかかるでしょう。データベースのメンテナンスを行うよりも、それを行うことです!

私は3つのことを試しましたが、どれもうまくいきませんでした。

グローバルIIS書き換えルール

allのサイトにルールを適用する簡単な方法を一気に検索して、それを「元に戻す」ことができるようにしてきました同様に痛みのない一歩を踏み出す。これまでのところ、私の試みはどれもうまくいきませんでした。この書き換えルールを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では64ビットの.NET 4.0を実行していますが、「念のため」に32ビットと2.0のグローバルweb.configファイルに同じものを配置しましたが、変更はありません。

App_Offline.htm "スペシャルファイル"

私が見たもう1つの提案は app_offline.htm "special" file ですが、このファイルをすべてのアプリのアプリルートに展開するのに時間がかかるという同じ問題が発生しました実際にメンテナンスを行います。

IISの「オフライン」サイト

すべてのサイトはIISに単一のIPで設定されています。これはSNAがなくても機能します。これは、すべてのアプリが単一のSSL証明書を共有するためです(UCCです)。多分私はIISにサイトをセットアップすることができ、それは私たちが使用しているIPへのすべてのトラフィックにマッチしました、そしてしませんでしたホストヘッダーの値を指定します。希望するのは、より高い「優先順位」を与え、他のサイトが一致する前に、開始時にすべてのトラフィックをそのIPに一致させることでした。そのサイトは、リクエストURLに関係なく、すべてのリクエストに対して同じページを提供します。

メンテナンス中はそのサイトを開始し、終了したら停止します。

しかし、IISは、特定性の低いサイトの前に特定のサイトへのHTTPリクエストと一致するように見えるため、これを機能させることはできませんでした。このため、Host-header値を省略すると、 「ユーザーにオフラインであることを伝える」サイトでは、リクエストに別のサイトと一致するHost-header値がない限り、一致しませんでした。これにより、各Webアプリに手動でアクセスする必要があるという同じ問題に戻ることができますオフラインにするアクションを実行し、メンテナンスが完了したらオンラインに戻します

これを達成する簡単な方法はありますか?私たちがこの問題に遭遇するのは最初ではないようです。

-ジョシュ

10
Josh

私はあなたの3番目のアプローチで行きます"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コマンドレットにパイプできないため、コマンドはエラーを表示しますが、すべてのWebサイトで機能します。

通常は実行されないサイトがある場合は、次のように2番目のコマンドでそれらを除外する必要があります。

Where {$_.Name -ne "Offline" -and $_.Name -ne "foobar.com"}

IISのPowerShellコマンドレットがインストールされていない場合は、appcmd.exeを使用して同じことを行うことができますが、何年も使用していません。

6
Peter Hahndorf

すべてのサイトは、IISに1つのIPでセットアップされています。

1)古いデスクトップを取得し、ライブLinuxディストリビューションを実行し、IISボックスと同じIPを指定します。notネットワークに接続します。

2)ライブLinuxボックスでnginxを起動し、好きなようにダウンタイムページを作成し、ラップトップに接続されたオフラインスイッチ/ハブを使用してテストします

3)プラグを抜くIISボックスイーサネットケーブル、およびライブLinuxボックスに接続します。

4)スイッチ(またはロール電源)のMACアドレスキャッシュをクリアします。ダウンタイムサイトが稼働しています。

2
nandoP

私はこれが古いことを知っていますが、古いWindows 2008 r2ボックスでこれを実行する必要がありました。これは、質問のタイトルに対する回答です。質問の詳細に関しては、「IISで(We're Offlineサイト」を設定する)ための1つの方法にすぎません。

これは、IISと静的HTML以上のものに依存していません。IISの「HTTPリダイレクト」機能は必要なものを処理しませんが、それをシミュレートする別の方法があります。すべてのサイトが保守ページを指す「エラーページ」はい、これはIISで「サイト」全体を使用できる場合にのみ機能します。

私の場合、サイトのルートフォルダー(c:\ InetPub\wwwrootなど)には単一の "default.htm"ファイルがあります。したがって、「エラーページ」のallは、「このサイトで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>
0
Granger

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を使用する可能性のあるすべてのサービスを停止する必要があります。それらの大部分のリストは this link にあります。

0
SaidbakR