소프트웨어/OS

IIS6 제공 압축기능과 웹 서비스 압축

falconer 2009. 7. 15. 09:08

IIS6 HTTP Compression & Using for WebService call

재 진행중인 L사 ERP 프로젝트에서는 network 대역폭이 협소한 사용자 네트웍이 존재한다. 따라서 웹 서비스 호출에 의해 리턴되는 결과 XML 포함한 네트웍 전송 사이즈를 줄이기 위해 압축을 사용하고 있다.
우리가 아는 바와 같이 압축은 네트웍 전송 사이즈는 줄여주지만 서버의 CPU 사용율과 사용시간 측면에서는 이롭지 않다.
그러나 웹 서버 머신이 여러 CPU를 가지고 있으며, 평소 그 CPU 사용율이 높지 않다면 이 압축을 고려하여, 네트웍 전송사이즈를 줄여주는 것이 사용자 응답시간을 줄이기 위해 고려할 만한 방법이라 할 수 있을 것이다.

IIS6에서 제공하는 HTTP 압축을 활성화 하고 이 압축기능을 개발 모듈 내의 웹 서비스 호출에서 사용하는 법을 알아보자.

IIS6 에서 기본으로 제공하는 압축 기능을 사용하도록 하고, 또한 웹 서비스 호출하는 클라이언트 측에서 서버의 압축을 이용하도록 HTTP 헤더 정보를 추가하도록 하여 클라이언트/(웹) 서버 간의 압축을 구현해 보도록 한다.

IIS6에서 압축 설정하기

IIS 관리자(inetmgr)을 실행하고 컴퓨터 노드 하위의 Web Sites 노드를 선택 후 속성을 연다.

그림 처럼 application files 압축과 static file 압축을 모두 활성화 한다.
Temporary Directory는 Static File을 압축하는 경우 사용하게 될 캐시공간이라 보면 된다.
즉 압축이 된 파일들이 이후의 요청에 대한 결과로 사용되게끔 저장하는 것으로서 이러한 정적인 파일 요청 시 마다 다시 압축되는 불필요한 작업이 일어나지 않게 한다.(물론 파일이 변경되지 않았다는 가정이다.)

실제 가보면 요청이 1번 이상 일어난 후 압축된 캐시 파일이 존재함을 알 수 있다.

Static File은 정적인 파일 즉, HTML, *.JS, *.CSS 등과 같은 형태의 파일을 의미하고 Application File은 동적인 파일 즉, *.aspx, *.asmx, *.asp 등과 같이 HTTP 응답 결과가 요청시 마다 동적으로 생성되는 형태의 파일을 의미한다.

동적인 파일은 요청 시 마다 압축을 새로이 한다. 이들을 캐시에 저장해서 이후 요청의 응답으로 활용할 수 없다는 것은 당연하다....결과가 동적이니까...

요렇게만 하면 기본적으로 압축이 이루어 진다. 단 기본적으로 아래에 정의된 파일 확장자에 대한 요청만이 압축이 된다.

  • Static : .txt, .htm, and .html
  • Dynamic : .exe, .dll, and .asp

압축을 적용할 HTTP 요청 파일 확장자 추가하기

그럼 우리가 원하는 웹 서비스 파일 (*.asmx)이나 다른 파일에 대한 요청도 압축하고 싶다면? 요고는 IIS 관리툴로는 안된다.

방법은 두가지이다.

1. 직접 MetaBase.xml 파을 수정한다. (C:\Windows\System32\Inetsrv\MetaBase.xml)

2. IIS의 관리명령 스크립트를 사용한다.

1번 방법은 권장하지 않는다. 메타베이스 파일은 IIS가 그 구성 정보를 모두 포함하고 있는 구성파일이다. 잘 못 만지면 절단난다.

그리고 수정하려면 IIS 서비스를 중지해야만 편집이 가능하다.

2번 방법을 설명한다.

아래의 폴더에 스크립트가 존재한다. 이동하면 되겠다.

CD C:\Inetpub\AdminScripts\

GZIP/Deflate 이렇게 두가지 형식의 압축 메카니즘을 제공한다. 일반적으로 사용하게 되는 Gzip 방식을 사용하겠다.

압축할 HTTP 요청 파일 형식 지정하기(Static Files의 경우)

cscript.exe adsutil.vbs set W3Svc/Filters/Compression/GZIP/HcFileExtensions "htm" "html" "txt" "ppt" "xls" "xml" "pdf" "xslt" "doc" "xsl" "htc" "js" "css"

Deflate 방식의 압축에 대해서는 아래와 같이 하면 된다.

cscript.exe adsutil.vbs set W3Svc/Filters/Compression/DEFLATE/HcFileExtensions "htm" "html" "txt" "ppt" "xls" "xml" "pdf" "xslt" "doc" "xsl" "htc" "js" "css"

압축할 HTTP 요청 파일 형식 지정하기(Application Files의 경우)

cscript.exe adsutil.vbs set W3Svc/Filters/Compression/GZIP/HcScriptFileExtensions "asp" "dll" "exe" "aspx" "asmx" "ashx"

Deflate 방식의 압축에 대해서는 아래와 같이 하면 된다.

cscript.exe adsutil.vbs set W3Svc/Filters/Compression/DEFLATE/HcScriptFileExtensions "asp" "dll" "exe" "aspx" "asmx"

이렇게 해서 우리가 원하는 여러 파일 형식을 IIS 압축 범주에 포함시켰다.

 

추가로

IIS 관리 툴을 쓰지 않고 명령만으로 위의 IIS 압축 활성화 하기

■ 해당 웹 사이트에 대해 전사적인(Global)한 압축 설정 또는 해제

cscript adsutil.vbs set w3svc/filters/compression/parameters/HcDoDynamicCompression true(or false)

cscript adsutil.vbs set w3svc/filters/compression/parameters/HcDoStaticCompression true(or false)

■ 특정 웹 어플리케이션(가상디렉토리) 만 압축 설정 또는 해제

Default Web site 내의 /Home/StyleSheets/ 에서만 Static Files에 대해 압축 설정

일단 전사적인 압축을 해제하고,
cscript adsutil.vbs set w3svc/filters/compression/parameters/HcDoStaticCompression false

해당 경로에 대해서만 압축 설정
cscript adsutil.vbs set w3svc/1/root/Home/StyleSheets/DoStaticCompression true

Default Web site 내의 /Home/StyleSheets/ 에서만 Application Files(Dynamic Files)에 대해 압축 설정

일단 전사적인 압축을 해제하고,
cscript adsutil.vbs set w3svc/filters/compression/parameters/HcDoDynamicCompression false
해당 경로에 대해서만 압축 설정
cscript adsutil.vbs set w3svc/1/root/Home/StyleSheets/DoDynamicCompression true

참고로, w3svc/1/root/.. 이건 IIS가 내부적으로 식별하는 웹 경로 정보이다. 이건 Metabase 정보에 정의되어 있으며, IIS 리소스 킷을 설치한 후 Metabase Explorer를 사용해서 확인 가능하다.

 

요기까지 하고 나서 웹 브라우저 띄워서 압축 설정이 된 웹 경로로 요청을 하면 압축이 된다...된다..웹 브라우저는 자동으로 압축을 지원하는 IIS에 요청할 때, 전송이 압축이 되도록 자동으로 Accept-Encoding: gzip, deflate HTTP 헤더를 붙여 준다. 물론 웹 브라우저 버전에 따라 다르긴 하지만 최근에 나온 웹 브라우저는 다 지원한다.

압축이 되는지 확인하려면, HTTP 패킷을 모니터링해 주는 툴을 사용하면 된다. HTTP Analyzer 와 같은 툴을 사용한다.
이러한 툴을 이용해서 실제 전송되는 파일 사이즈와 실제 서버 상의 파일사이즈를 비교해 보면 압축 여부를 확인할 수 있다.

위의 요청했던 파일을 변경하거나 압축된 캐시 파일을 지우고 다시 요청하게 되면? 어떻게 될까?
아래에서 확인할 수 있듯이 처음 한번의 요청은 (캐시 될 압축파일이 생성되는 요청) 압축이 일어나지 않고 쌩(raw) 으로 전송됨을 알 수 있다.
(위의 응답사이즈와 아래의 응답 사이즈를 비교해 보시라..차이가 많이 난다. )
이후 요청은 압축된 전송이 이루어 진다.

IIS의 압축 구성 내용의 마지막으로 압축 관련 설정을 변경한 후 반드시 IIS 재시작 해야 반영이 된다.까먹지 말자.

iisreset /restart

MSDN 원문 : http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/d52ff289-94d3-4085-bc4e-24eb4f312e0e.mspx?mfr=true

 

웹 서비스 호출에 압축 적용

여기까지는 조아... 그런데 우리가 프로그래밍 적으로 호출하는 SOAP 요청에 대한 응답 즉 웹 서비스 응답을 압축하고 싶은데....


웹 서비스 Proxy 코드가 Accept-Encoding: gzip, deflate HTTP 헤더를 자동으로 붙여주까?.. 확인해 보면, .NET 프레임웍 버전에 따라 다르다.

웹 서비스 참조 객체가 상속받는 System.Web.Services.Protocols.SoapHttpClientProtocol 클래스가 또 상속받는 System.Web.Services.Protocols.HttpWebClientProtocol 객체의 EnableDecompression 속성을 통해 헤더를 붙일 수 있다. 이 값을 true로 하면 Accept-Encoding: gzip, deflate HTTP 헤더가 붙는다.

.NET Framework 3.0은 기본값이 false이고 2.0은 true이다. 따라서 3.0일 경우 아래 처럼 (확인 한 바에 의하면 .NET 2.0을 이용해 Visual Studio 2005에서 웹 참조 객체 생성한 경우에도 아래 처럼 명시적으로 해야함.)

using(TestJobRef.User o = new TestJobRef.User())
{
o.EnableDecompression = true;
(웹 메서드 호출..…….)
}

도대체 어떻게 코딩하라는 거야?...라고 불평하는 사람 설마 없겠지… 없을끄야…-_-!

위 처럼 간단하게 할 수 도 있지만, 특수한 경우에는 자동으로 생성된 웹 서비스 프록시 클래스를 다시 상속받아서 프록시 클래스를 재정의해야 하는 경우도 있을 터인데, 그런 경우도 마찬가지로 재정의하는 프록시 클래스의 생성자 내에서 base.EnableDecompression = true; 라고 해주면 될 것이다.

실제 현업에 적용하려면 성능 평가를 충분히 거쳐야 할 것이다. 그리고 압축이 모든 환경에 적합한 것은 아니다. CPU 사용율이 일정하게 높은 가난한 곳에서 이 압축은 독이 될 수도 있다고 본다.
누가 압축에 따른 cpu 시간이나 사용율 등의 성능비교와 네트웍 전송 사이즈와 전송 시간 등을 보기좋게 수치나 %로 표현해 주면 참!!!! 조케따.

끝.


출처 : http://www.ensimple.net/enSimple/show.aspx?cnum=285&b_id=study_csharp&page=1