將 IIS 中的所有 HTTP/HTTPS 請求臨時重定向到“伺服器維護”頁面
我們有一個託管數百個單獨 Web 應用程序的 IIS 伺服器,託管這些應用程序的物理數據庫伺服器將在短時間內離線進行維護(我們預計它需要不到 15 分鐘)。
在此期間,我們希望將任何網站的所有流量重定向到“我們目前正在進行維護”頁面。
我意識到我可以通過訪問每個 Web 應用程序並設置 IIS 重寫規則來將使用者發送到該應用程序中的所有請求的另一個頁面來做到這一點。但是,這樣做比維護數據庫需要更長的時間!
我已經嘗試了三件事,但都沒有奏效:
全域 IIS 重寫規則
我一直在尋找一種簡單的方法來將規則應用於所有站點,一舉一動——然後能夠以同樣輕鬆的步驟“撤消”該規則。到目前為止,我的任何嘗試都沒有奏效。我確實嘗試將此重寫規則放在我的全域 web.config 中 W:\Windows\Microsoft.NET\Framework64\v4.0.30319\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 中的“我們離線”站點
我們所有的網站都是在 IIS 中設置的,只有一個 IP。即使沒有 SNA,這也適用於我們,因為我們所有的應用程序都共享一個 SSL 證書(它是 UCC)。我想到的一件事是,也許我可以在 IIS 中設置一個站點,將所有流量與我們正在使用的 IP 匹配,並且沒有指定主機頭值。希望我能給它一個更高的“優先級”,並且它在啟動時會在任何其他站點有機會匹配之前匹配到該 IP 的所有流量。我可以將該站點設置為為所有請求提供相同的頁面,而不管請求 URL 是什麼。
在進行維護時啟動該站點,並在完成時停止它。
但是,我也無法讓它工作,因為 IIS 似乎先將 HTTP 請求匹配到更具體的站點,然後再不那麼具體。因此,通過省略這個“告訴使用者我們離線”站點的主機頭值,除非請求沒有與另一個站點匹配的主機頭值,否則它不會被匹配。這讓我們又回到了同樣的問題,即必須手動訪問每個 Web 應用程序並執行一項操作以使其離線,然後在我們完成維護後將其重新聯機
有沒有一種簡單的方法可以做到這一點?看來我們肯定不是第一個遇到這個問題的人。
-喬什
我會採用你的第三種方法
"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 來做同樣的事情,不過我已經好幾年沒用過了。