IIS의 * all * HTTP / HTTPS 요청을“서버 유지 관리”페이지로 임시 리디렉션


10

수백 개의 개별 웹 응용 프로그램을 호스팅하는 IIS 서버가 있으며 이러한 응용 프로그램을 호스팅하는 실제 데이터베이스 서버는 짧은 기간 동안 유지 관리를 위해 오프라인 상태가 될 것입니다 (15 분 미만 소요될 것으로 예상).

해당 기간 동안 모든 웹 사이트에서 들어오는 모든 트래픽을 "현재 유지 보수 중입니다"페이지로 리디렉션하려고합니다.

모든 웹 응용 프로그램으로 이동하여 해당 응용 프로그램의 모든 요청에 ​​대해 다른 페이지로 사용자를 보내는 IIS 다시 쓰기 규칙을 설정하면이 작업을 수행 할 수 있습니다. 그러나 데이터베이스 유지 관리를 수행하는 것보다 그렇게하는 데 시간이 더 오래 걸립니다!

나는 세 가지를 시도했지만 그중 아무것도 효과가 없었습니다.

글로벌 IIS 다시 쓰기 규칙

나는 한 번에 모든 사이트에 규칙을 적용하는 간단한 방법을 찾고 있었고, 그 규칙을 똑같이 고통없이 한 단계에서 "취소"할 수있었습니다. 지금까지 내 시도는 효과가 없었습니다. 이 재 작성 규칙을 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에서 .NET 4.0 64 비트를 실행하고 있지만 "경우에 따라"32 비트 및 2.0 글로벌 web.config 파일과 같은 것을 넣었지만 여전히 변경되지 않았습니다.

App_Offline.htm "특수 파일"

내가 본 또 다른 제안은 app_offline.htm "special"파일 이지만 실제로 유지 관리를 수행하는 것 보다이 파일을 모든 앱의 앱 루트에 배포하는 데 시간이 더 걸리는 것과 같은 문제가 있습니다.

IIS의 "오프라인"사이트

모든 사이트는 단일 IP로 IIS에서 설정됩니다. 이는 모든 앱이 단일 SSL 인증서 (UCC)를 공유하기 때문에 SNA 없이도 작동합니다. 나에게 일어난 한 가지 일은 아마도 사용중인 IP와 모든 트래픽을 일치 시키고 호스트 헤더 값을 지정 하지 않은 IIS에서 사이트를 설정할 수 있다는 것 입니다. 희망은 내가 더 높은 "우선 순위"를 부여 할 수 있고 시작될 때 다른 사이트가 일치 할 기회를 갖기 전에 모든 트래픽을 해당 IP로 일치시킬 수 있기를 희망했습니다. 요청 URL에 관계없이 모든 요청에 ​​대해 동일한 페이지를 제공하도록 해당 사이트를 설정할 수 있습니다.

유지 보수를 수행 할 때 해당 사이트를 시작하고 완료되면 중지하십시오.

그러나 IIS가 덜 구체적인 사이트보다 먼저 특정 사이트에 대한 HTTP 요청을 일치시키는 것처럼 보이기 때문에이 작업을 수행 할 수 없었습니다. 따라서이 "오프라인 사용자에게 알리기"사이트에 대한 호스트 헤더 값을 생략하면 요청에 다른 사이트와 일치하는 호스트 헤더 값이 없으면 일치하지 않습니다. 그러면 각 웹앱으로 수동으로 이동하여 오프라인 상태로 전환 한 다음 유지 관리 작업이 완료되면 다시 온라인으로 전환해야하는 동일한 문제가 발생합니다.

이것을 달성하는 간단한 방법이 있습니까? 분명히 우리는이 문제를 처음 겪은 것은 아닙니다.

-조롱


한 가지 옵션은 아파치 또는 다른 웹 서버 인스턴스를 설치하고 그 안에 미안한 사이트를 설정하는 것입니다. 그런 다음 시간이되면 IIS를 중지하고 아파치를 시작하고 모든 요청을 처리하도록하십시오.
피버스

일반적으로이 btw를 수행하는 방법은 서버 앞에있는 장치 (예 :로드 밸런서)에 잘못된 페이지가있는 것입니다.
피버스

답변:


6

나는 세 번째 접근 방식으로 갈 것 "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를 사용하여 동일한 작업을 수행 할 수 있지만 몇 년 동안 사용하지는 않았습니다.


2

모든 사이트는 단일 IP로 IIS에서 설정됩니다.

1) 오래된 데스크탑을 가지고 라이브 리눅스 배포판을 실행하고 IIS 상자와 동일한 IP를주고 네트워크에 연결 하지 마십시오.

2) 라이브 리눅스 박스에서 nginx를 실행하고 다운 타임 페이지를 원하는대로 만들고 ur 노트북에 연결된 오프라인 스위치 / 허브를 사용하여 테스트하십시오

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 파일을 작성하십시오.

다음 단계는 매우 중요합니다. Apache를 실행하기 전에 포트 80을 사용할 수있는 모든 서비스를 중지해야합니다. 이 링크 에서 대부분의 목록을 찾을 수 있습니다


0

나는 이것이 오래된 것을 알고 있지만 오래된 Windows 2008 r2 상자 에서이 작업을 수행해야했습니다. 이것은 질문 제목에 대한 답변입니다. 질문 세부 정보와 관련하여 " IIS의 오프라인 사이트 "를 설정하는 방법 중 하나 입니다.

이것은 IIS와 정적 HTML 이상의 것에 의존하지 않습니다. IIS의 "HTTP Redirect"기능은 원하는 것을 처리하지 않지만이를 시뮬레이션하는 또 다른 방법이 있습니다. 사이트가 유지 보수 페이지를 가리 키도록 모든 "오류 페이지"를 변경하십시오. 예, IIS에서 전체 "사이트"를 사용할 수있는 경우에만 작동합니다.

제 경우에는 사이트의 루트 폴더에 단일 "default.htm"파일이 있습니다 (예 : c : \ InetPub \ wwwroot). 따라서 모든 "오류 페이지"는 "이 사이트에서 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.