IIS 6 또는 IIS 7.x의 IIS 압축 문제 해결

적용 대상: 인터넷 정보 서비스 6.0, 인터넷 정보 서비스 7.0 이상 버전

개요

IIS 6 또는 7 웹 애플리케이션에 HTTP 압축을 사용하도록 설정하는 것은 사이트 성능을 높이는 한 가지 방법입니다.

IIS를 완전히 관리하는 데 필요한 대부분의 압축 속성은 관리자 GUI에 의해 노출되지 않습니다. 그것은 단지 켜기 또는 끄기 스위치를 제공합니다. 따라서 HTTP 압축을 완전히 사용하도록 설정하려면 IIS 관리자 이외의 도구를 사용하여 metabase.xml 파일을 업데이트해야 합니다. 사용되는 가장 일반적인 도구는 IIS 설치 디렉터리에 포함된adsutil.vbs입니다.

이 문서는 압축을 구성하는 데 도움이 되며 IIS 압축이 IIS 6 및 IIS 7.x에서 작동하지 않는 일반적인 이유를 식별합니다.

이 문제 해결사에 사용되는 도구

  • Fiddler
  • 프로세스 모니터
  • 메타베이스 ACL
  • IIS 7 FREB 추적

확인

압축이 작동하는지 확인

IIS 서버가 압축된 응답을 보냈는지 여부를 확인하는 유일한 방법은 클라이언트 요청 및 서버 응답의 네트워크 추적을 분석하는 것입니다. 클라이언트의 요청에는 다음 HTTP 요청 헤더가 포함되어야 합니다.

HTTP: Accept-Encoding =gzip, deflate

이를 통해 서버는 클라이언트가 압축된 응답을 받을 의향이 있음을 알 수 있으며 압축을 지원합니다. 이에 대한 대가로 서버의 압축된 응답에는 다음 HTTP 응답 헤더와 값이 포함됩니다.

HTTP: Content-Encoding = gzip

다음 스크린샷은 압축이 작동하지 않을 때 Fiddler 도구의 출력을 보여 줍니다.

변환기 탭에서 압축 없음으로 설정된 HTTP 압축의 스크린샷

변환기 탭에서 비활성화된 HTTP 압축 섹션의 스크린샷

압축 문제 해결

압축 문제를 해결하려면 다음 단계를 수행합니다.

  1. IIS 6 또는 IIS 7에서 압축을 사용하도록 설정합니다.

    IIS 관리자에서 웹 사이트 노드를 마우스 오른쪽 단추로 클릭하고 속성을선택한 다음 서비스를 선택합니다.

    정적 파일 압축이 선택되고 최대 임시 디렉터리 크기가 무제한으로 설정된 HTTP 압축의 스크린샷

    기본값이 있는 활성화된 압축 옵션의 스크린샷

  2. 압축 폴더 및 사용 권한을 지정합니다.

    IIS는 압축된 파일을 구성할 수 있는 폴더에 저장합니다. 기본적으로 %windir%\IIS Temporary Compressed Files IIS 6 및 %SystemDrive%\inetpub\temp\IIS Temporary Compressed Files IIS 7용입니다.

    IIS_WPG(IIS 7의 경우 IIS_IURS)에는 이 폴더에 대한 모든 권한이 있어야 합니다. 프로세스 모니터를 사용하여 이러한 유형의 권한 문제를 해결합니다.

  3. Metabase.xml에서 압축을 사용할 수 있는지 확인합니다.

    압축은 오른쪽 노드의 메타베이스에서 설정되지 않습니다. 압축 구성에는 다음과 같은 세 가지 메타베이스 노드가 있습니다.

    • w3svc/filters/compression/parameters
    • w3svc/filters/compression/gzip
    • w3svc/filters/compression/deflate

    노드 구성은 /parameters 필수입니다. 그런 다음, 또는 노드 또는 /deflate 둘 다를 구성할 /gzip 수 있습니다. 즉, gzip, deflate 또는 매개 변수 노드만 구성하면 작동하지 않습니다. 및 /gzip 노드를 /parameters 구성하는 경우 Gzip 압축 체계가 사용하도록 설정됩니다. 및 /deflate 노드를 /parameters 구성하는 경우 Deflate 압축 체계가 사용하도록 설정됩니다. 마지막으로 세 노드를 모두 구성하는 경우 GZip 압축과 Deflate 압축이 모두 사용하도록 설정됩니다.

  4. IIS 6에 대한 메타베이스 권한을 확인합니다.

    기본적으로 IIS_WPG 에는 읽기, 안전하지 않은 읽기, 키 열거 및 에 대한 쓰기 권한이 있습니다 /LM/W3SVC/Filters.

    예기치 않은 변경으로 인해 권한이 제거되었거나 보안이 강화되면 IIS에서 압축을 초기화할 수 없습니다.

    metaacl.vbs 사용하여 IIS 6 메타베이스 ACL을 확인하고 수정합니다. 자세한 내용은 기본 메타베이스 ACL을 참조하세요.

    애플리케이션 풀 ID(또는 IIS_WPG 일반적으로 그룹)에 메타베이스 키 W3SVC 또는 필터에 대한 읽기 및 쓰기 액세스 권한이 없는 경우 의 COMPRESSION_DISABLED 오류 조건은 ETW(Enterprise Tracing for Windows) 추적에 기록됩니다.

    ETW 추적

    IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression
    Reason: COMPRESSION_DISABLED
    
  5. Metabase.xml에서 동적 또는 정적 압축이 꺼져 있는지 확인합니다.

    세 구성 노드(/parameters, /gzip/deflate)에서 정적 및/또는 동적 압축을 사용하도록 설정하는 옵션이 있습니다. .txt 및 .html 같은 파일 형식에 대해 정적 압축을 HcDoStaticCompression 사용하도록 설정하려면 키를 (또는 TRUE)로 1 설정해야 합니다. .asp, .aspx, .asmx 또는 .exe 같은 파일 형식에 대해 동적 압축을 사용하도록 설정하려면 키를 1 (또는 TRUE)로 설정 HcDoDynamicCompression 해야 합니다.

    예를 들어 노드에서 동적 압축을 /parameters 설정하려면 adsutil.vbs사용하여 다음 명령을 실행합니다.

    cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
    

    이전 명령의 출력은 다음과 같습니다.

    HcDoDynamicCompression          : (BOOLEAN) True
    

    IIS7에서

    <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    </system.webServer>
    
  6. 압축하려는 파일 형식이 및 /deflate 노드의 적절한 파일 확장명 섹션에 /gzip 나열되어 있는지 확인합니다.

    및/또는 HcDoStaticCompression 키를 사용하여 압축을 HcDoDynamicCompression 켠 후 실제로 압축해야 하는 파일 형식을 지정합니다. 기본적으로 STATIC 압축은 .htm, .html 및 .txt 같은 파일 형식을 사용하며 동적 압축은 .asp, .dll 및 .exe 사용합니다. 다른 파일 형식(예: .aspx)을 압축하려는 경우 사용 중인 압축 유형에 /gzip 따라 및 노드 /deflate 의 적절한 파일 확장명 섹션에 추가합니다. 정적 파일 압축(예: .html, txt 및 xml)의 경우 속성에 파일 확장자를 추가합니다 HcFileExtensions . 동적 압축(예: .asp, .aspx 및 .asmx)의 경우 속성에 HcScriptFileExtension 추가합니다.

    정적 파일의 경우

    adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
    
    adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
    

    이전 명령은 다음 출력을 보여줍니다.

    HcFileExtensions : (LIST)  (3 Items)
    "htm"
    "html"
    "txt"
    

    동적 파일의 경우

    adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
    adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
    

    이전 명령은 다음 출력을 보여줍니다.

    HcFileExtensions : (LIST)  (4 Items)
    "asp"
    "dll"
    "exe"
    "aspx"
    

    IIS7에서

    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="1000">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
    <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/xaml+xml" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </dynamicTypes>
    </httpCompression>
    <system.web.extensions>
    <scripting>
        <scriptResourceHandler enableCompression="false" />
    </scripting>
    </system.web.extensions>
    

    참고

    올바른 구문을 사용하여 또는 HcScriptFileExtensions 속성을 구성 HcFileExtensions 해야 합니다. 후행 공백 또는 불필요한 따옴표 또는 캐리지 리턴이 있으면 속성이 잘못 구성됩니다. 아쉽게도 adsutil.vbs 추가 공간을 추가하는 경우 오류가 표시되지 않으므로 매우 주의해야 합니다. 또한 명령 프롬프트 또는 metabase.xml 파일(메타베이스 직접 편집)에 값을 복사하거나 붙여넣을 수 없으며 수동으로 입력해야 합니다.

  7. 압축이 master 수준에서 설정되었지만 자식 수준의 설정으로 재정의되는지 확인합니다.

    압축은 수준에서 사용하도록 설정 w3svc/filters/compression 됩니다. 그러나 웹 사이트 또는 애플리케이션 수준의 설정에 의해 재정의되는 것일 수 있습니다.

    예를 들어 수준에서 로 TRUEw3svc/filters/compression 설정하고 기본 웹 사이트의 경우 를 로 FALSE설정한 경우 HcDoDynamicCompression 기본 웹 사이트에 DoDynamicCompression 대한 요청에 대한 응답에 대해 동적 압축이 발생하지 않습니다.

  8. 바이러스 백신 프로그램이 압축된 파일이 저장된 디렉터리를 검사했는지 확인합니다.

    IIS를 실행하는 서버에서 압축을 사용하도록 설정하고 IIS 압축 디렉터리에서 HTTP 요청을 제공하는 경우 예상 파일 대신 0 바이트 파일이 반환될 수 있습니다.

    참고

    HTTP 정적 압축을 사용하도록 설정한 경우에만 이러한 증상이 나타날 수 있습니다.

    이는 IIS 서버에서 실행되는 바이러스 백신 소프트웨어가 IIS 압축 디렉터리를 검사하고 있기 때문에 발생합니다.

    따라서 바이러스 백신 소프트웨어의 검사 목록에서 IIS 압축 디렉터리를 제외해야 합니다.

  9. 요청되는 URL에 실행 중인 DLL 파일에 전달된 매개 변수의 일부로 슬래시가 포함되어 있는지 확인합니다.

  10. ISAPI 필터가 요청 또는 응답 헤더를 수정하는지 확인합니다.

    ISAPI가 보내기 작업을 수행하고 있으며 엔터티 HTTP_COMPRESSION::DoDynamicCompression와 함께 HTTP 헤더의 전체 집합을 로 보내지 않습니다. DoDynamicCompression ISAPI에서 모든 데이터를 수신하지 않으므로 응답을 압축할 수 없습니다. 타사 및/또는 타사 ISAPIs는 HTTP 헤더를 위한 함수의 엔터티 본문 또는 엔터티 본문에 대한 함수에 헤더를 배치하거나 헤더를 제공하지 않음으로써 이 작업을 수행하는 것으로 확인되었습니다. 이 경우 ISAPI 필터 SF_NOTIFY_SEND_RESPONSE 또는 AddResponseHeaders 또는 동적 압축이 실패합니다. ISAPI는 헤더와 엔터티를 각각 올바른 위치에 배치해야 합니다.

  11. 응답 상태 코드가 200이 아닌지 확인합니다. IIS 6 또는 7에서는 HTTP 200 상태 응답만 압축됩니다.

    200이 아닌 상태 코드의 응답은 압축되지 않습니다. 동일한 작업을 수행하려면 를 HTTPModule 작성해야 합니다.

  12. 요청에 가 포함되어 있는지 확인합니다Via: headerVia headers. 은 요청이 프록시를 통해 IIS로 들어오고 있음을 나타냅니다.

    많은 프록시가 압축 헤더를 올바르게 처리하지 않으며, 압축된 데이터를 클라이언트에 제공하지 않을 때 제공합니다. 따라서 기본적으로 요청에 Via 헤더가 있는 경우 압축된 응답은 허용되지 않습니다. 메타베이스 키를 로 설정하여 이를 재정의 HcNoCompressionForProxies 할 수 있습니다 True.

  13. 요청이 정적 페이지에 대한 것인지 확인하고 응답에 문서 바닥글이 포함되어 있는지 확인합니다. 문서 바닥글로 인해 정적 압축이 실패합니다.

  14. 정적 압축이 작동하지 않는지 확인합니다. 이는 IIS의 루트 수준에 와일드카드 애플리케이션 매핑이 설치되어 있는 경우에 발생할 수 있습니다. 예를 들어 서버의 .html 또는 .txt 확장에 대한 애플리케이션 매핑이 있으므로 IIS는 .txt 요청을 정적이 아닌 동적 요청으로 간주하고 .txt 동적 압축 목록의 확장이 아니므로 압축되지 않습니다.

  15. IIS 압축 및 Accept-Encoding: identity 필드가 있는지 확인합니다.

    RFC2616 따라 필드가 요청에 있고 서버가 헤더에 따라 Accept-Encoding 허용되는 응답을 보낼 수 없는 경우 Accept-Encoding 서버는 406(허용되지 않음) 상태 코드로 오류 응답을 보내야 합니다. 요청에 필드가 없는 Accept-Encoding 경우 서버는 클라이언트가 콘텐츠 코딩을 수락한다고 가정할 수 있습니다. 이 경우 "ID"가 사용 가능한 콘텐츠 코드 중 하나인 경우 다른 콘텐츠 코드가 클라이언트에 의미가 있다는 추가 정보가 없는 한 서버는 "ID" 콘텐츠 코드를 사용해야 합니다.

  16. ETW 추적을 사용하여 IIS 압축 문제를 해결하는지 확인합니다.

    ETW(Windows용 이벤트 추적)는 HTTP 요청 문제를 해결할 수 있는 Windows OS의 기능입니다.

    IIS 압축 문제를 해결하는 단계는 다음과 같습니다.

    1. IISProviders.txt 라는 텍스트 파일을 만들고 팔로우 콘텐츠를 파일에 넣습니다." IIS: WWW Server"는 공급자 이름이며, 0xFFFFFFFE 모든 이벤트에 대한 추적을 의미하며, 5는 자세한 정보를 의미합니다.

    2. 명령 프롬프트를 열고 다음 명령을 실행합니다.

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. 문제를 재현하세요.

    4. 다음 명령을 실행하여 추적을 중지합니다.

       logman stop trace compressionTrace -ets
      
    5. 추적을 텍스트 파일로 변환합니다.

      추적 보고서는 이진 추적 데이터를 텍스트로 변환하고 명령을 실행한 tracerpt 디렉터리에 두 개의 파일을 생성합니다.

      tracerpt compressionTrace.etl
      
      • Summary.txt 사용된 공급자를 포함하여 추적 세션에 대한 일반적인 세부 정보를 포함합니다.

      • DumpFile.csv 텍스트 형식의 실제 추적 데이터를 포함합니다.

    6. 추적 파일을 읽어 유용한 정보를 찾습니다. dumpfile.csv열고 COMPRESSION_NOT_SUCCESS 같은 키워드(keyword) 찾습니다. 다음은 예입니다.

      IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
      

    이 오류 NO_MATCHING_SCHEME 이 확장 또는 Accept-Encoding과 일치하는 압축 체계가 없음을 의미합니다. 압축 오류의 자세한 목록은 압축 오류 목록을 참조하세요.

  17. IIS 압축 문제 해결을 위한 FREB 추적이 사용되는지 확인합니다.

    자세한 단계는 IIS 7에서 추적을 사용하여 실패한 요청 문제 해결을 참조하세요.

    다음은 IIS 7 FREB 추적을 사용하여 압축 문제를 해결하는 예제입니다.

    오류 메시지를 사용하여 압축 문제를 추적하는 스크린샷

압축 오류 목록

압축 오류에 대한 자세한 목록은 다음 표를 참조하세요.

참고

다음 이유는 IIS 6 및 IIS 7 모두에 적용됩니다.

이유 설명
NO_ACCEPT_ENCODING 클라이언트에서 보낸 Accept-Encoding 없습니다.
COMPRESSION_DISABLED 적절한 구성이 없으므로 압축을 사용할 수 없습니다.
NO_COMPRESSION_10 서버가 1.0 요청을 압축하도록 구성되지 않았습니다.
NO_COMPRESSION_PROXY 프록시 요청을 압축하도록 구성되지 않은 서버입니다.
NO_MATCHING_SCHEME 이 확장/Accept-Encoding과 일치하는 압축 체계가 없습니다.
UNKNOWN_ERROR 알 수 없는 오류
NO_COMPRESSION_RANGE 범위 요청을 압축하도록 구성되지 않은 서버
FILE_TOO_SMALL 압축 임계값보다 작은 파일입니다.
FILE_ENCRYPTED 파일이 암호화되었습니다.
COMPRESS_FILE_NOT_FOUND 압축된 복사본이 없습니다.
COMPRESS_FILE_STALE 압축된 복사본이 만료되었습니다.
NO_MATCHING_CONTENT_TYPE 이 확장에 대한 content-Type을 압축하도록 구성되지 않은 서버입니다.
HEADERS_SENT_TWICE 동일한 응답에 대해 두 번 전송되는 헤더입니다.
NO_HEADER_SENT 엔터티 본문을 보내기 전에 전송된 헤더가 없습니다.
NOT_SUCCESS_STATUS 응답 상태 코드가 성공하지 못했습니다(200).
ALREADY_CONTENT_ENCODING 응답에 콘텐츠 인코딩이 이미 있습니다.

참고

다음 이유는 IIS 7에만 적용됩니다.

이유 설명
FOOTER_ENABLED 정적 파일에 사용할 수 있는 문서 바닥글입니다.
NOT_FREQUENTLY_HIT 압축을 정당화할 만큼 URL이 자주 요청되지 않았습니다.
FAIL_TO_COMPRESS 압축된 복사본을 만들 수 없습니다.

추가 정보