자바 고성능 웹 개발(5)-GZIP 압축

6386 단어 자바
전 송 된 데 이 터 를 줄 이기 위해 압축 은 좋 은 선택 입 니 다.HTTP 프로 토 콜 은 GZIP 의 압축 형식 을 지원 합 니 다.서버 응답 헤더 에는 Content-Encoding:gzip 이 포함 되 어 있 습 니 다.이 응답 은 브 라 우 저 에 게 데 이 터 를 되 돌려 주 고 GZIP 형식 으로 압축 되 었 으 며 브 라 우 저 는 데 이 터 를 얻 은 후에 압축 을 풀 어야 한다 고 알려 줍 니 다.이 는 어느 정도 서버 가 전송 하 는 데 이 터 를 줄 이 고 시스템 성능 을 향상 시 킬 수 있다.그러면 어떻게 서버 응답 에 Content-Encoding:gzip 헤더 를 추가 하고 응답 데 이 터 를 압축 합 니까?Tomcat 서버 를 사용 하고 있다 면$tomcat 을 엽 니 다.홈$/conf/server.xml 파일 은 목록 8 과 같이 커 넥 터 를 설정 합 니 다.
명세서 8.TOMCAT 설정 명세서
<Connector  port ="80"  maxHttpHeaderSize ="8192" 
 maxThreads ="150"  minSpareThreads ="25"  maxSpareThreads ="75" 
 enableLookups ="false"  redirectPort ="8443"  acceptCount ="100" 
 connectionTimeout ="20000"  disableUploadTimeout ="true"  URIEncoding ="utf-8"   
 compression="on" 
 compressionMinSize="2048" 
 noCompressionUserAgents="gozilla, traviata" 
 compressableMimeType="text/html,text/xml" />

 우 리 는 커 넥 터 에 다음 과 같은 몇 가지 속성 을 추 가 했 습 니 다.그들의 의 미 는 다음 과 같 습 니 다.
 
compression="on"압축 기능 열기
 
compression MinSize="2048"압축 된 출력 내용 크기 를 사용 합 니 다.기본 값 은 2KB 입 니 다.
 
noCompressionUserAgent="gozilla,traviata"아래 브 라 우 저 에 압축 을 사용 하지 않 습 니 다.
 
compressableMimeType="text/html,text/xml,image/png"압축 형식
 
때때로,우 리 는 server.xml 를 설정 할 수 없습니다.예 를 들 어 우리 가 다른 사람의 공간 만 빌 렸 을 뿐 GZIP 을 사용 하지 않 았 다 면,우 리 는 프로그램 을 사용 하여 GZIP 기능 을 사용 해 야 합 니 다.압축 이 필요 한 파일 을 지정 한 폴 더 에 넣 고 필 터 를 사용 하여 이 폴 더 에 있 는 파일 에 대한 요청 을 걸 러 냅 니 다.
목록 9.사용자 정의 필터 압축 GZIP
//     gzipCategory       
 @WebFilter(urlPatterns = { "/gzipCategory/*" }) 
 public class GZIPFilter implements Filter { 

 @Override 
 public void doFilter(ServletRequest request, ServletResponse response, 
 FilterChain chain) throws IOException, ServletException { 
 String parameter = request.getParameter("gzip"); 
 //         Accept-Encoding     
 HttpServletRequest s = (HttpServletRequest)request; 
 String header = s.getHeader("Accept-Encoding"); 
 //"1".equals(parameter)       ,     gzip=1,     ,      
 if ("1".equals(parameter) && header != null && header.toLowerCase().contains("gzip")) { 
 HttpServletResponse resp = (HttpServletResponse) response; 
 final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

 HttpServletResponseWrapper hsrw = new HttpServletResponseWrapper( 
 resp) { 

 @Override 
 public PrintWriter getWriter() throws IOException { 
 return new PrintWriter(new OutputStreamWriter(buffer, 
 getCharacterEncoding())); 
 } 

 @Override 
 public ServletOutputStream getOutputStream() throws IOException { 
 return new ServletOutputStream() { 

 @Override 
 public void write(int b) throws IOException { 
 buffer.write(b); 
 } 
 }; 
 } 

 }; 

 chain.doFilter(request, hsrw); 
 byte[] gzipData = gzip(buffer.toByteArray()); 
 resp.addHeader("Content-Encoding", "gzip"); 
 resp.setContentLength(gzipData.length); 
 ServletOutputStream output = response.getOutputStream(); 
 output.write(gzipData); 
 output.flush(); 
 } else { 
 chain.doFilter(request, response); 
 } 
 } 
 //   GZIP       
 private byte[] gzip(byte[] data) { 
 ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(10240); 
 GZIPOutputStream output = null; 
 try { 
 output = new GZIPOutputStream(byteOutput); 
 output.write(data); 
 } catch (IOException e) { 
 } finally { 
 try { 
 output.close(); 
 } catch (IOException e) { 
 } 
 } 
 return byteOutput.toByteArray(); 
 } 
……
 }

 이 프로그램의 주 된 사상 은 응답 스 트림 을 쓰기 전에 응답 하 는 바이트 데 이 터 를 GZIP 압축 하 는 것 입 니 다.모든 브 라 우 저가 GZIP 압축 해 제 를 지원 하 는 것 이 아니 기 때문에 브 라 우 저가 GZIP 압축 해 제 를 지원 하면 요청 헤더 의 Accept-Encoding 에 gzip 를 포함 합 니 다.이것 은 서버 브 라 우 저 에 GZIP 압축 해 제 를 지원 하 는 것 을 알려 주 는 것 입 니 다.따라서 프로그램 으로 압축 을 제어 하면 안전 을 위해 서 는 브 라 우 저가 accept-encoding:gzip 헤 더 를 보 낼 지 여 부 를 판단 해 야 합 니 다.이 헤 더 를 포함 하고 있 으 면 압축 을 실행 합 니 다.압축 전후의 상황 을 검증 하기 위해 Firebug 모니터링 요청 과 응답 헤 더 를 사용 합 니 다.
목록 10.압축 전 요청
GET /testProject/gzipCategory/test.html HTTP/1.1 
 Accept: */* 
 Accept-Language: zh-cn 
 Accept-Encoding: gzip, deflate 
 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) 
 Host: localhost:9090 
 Connection: Keep-Alive

 목록 11.압축 되 지 않 은 응답
HTTP/1.1 200 OK 
 Server: Apache-Coyote/1.1 
 ETag: W/"5060-1242444154000"
 Last-Modified: Sat, 16 May 2009 03:22:34 GMT 
 Content-Type: text/html 
 Content-Length: 5060
 Date: Mon, 18 May 2009 12:29:49 GMT 

 목록 12.압축 된 응답
HTTP/1.1 200 OK 
 Server: Apache-Coyote/1.1 
 ETag: W/"5060-1242444154000"
 Last-Modified: Sat, 16 May 2009 03:22:34 GMT 
 Content-Encoding: gzip
 Content-Type: text/html 
 Content-Length: 837
 Date: Mon, 18 May 2009 12:27:33 GMT 

 압축 된 데 이 터 는 압축 전 데이터 보다 훨씬 작 아진 것 을 볼 수 있다.압축 된 응답 헤더 에는 Content-Encoding:gzip 이 포함 되 어 있 습 니 다.동시에 Content-Length 는 데 이 터 를 되 돌려 주 는 크기 를 포함 합 니 다.GZIP 압축 은 중요 한 기능 이다.앞에서 언급 한 것 은 단일 서버 에 대한 압축 최적화 이다.높 은 병발 상황 에서 여러 개의 Tomcat 서버 전에 역방향 프 록 시 기술 을 사용 하여 병발 도 를 높 여야 한다.현재 비교적 핫 한 역방향 프 록 시 는 Nginx(이것 은 후속 글 에서 상세 하 게 소개 할 것 이다)이다.Nginx 의 HTTP 설정 부분 에 다음 설정 을 추가 합 니 다.
목록 13.Nginx 의 GZIP 설정
gzip  on; 
 gzip_min_length  1000; 
 gzip_buffers     4 8k; 
 gzip_types       text/plain application/x-javascript text/css text/html application/xml; 

 Nginx 는 더 높 은 성능 을 가지 고 있 기 때문에 이 설정 을 이용 하면 성능 을 더욱 향상 시 킬 수 있 습 니 다.고성능 서버 에서 이 설정 은 매우 유용 할 것 이다.
오리지널 글 전재 출처 표시
자바 튜 토리 얼 네트워크 편집 발표:본 시리즈 의 글 이 당신 의 개인 성장 과 발전 에 도움 이 되 기 를 바 랍 니 다.
자바 초보 입문,개발 도구 부터 자바 진급,고급 프로 그래 밍,자바 튜 토리 얼 네트워크 는 자바 프로 그래 밍 의 모든 자 료 를 거의 포함 하고 있 습 니 다.

좋은 웹페이지 즐겨찾기