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 도구의 출력을 보여 줍니다.
압축 문제 해결
압축 문제를 해결하려면 다음 단계를 수행합니다.
IIS 6 또는 IIS 7에서 압축을 사용하도록 설정합니다.
IIS 관리자에서 웹 사이트 노드를 마우스 오른쪽 단추로 클릭하고 속성을 선택한 다음 서비스를 선택합니다.
압축 폴더 및 사용 권한을 지정합니다.
IIS는 구성할 수 있는 폴더에 압축된 파일을 저장합니다. 기본적으로
%windir%\IIS Temporary Compressed Files
IIS 6 및%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
IIS 7용입니다.IIS 7의 IIS_WPG(IIS_IURS)에는 이 폴더에 대한 모든 권한이 있어야 합니다. 프로세스 모니터를 사용하여 이러한 유형의 권한 문제를 해결합니다.
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 압축이 모두 사용하도록 설정됩니다.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
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>
압축하려는 파일 형식이 해당 파일 확장자 섹션과
/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 파일(메타베이스 직접 편집)에 값을 복사하거나 붙여넣을 수 없으며 수동으로 입력해야 합니다.압축이 마스터 수준에서 설정되어 있지만 자식 수준의 설정으로 재정의되는지 확인합니다.
압축은 수준에서 사용하도록 설정
w3svc/filters/compression
됩니다. 그러나 웹 사이트 또는 애플리케이션 수준의 설정에 의해 재정의되는 것일 수 있습니다.예를 들어 수준에서 설정하고
w3svc/filters/compression
TRUE
기본 웹 사이트의 경우HcDoDynamicCompression
기본 웹 사이트에DoDynamicCompression
FALSE
대한 요청에 대한 응답에 대해 동적 압축이 발생하지 않습니다.바이러스 백신 프로그램이 압축된 파일이 저장된 디렉터리를 검사했는지 확인합니다.
IIS를 실행하는 서버에서 압축을 사용하도록 설정하고 IIS 압축 디렉터리에서 HTTP 요청을 제공하는 경우 예상 파일 대신 0 바이트 파일이 반환될 수 있습니다.
참고 항목
HTTP 정적 압축을 사용하는 경우에만 이러한 증상이 나타날 수 있습니다.
이는 IIS 서버에서 실행되는 바이러스 백신 소프트웨어가 IIS 압축 디렉터리를 검사하기 때문에 발생합니다.
따라서 바이러스 백신 소프트웨어의 검사 목록에서 IIS 압축 디렉터리를 제외해야 합니다.
요청되는 URL에 실행 중인 DLL 파일에 전달된 매개 변수의 일부로 슬래시가 포함되어 있는지 확인합니다.
ISAPI 필터가 요청 또는 응답 헤더를 수정하는지 확인합니다.
ISAPI가 보내기 작업을 수행하고 있으며 엔터티와 함께 전체 HTTP 헤더 집합을 전송하지
HTTP_COMPRESSION::DoDynamicCompression
않습니다.DoDynamicCompression
ISAPI에서 모든 데이터를 수신하지 않으므로 응답을 압축할 수 없습니다. 타사 및/또는 타사 ISAPIs는 HTTP 헤더를 위한 함수의 엔터티 본문 또는 엔터티 본문에 대한 함수에 헤더를 배치하거나 헤더를 제공하지 않음으로써 이 작업을 수행하는 것으로 나타났습니다. 이 경우 ISAPI 필터 SF_NOTIFY_SEND_RESPONSE 또는 AddResponseHeaders 또는 동적 압축이 실패합니다. ISAPI는 각각 헤더와 엔터티를 올바른 위치에 배치해야 합니다.응답 상태 코드가 200이 아닌지 확인합니다. IIS 6 또는 7에서는 HTTP 200 상태의 응답만 압축됩니다.
상태 코드가 200이 아닌 응답은 압축되지 않습니다. 동일한 작업을 수행하려면 작성
HTTPModule
해야 합니다.요청에 프록시를 통해 IIS로
Via: header
Via headers
들어오는 요청이 있는지 확인합니다.많은 프록시는 압축 헤더를 올바르게 처리하지 않으며 압축된 데이터를 클라이언트에 제공하지 않을 때 제공합니다. 따라서 기본적으로 요청에 Via 헤더가 있는 경우 압축된 응답이 허용되지 않습니다. 메타베이스 키를 .로 설정하여 재정의
HcNoCompressionForProxies
할 수 있습니다True
.요청이 정적 페이지에 대한 것인지 확인하고 응답에 문서 바닥글이 포함되어 있는지 확인합니다. 문서 바닥글로 인해 정적 압축이 실패합니다.
정적 압축이 작동하지 않는지 확인합니다. 이 문제는 IIS의 루트 수준에서 와일드카드 애플리케이션 매핑이 설치되어 있는 경우에 발생할 수 있습니다. 예를 들어 서버의 .html 또는 .txt 확장에 대한 애플리케이션 매핑이 있으므로 IIS는 .txt 요청을 정적이 아닌 동적 요청으로 간주하고 .txt 동적 압축 목록의 확장이 아니므로 압축되지 않습니다.
IIS 압축 및
Accept-Encoding: identity
필드가 있는지 확인합니다.RFC2616
Accept-Encoding
따라 필드가 요청에 있고 서버가 헤더에 따라Accept-Encoding
허용되는 응답을 보낼 수 없는 경우 서버는 406(허용되지 않음) 상태 코드를 사용하여 오류 응답을 보내야 합니다. 요청에 필드가 없Accept-Encoding
으면 서버는 클라이언트가 콘텐츠 코딩을 수락한다고 가정할 수 있습니다. 이 경우 "ID"가 사용 가능한 콘텐츠 코드 중 하나인 경우 다른 콘텐츠 코드가 클라이언트에 의미 있는 추가 정보가 없는 한 서버는 "ID" 콘텐츠 코드를 사용해야 합니다.ETW 추적을 사용하여 IIS 압축 문제를 해결하는지 확인합니다.
ETW(Windows용 이벤트 추적)는 HTTP 요청 문제를 해결할 수 있는 Windows OS의 기능입니다.
IIS 압축 문제를 해결하는 단계는 다음과 같습니다.
IISProviders.txt이라는 텍스트 파일을 만들고 다음 콘텐츠를 파일에 넣습니다. IIS: WWW Server"는 공급자 이름이며, 0xFFFFFFFE 모든 이벤트에 대한 추적을 의미하며, 5는 자세한 정보를 의미합니다.
명령 프롬프트를 열고 다음 명령을 실행합니다.
logman start trace compressionTrace -pf IISProviders.txt -ets
문제를 재현하세요.
다음 명령을 실행하여 추적을 중지합니다.
logman stop trace compressionTrace -ets
추적을 텍스트 파일로 변환합니다.
추적 보고서는 이진 추적 데이터를 텍스트로 변환하고 명령을 실행한
tracerpt
디렉터리에 두 개의 파일을 생성합니다.tracerpt compressionTrace.etl
Summary.txt 사용된 공급자를 포함하여 추적 세션에 대한 일반적인 세부 정보를 포함합니다.
DumpFile.csv 텍스트 형식의 실제 추적 데이터를 포함합니다.
추적 파일을 읽어 유용한 정보를 찾습니다. dumpfile.csv 열고 COMPRESSION_NOT_SUCCESS 같은 키워드를 찾습니다. 예를 들면 다음과 같습니다.
IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
이 오류 NO_MATCHING_SCHEME 이 확장 또는 Accept-Encoding과 일치하는 압축 체계가 없다는 것을 의미합니다. 압축 오류의 자세한 목록은 압축 오류 목록을 참조 하세요.
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 | 압축된 복사본을 만들 수 없습니다. |