Arahkan sementara * semua * permintaan HTTP / HTTPS di IIS ke halaman "pemeliharaan server"

10

Kami memiliki server IIS yang menampung ratusan aplikasi web yang terpisah, dan server basis data fisik yang menampung aplikasi-aplikasi ini akan dimatikan untuk pemeliharaan untuk jangka waktu yang singkat (kami memperkirakan akan membutuhkan waktu kurang dari 15 menit).

Selama periode itu, kami ingin mengarahkan SEMUA lalu lintas yang masuk, untuk situs web mana pun, ke halaman "kami sedang menjalani pemeliharaan".

Saya menyadari bahwa saya dapat melakukan ini dengan membuka setiap aplikasi web, dan menyiapkan aturan penulisan ulang IIS yang mengirim pengguna ke halaman lain untuk semua permintaan dalam aplikasi itu. Tapi, kita butuh waktu lebih lama untuk melakukan itu daripada melakukan pemeliharaan basis data!

Saya sudah mencoba tiga hal, tidak ada yang berhasil:

Aturan Penulisan Ulang IIS Global

Saya telah mencari cara sederhana untuk menerapkan aturan ke semua situs, dalam satu gerakan - dan kemudian dapat "membatalkan" aturan itu dalam satu langkah yang sama-sama tidak menyakitkan. Sejauh ini, tidak ada upaya saya yang berhasil. Saya memang mencoba meletakkan aturan penulisan ulang ini di web.config global saya di 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>

Ini tidak berhasil. Kami sedang menjalankan .NET 4.0 64 bit di IIS, tetapi "untuk berjaga-jaga" saya meletakkan hal yang sama pada 32 bit dan 2.0 file web.config global, dan masih tidak ada perubahan.

App_Offline.htm "file khusus"

Satu saran lain yang pernah saya lihat adalah file "khusus" app_offline.htm , tapi kami kembali ke masalah yang sama dengan waktu yang lebih lama untuk menyebarkan file ini ke root aplikasi semua aplikasi kami daripada benar-benar melakukan pemeliharaan.

Situs "Kami sedang offline" di IIS

Semua situs kami diatur dalam IIS dengan satu IP. Ini bekerja untuk kami bahkan tanpa SNA karena semua aplikasi kami berbagi satu sertifikat SSL (ini adalah UCC). Satu hal yang terpikir oleh saya adalah mungkin saya dapat mengatur situs di IIS yang cocok dengan semua lalu lintas ke IP yang kami gunakan, dan tidak menentukan nilai header host. Harapannya adalah bahwa saya bisa memberikan "prioritas" yang lebih tinggi dan bahwa, ketika dimulai, akan cocok dengan semua lalu lintas ke IP itu, sebelum ada situs lain yang memiliki kesempatan untuk mencocokkan. Saya dapat mengatur situs itu untuk melayani halaman yang sama untuk semua permintaan, terlepas dari URL permintaan.

Mulai situs itu saat menjalani pemeliharaan, dan hentikan ketika selesai.

Tapi, saya juga tidak bisa mendapatkan ini berfungsi, karena IIS tampaknya cocok dengan permintaan HTTP ke situs yang lebih spesifik sebelum kurang spesifik. Jadi, dengan menghilangkan nilai header-host untuk situs "beri tahu pengguna kami offline", itu tidak cocok kecuali permintaan tersebut tidak memiliki nilai header-host yang cocok dengan situs lain. Yang menempatkan kita kembali pada masalah yang sama karena harus secara manual pergi ke setiap aplikasi web dan melakukan tindakan untuk membuatnya offline dan kemudian mengembalikannya secara online ketika kita selesai dengan pemeliharaan

Apakah ada cara sederhana untuk mencapai ini? Tampaknya kita bukan yang pertama kali menghadapi masalah ini.

-Ya

Josh
sumber
Salah satu opsi adalah menginstal instance dari apache atau server web lain dan mengatur situs maaf Anda di dalamnya. Kemudian, ketika saatnya tiba, hentikan IIS dan mulai apache dan minta ia menangani semua permintaan.
phoebus
Cara yang biasa kita lakukan ini adalah dengan memiliki halaman maaf pada perangkat di depan server, misalnya penyeimbang beban.
phoebus

Jawaban:

6

Saya akan pergi dengan pendekatan ketiga Anda "We're offline" Site in IIS, katakan Anda menamainya Offline, jika tidak memiliki header host ditentukan itu akan melayani semua permintaan yang tidak diambil oleh salah satu situs lain yang memiliki header host yang cocok. Untuk mencegahnya, Anda cukup hentikan semua situs lain.

Dengan asumsi Anda telah menginstal IIS Scripting, buka PowerShell yang lebih tinggi:

import-module webadministration

sekarang Anda dapat menghentikan semua situs kecuali yang Offline:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Stop-WebSite

ketika SQL-Server kembali, mulai lagi:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Start-WebSite

Jika Anda memiliki situs FTP juga, perintah akan menunjukkan kesalahan karena Anda tidak dapat mengirim pipa situs FTP ke cmdlet Stop-WebSite, tetapi masih berfungsi untuk semua situs web.

Jika Anda memiliki situs yang biasanya tidak berjalan, Anda harus mengecualikannya di perintah kedua, seperti:

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

Jika Anda tidak memiliki cmdlet PowerShell untuk IIS yang diinstal, Anda dapat menggunakan appcmd.exe untuk melakukan hal yang sama, saya belum pernah menggunakannya selama bertahun-tahun.

Peter Hahndorf
sumber
2

Semua situs kami diatur dalam IIS dengan satu IP.

1) mengambil desktop tua, menjalankan live linux distro, memberikan ip yang sama seperti kotak IIS, jangan tidak terhubung ke jaringan

2) jalankan nginx di live linux box, dan buat halaman downtime sesuai keinginan Anda, ujilah dengan menggunakan sakelar / hub offline yang terhubung ke laptop Anda

3) cabut kabel ethernet box IIS, dan colokkan ke kotak linux langsung.

4) menghapus cache addr mac pada switch (atau roll power). situs downtime Anda sekarang aktif.

nandoP
sumber
0

Instal Apache dan buat host virtual seperti berikut ini di path\to\apache\conf\extra\httpd-vhosts.conf:

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

    # Other directives here
</VirtualHost>

Kemudian di root dokumen yang ditentukan dalam pengaturan di atas, buat file index.html dengan pesan offline.

Langkah berikut ini sangat penting, Anda harus menghentikan semua layanan yang mungkin menggunakan port 80 sebelum menjalankan Apache. Anda dapat menemukan daftar mayoritas mereka di tautan ini

SaidbakR
sumber
0

Saya tahu ini sudah tua, tapi saya harus melakukan ini pada kotak Windows 2008 r2 yang lama. Ini adalah jawaban lebih untuk judul pertanyaan; berkenaan dengan perincian pertanyaan, maka hanya satu pendekatan untuk menyiapkan " Kami Situs Offline di IIS".

Ini tidak mengandalkan apa pun selain IIS dan HTML statis. Fungsionalitas "HTTP Redirect" IIS tidak menangani apa yang Anda inginkan, tetapi ada cara lain untuk mensimulasikannya. Cukup ubah semua "Halaman Kesalahan" agar situs mengarah ke halaman pemeliharaan. Ya, ini hanya berfungsi jika Anda dapat menggunakan seluruh "situs" di IIS.

Dalam kasus saya, situs ini memiliki satu file "default.htm" di folder root-nya (mis. C: \ InetPub \ wwwroot). Jadi semua "Halaman Kesalahan" dikonfigurasikan ke "Jalankan URL di situs ini" dan gunakan path "/default.htm". Karena saya menggunakan URL absolut (yaitu dimulai dengan "/") dalam file, kontennya dieksekusi dengan benar di browser, apa pun URL publik yang muncul.

Hasil bersih dari konfigurasi ini adalah setiap / semua permintaan ke situs melayani konten halaman pemeliharaan saya. Tidak masalah apa permintaannya.

Perlu diketahui juga bahwa IIS akan memengaruhi perubahan ini dengan membuat file web.config di folder root. Inilah yang dibuat untuk saya:

 <?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>
Granger
sumber