เปลี่ยนเส้นทางชั่วคราว * ทั้งหมด * คำขอ HTTP / HTTPS ใน IIS ไปยังหน้า“ การบำรุงรักษาเซิร์ฟเวอร์”


10

เรามีเซิร์ฟเวอร์ IIS ที่โฮสต์หลายร้อยเว็บแอปแยกต่างหากและเซิร์ฟเวอร์ฐานข้อมูลทางกายภาพที่โฮสต์แอปเหล่านี้จะถูกออฟไลน์เพื่อการบำรุงรักษาเป็นระยะเวลาสั้น ๆ (เราคาดว่าจะใช้เวลาน้อยกว่า 15 นาที)

ในช่วงเวลานั้นเราต้องการเปลี่ยนเส้นทางการเข้าชมทั้งหมดที่เข้ามาในเว็บไซต์ใด ๆ ไปยังหน้า "เรากำลังอยู่ระหว่างการบำรุงรักษา"

ฉันรู้ว่าฉันสามารถทำได้โดยไปที่ทุกเว็บแอปและตั้งค่ากฎการเขียน 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>

สิ่งนี้ไม่ทำงาน เราใช้. NET 4.0 64 บิตใน IIS แต่ "ในกรณี" ฉันใส่ไฟล์ web.config 32 บิตและ 2.0 ทั่วโลกในสิ่งเดียวกันและยังคงไม่มีการเปลี่ยนแปลง

App_Offline.htm "ไฟล์พิเศษ"

ข้อเสนอแนะอีกข้อหนึ่งที่ฉันเคยเห็นคือไฟล์app_offline.htm "พิเศษ"แต่เรากลับพบปัญหาเดียวกันกับที่มันใช้เวลานานกว่าในการปรับใช้ไฟล์นี้กับรากแอพของแอพทั้งหมดของเรามากกว่าที่จะทำการบำรุงรักษาจริง

ไซต์ "เราออฟไลน์" ใน IIS

เว็บไซต์ทั้งหมดของเราติดตั้งใน IIS ด้วย IP เดียว สิ่งนี้ใช้ได้สำหรับเราแม้ไม่มี SNA เพราะแอปทั้งหมดของเราใช้ใบรับรอง SSL เดียว (เป็น UCC) สิ่งหนึ่งที่เกิดขึ้นกับฉันคือบางทีฉันอาจตั้งค่าไซต์ใน IIS ที่ตรงกับปริมาณการใช้งานทั้งหมดกับ IP ที่เราใช้และไม่ได้ระบุค่าส่วนหัวของโฮสต์ ความหวังคือฉันสามารถให้ "ลำดับความสำคัญ" ที่สูงขึ้นและเมื่อเริ่มต้นจะจับคู่อัตราการเข้าชมทั้งหมดกับ IP นั้นก่อนที่เว็บไซต์อื่นใดจะมีโอกาสตรงกัน ฉันสามารถตั้งค่าไซต์นั้นเพื่อให้บริการหน้าเดียวกันสำหรับคำขอทั้งหมดโดยไม่คำนึงถึง URL คำขอ

เริ่มต้นไซต์นั้นเมื่ออยู่ระหว่างการบำรุงรักษาและหยุดเมื่อเสร็จสิ้น

แต่ฉันก็ไม่สามารถทำงานได้เช่นนี้เนื่องจาก IIS ดูเหมือนจะจับคู่คำขอ HTTP กับไซต์ที่เฉพาะเจาะจงมากขึ้นก่อนที่จะเจาะจงน้อยลง ดังนั้นโดยการละเว้นค่าส่วนหัวของโฮสต์สำหรับไซต์ "แจ้งให้ผู้ใช้ทราบว่าเราออฟไลน์" จะไม่ได้รับการจับคู่เว้นแต่คำขอจะไม่มีค่าส่วนหัวของโฮสต์ที่ตรงกับไซต์อื่น ซึ่งทำให้เรากลับมามีปัญหาเดียวกันกับที่ต้องไปที่แต่ละเว็บแอปด้วยตนเองและดำเนินการเพื่อออฟไลน์แล้วนำกลับมาออนไลน์เมื่อเราทำการบำรุงรักษาเสร็จแล้ว

มีวิธีง่ายๆในการทำสิ่งนี้หรือไม่? ดูเหมือนว่าเราไม่ใช่คนแรกที่จะพบปัญหานี้

-Josh


ทางเลือกหนึ่งคือการติดตั้งอินสแตนซ์ของ apache หรือเว็บเซิร์ฟเวอร์อื่นและตั้งค่าเว็บไซต์ขออภัยในนั้น จากนั้นเมื่อถึงเวลาหยุด IIS และเริ่ม apache และให้จัดการคำขอทั้งหมด
phoebus

วิธีที่เราทำ btw นี้โดยทั่วไปคือการมีหน้าขอโทษบนอุปกรณ์ด้านหน้าของเซิร์ฟเวอร์เช่นตัวโหลดบาลานซ์
phoebus

คำตอบ:


6

ฉันจะใช้วิธีที่สามของคุณ"We're offline" Site in IISสมมติว่าคุณตั้งชื่อOfflineหากไม่มีส่วนหัวของโฮสต์ที่ระบุไว้จะให้บริการคำขอทั้งหมดที่เว็บไซต์อื่น ๆ ที่มีส่วนหัวโฮสต์จับคู่ไม่ได้รับ เพื่อป้องกันสิ่งนี้คุณเพียงแค่หยุดเว็บไซต์อื่น ๆ ทั้งหมด

สมมติว่าคุณติดตั้ง IIS Scripting อยู่ให้เปิด 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 ไปยัง cmdlet Stop-WebSite cmdlet ได้ แต่มันยังใช้ได้กับทุกเว็บไซต์

หากคุณมีเว็บไซต์ที่ไม่ได้ทำงานตามปกติคุณจะต้องยกเว้นเว็บไซต์เหล่านั้นในคำสั่งที่สองเช่น:

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

หากคุณไม่ได้ติดตั้ง PowerShell cmdlets สำหรับ IIS คุณสามารถใช้ appcmd.exe เพื่อทำสิ่งเดียวกันได้ฉันไม่ได้ใช้ในช่วงหลายปีที่ผ่านมา


2

เว็บไซต์ทั้งหมดของเราติดตั้งใน IIS ด้วย IP เดียว

1) ใช้สก์ท็อปเก่าทำงาน distro ลินุกซ์สดให้มัน IP เดียวกับกล่อง IIS ไม่ได้เชื่อมต่อกับเครือข่าย

2) เปิดไฟ nginx บนกล่อง linux สดและทำหน้าดาวน์ไทม์ตามที่คุณต้องการทดสอบโดยใช้สวิตช์ / ฮับออฟไลน์ที่เชื่อมต่อกับแล็ปท็อปของคุณ

3) ถอดปลั๊กสายเคเบิลอีเทอร์เน็ต IIS กล่องและเสียบเข้ากับกล่องลินุกซ์สด

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 ด้วยข้อความออฟไลน์

ขั้นตอนต่อไปนี้สำคัญมากคุณต้องหยุดบริการทั้งหมดที่อาจใช้พอร์ต 80 ก่อนที่จะใช้ Apache คุณอาจพบรายการส่วนใหญ่ที่ลิงค์นี้


0

ฉันรู้ว่านี่เก่า แต่ฉันต้องทำมันในกล่องเก่าของ Windows 2008 r2 นี่คือคำตอบเพิ่มเติมสำหรับชื่อคำถาม เกี่ยวกับรายละเอียดคำถามนั้นเป็นเพียงวิธีหนึ่งในการตั้งค่า " เราเป็นเว็บไซต์ออฟไลน์ใน IIS"

สิ่งนี้ไม่ได้พึ่งพาอะไรมากกว่า IIS และ HTML แบบคงที่ ฟังก์ชัน "การเปลี่ยนเส้นทาง HTTP" ของ IIS ไม่ได้จัดการสิ่งที่คุณต้องการ แต่มีวิธีอื่นในการจำลอง เพียงเปลี่ยน "หน้าข้อผิดพลาด" ทั้งหมดเพื่อให้ไซต์ชี้ไปที่หน้าการบำรุงรักษา ใช่มันใช้งานได้ก็ต่อเมื่อคุณสามารถใช้ "ไซต์" ทั้งหมดใน IIS

ในกรณีของฉันไซต์มีไฟล์ "default.htm" ไฟล์เดียวในโฟลเดอร์รูท (เช่น c: \ InetPub \ wwwroot) ดังนั้นทั้งหมดของ "ข้อผิดพลาดหน้า" มีการกำหนดให้ "Execute 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.