IIS'deki tüm * HTTP / HTTPS isteklerini geçici olarak "sunucu bakımı" sayfasına yönlendirin


10

Yüzlerce ayrı web uygulaması barındıran bir IIS sunucumuz var ve bu uygulamaları barındıran fiziksel veritabanı sunucusu kısa bir süre bakım için çevrimdışı olacak (15 dakikadan az sürmesini bekliyoruz).

Bu süre zarfında, gelen tüm trafiği herhangi bir web sitesi için "şu anda bakım aşamasındayız" sayfasına yönlendirmek istiyoruz.

Bunu her web uygulamasına gidip kullanıcıyı bu uygulamadaki tüm istekler için başka bir sayfaya gönderen bir IIS yeniden yazma kuralı oluşturarak yapabileceğimin farkındayım. Ancak, bunu yapmak, veritabanı bakımını yapmaktan daha uzun sürecektir!

Hiçbiri işe yaramayan üç şey denedim:

Global IIS Yeniden Yazma Kuralı

Tüm sitelere bir kural uygulamak için basit bir yol arıyordum , tek bir swoop düştü - ve sonra eşit derecede ağrısız bir adımda "kuralı" geri almak mümkün. Şimdiye kadar hiçbir girişimim olmadı. Bu yeniden yazma kuralını W: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config adresindeki genel web.config dosyasına yerleştirmeyi denedim:

<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>

Bu işe yaramadı. IIS'de .NET 4.0 64 bit çalıştırıyoruz.

App_Offline.htm "özel dosya"

Gördüğüm diğer bir öneri app_offline.htm "özel" dosyası , ancak bu sorunu, aslında bakım yapmaktan çok, tüm uygulamalarımızın uygulama köküne dağıtmanın daha uzun sürdüğü sorunu yaşıyoruz.

IIS'de "Çevrimdışıyız" Sitesi

Tüm sitelerimiz IIS'de tek bir IP ile kurulur. Bu, SNA'sız bile bizim için geçerlidir, çünkü tüm uygulamalarımız tek bir SSL sertifikası paylaşır (bu bir UCC'dir). Aklıma bir şey olduğunu belki kurulum olabilir Kullandığımız IP'ye tüm trafiği eşleşti ve bu IIS bir site yoktu bir ana başlık değerini belirtin. Umut, daha yüksek bir "öncelik" verebilmemdi ve başladığında, diğer sitelerin herhangi biriyle eşleşme şansı bulamadan tüm IP trafiğini eşleştirecekti. Bu siteyi, istek URL'sine bakılmaksızın tüm istekler için aynı sayfayı sunacak şekilde ayarlayabilirim.

Bakım yaparken bu siteyi başlatın ve bittiğinde durdurun.

Ancak, IIS'nin daha az spesifik olmadan önce bir HTTP isteğini daha belirli bir siteyle eşleştirdiği anlaşıldığında, bu çalışmayı da başaramadım. Bu nedenle, bu "kullanıcılara çevrimdışı olduğumuzu söyle" sitesi için bir ana bilgisayar üstbilgisi değerini atlayarak, isteğin başka bir siteyle eşleşen bir ana bilgisayar üstbilgisi değeri olmadığı sürece eşleşme olmadı. Bu da bizi her bir web uygulamasına manuel olarak gitme ve çevrimdışı duruma getirmek için bir işlem gerçekleştirme ve bakım ile işimiz bittiğinde tekrar çevrimiçi duruma getirme sorununa geri döndürüyor

Bunu başarmanın basit bir yolu var mı? Bu sorunla ilk karşılaşan biz değiliz.

-Josh


Bir seçenek, bir apache veya başka bir web sunucusu örneği yüklemek ve üzücü sitenizi buna kurmak olabilir. Ardından, zamanı geldiğinde IIS'yi durdurun ve apache'yi başlatın ve tüm istekleri işlemesini sağlayın.
phoebus

Bu btw'yi yaygın olarak yapma şeklimiz, sunucunun önündeki bir aygıtta, örneğin bir yük dengeleyici için üzgün bir sayfaya sahip olmaktır.
phoebus

Yanıtlar:


6

Belirttiğiniz ana bilgisayar üstbilgisi yoksa, eşleşen bir ana bilgisayar üstbilgisine sahip diğer sitelerden herhangi biri tarafından alınmayan tüm istekleri sunacak şekilde "We're offline" Site in IISadlandırdığınız diyelim , üçüncü yaklaşımınızla birlikte giderim Offline. Bunu önlemek için diğer tüm siteleri durdurmanız yeterlidir.

IIS Komut Dizisi yüklü olduğunu varsayarsak, yükseltilmiş bir PowerShell açın:

import-module webadministration

Artık Çevrimdışı site dışındaki tüm siteleri durdurabilirsiniz:

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

SQL Server yedeklendiğinde, yeniden başlatın:

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

FTP siteleriniz de varsa, bir FTP sitesini Stop-WebSite cmdlet'ine bağlayamadığınız için komutlar bir hata gösterir, ancak yine de tüm web siteleri için çalışır.

Normalde çalışmayan siteleriniz varsa, bunları ikinci komutta hariç tutmanız gerekir, örneğin:

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

IIS için PowerShell cmdlet'leri yüklü değilse, aynısını yapmak için appcmd.exe'yi kullanabilirsiniz, bunu yıllardır kullanmadım.


2

Tüm sitelerimiz IIS'de tek bir IP ile kurulur.

1), kutu IIS olarak bunu aynı ip vermek, canlı linux dağıtımın çalıştırın eski masaüstü alıyoruz değil ağınıza bağlayın

2) canlı linux kutusunda nginx'i ateşleyin ve kesinti sayfasını istediğiniz gibi yapın, dizüstü bilgisayarınıza bağlı bir çevrimdışı anahtar / hub kullanarak test edin

3) IIS kutusu ethernet kablosunu çıkarın ve canlı linux kutusuna takın.

4) anahtar üzerindeki mac addr önbelleğini temizleyin (veya rulo gücü). kesinti siteniz artık yayında.


0

Apache'yi yükleyin ve aşağıdaki gibi sanal ana bilgisayar oluşturun path\to\apache\conf\extra\httpd-vhosts.conf:

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

    # Other directives here
</VirtualHost>

Ardından, yukarıdaki ayarda belirtilen belge kökünde, çevrimdışı iletiyle bir index.html dosyası oluşturun.

Aşağıdaki adım çok önemlidir, Apache'yi çalıştırmadan önce 80 numaralı bağlantı noktasını kullanabilecek tüm hizmetleri durdurmanız gerekir. Çoğunluğunun bir listesini bu linkte bulabilirsiniz


0

Bunun eski olduğunu biliyorum, ama bunu eski bir Windows 2008 r2 kutusunda yapmak zorunda kaldım. Bu soru başlığı için daha çok bir cevap; soru ayrıntılarıyla ilgili olarak, " IIS'de Çevrimdışıyız site" oluşturmanın tek yolu budur.

Bu, IIS ve statik HTML'den başka bir şeye dayanmaz. IIS'nin "HTTP Yeniden Yönlendirme" işlevi istediğinizi işlemez, ancak simüle etmenin başka bir yolu vardır. Sitenin bakım sayfasına işaret etmesi için tüm "Hata Sayfaları" nı değiştirmeniz yeterlidir. Evet, bu yalnızca IIS'de tüm bir "siteyi" kullanabiliyorsanız çalışır.

Benim durumumda, sitenin kök klasöründe tek bir "default.htm" dosyası var (örn. C: \ InetPub \ wwwroot). Bu nedenle, tüm "Hata Sayfaları" "Bu sitede bir URL yürütmek" ve "/default.htm" yolunu kullanmak üzere yapılandırılmıştır. Dosyada mutlak URL'ler kullandığımdan (yani "/" ile başlayarak), genel URL'nin nasıl göründüğüne bakılmaksızın içeriği tarayıcıda doğru bir şekilde yürütülür.

Bu yapılandırmanın net sonucu, siteye yapılan tüm bakım taleplerinin bakım sayfamın içeriğine hizmet etmesidir. İsteğin ne olduğu önemli değil.

Ayrıca, kök klasörde bir web.config dosyası oluşturarak IIS'nin bu değişikliği etkileyeceğini unutmayın. Benim için yarattığı şey:

 <?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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.