nginx 시리즈 gzip 모듈 의 용법 과 평가

11228 단어 Nginx
1. 머리말
gzip 는 * nix 시스템 에서 압축 명령 으로 파일 을. gz 접미사 파일 로 압축 하여 디스크 의 공간 을 줄 이 는 데 사 용 됩 니 다.이에 대응 하 는 것 은 명령 gunzip 입 니 다. 압축 을 풀기 위해 gzip 방법 으로 압축 한 파일 입 니 다.nginx 는 매일 그날 의 방문 로 그 를 압축 합 니 다. 보통 로그 파일 디 렉 터 리 에서 access. log - yyymmd. gz 파일 을 볼 수 있 습 니 다.
nginx 는 클 라 이언 트 에 출력 된 내용 을 압축 하여 전송 파일 의 부 피 를 줄 이 고 네트워크 대역 폭 의 점용 을 줄 이 는 gzip 모듈 이 있 습 니 다.웹 응용 프로그램 에 서 는 일반적으로 gzip 압축 을 사용 하여 응답 시간 을 단축 시 키 고 사용자 체험 을 향상 시 킵 니 다.물론 서버 쪽 에서 압축 을 하려 면 클 라 이언 트 가 압축 을 풀 어야 합 니 다. 이것 은 모두 cpu 시간 을 차지 할 것 입 니 다.그러나 전송 내용 이 줄 어 들 기 때문에 전송 과정 에서 각 네트워크 카드, 공유 기, 교환기 가 패 킷 에 대한 처리 시간 도 줄어든다.gzip 압축 은 여기 서 시간 을 얻 었 습 니 다.
2. 지령 설명
gzip 압축 기능 을 사용 하려 면 다음 과 같은 몇 가지 조건 을 만족 시 켜 야 합 니 다.
  • 클 라 이언 트 가 보 낸 HTTP 헤 더 는 'Accept - Encoding' 필드 를 포함 하고 그 값 은 'gzip' 이라는 압축 형식 을 포함 해 야 합 니 다.일반 브 라 우 저 에 서 는 'Accept - Encoding: gzip, deflate, sdch' 라 는 메 시 지 를 보 냅 니 다.
  • 서버 가 응답 하 는 설정 을 합 니 다. nginx 를 예 로 들 면 예제 설정 은 다음 과 같 습 니 다.
  • #  static   js、css、jpg、jpeg、png、gif       gzip    
    location ~ /static/(.+)\.(js|css|jpg|jpeg|png|gif) {
        gzip on; #   gzip  ,   off,   
        #  js、css、jpg、png、gif       gzip    
        gzip_types application/javascript text/css image/jpeg image/png image/gif;
        gzip_min_length 1024; #          ,         
        gzip_buffers 4 1k; #                 ,           
        gzip_comp_level 1; #     ,  1。    1-9,          ,   cpu  
    }

    서버 가 gzip 압축 을 사용 하면 응답 헤드 는 Content - Encoding: gzip 를 포함 합 니 다. 클 라 이언 트 는 이것 에 따라 서버 가 돌아 온 내용 이 gzip 로 압축 된 내용 인지 판단 합 니 다.
    3. 각 파일 의 압축 비율 테스트
    파일 일괄 테스트 를 편리 하 게 하기 위해 phop 애플 릿 을 썼 습 니 다.
    이 프로그램 이 처리 한 서버 가 되 돌아 오 는 전송 형식 은 블록 전송, 즉 'Transfer - Encoding: chunked' HTTP 응답 헤드 를 가 진 것 입 니 다.
    function testGzip($host, $uri) {
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        socket_connect($socket, '127.0.0.1', 80);
    
        $request = "GET $uri HTTP/1.1\r
    "
    ; $request .= "Host: $host\r
    "
    ; $request .= "Accept-Encoding: gzip\r
    "
    ; $request .= "Connection: Keep-Alive\r
    \r
    "
    ; socket_write($socket, $request, strlen($request)); $headers = []; while (($line = socket_read($socket, 1024, PHP_NORMAL_READ))) { socket_read($socket, 1, PHP_BINARY_READ); if ($line == "\r") { break; } $headers[] = rtrim($line, "\r"); } $totalSize = 0; $chunkSizeList = []; $data = ""; while (true) { $lenx = rtrim(socket_read($socket, 1024, PHP_NORMAL_READ), "\r"); socket_read($socket, 1, PHP_BINARY_READ); $len = hexdec($lenx); if ($len == 0) { socket_read($socket, 2, PHP_BINARY_READ); break; } else { //echo 'len=', $len, PHP_EOL; } $chunkSizeList[] = $len; $totalSize += $len; $data .= socket_read($socket, $len, PHP_BINARY_READ); socket_read($socket, 2, PHP_BINARY_READ); //usleep(10000); } socket_close($socket); $decodedData = gzdecode($data); #echo $decodedData; return [$headers, $chunkSizeList, $totalSize, strlen($decodedData)]; } function batchGzipTest($host, $basePath, $files) { $stats = []; foreach ($files as $jsFile) { $stats[$jsFile] = testGzip($host, $basePath . $jsFile); } echo "| | | | |", PHP_EOL; echo "|------|:-----|:-----|:-----|", PHP_EOL; foreach($stats as $jsFile => $v) { echo "|", $jsFile, "|", $v[3], "|", $v[2], "|", sprintf("%.2f", ($v[3]-$v[2])/$v[3]*100), "%", "|", PHP_EOL; } }

    사용 예시:
    $host = 'invo.com';
    
    $jsPath = '/static/js/';
    
    $jsFiles = [
        'arttemplate.js', 
        'bootstrap.min.js', 
        'fastclick.min.js', 
        'jquery220.min.js', 
        'moment.min.js',
        'vue.js',
    ];
    
    batchGzipTest($host, $jsPath, $jsFiles);

    3.1 js 파일 압축 비율 테스트
    자주 사용 하 는 js 파일 6 개 를 테스트 한 결과 다음 과 같 습 니 다.
    파일 이름
    초기 크기
    압축 후 크기
    압축 비율
    arttemplate.js
    4449
    2257
    49.27%
    bootstrap.min.js
    36868
    11804
    67.98%
    fastclick.min.js
    8776
    3124
    64.40%
    jquery220.min.js
    85589
    34942
    59.17%
    moment.min.js
    40737
    15838
    61.12%
    vue.js
    222777
    75157
    66.26%
    최소 49.27%, 최대 67.98%, 그런대로 괜 찮 은 편!!
    3.2 css 파일 압축 비율 테스트
    css 파일 5 개 테스트:
    파일 이름
    초기 크기
    압축 후 크기
    압축 비율
    bootstrap.min.css
    121260
    25198
    79.22%
    citheme.css
    2486
    1186
    52.29%
    datepicker3.css
    33745
    3867
    88.54%
    mui.min.css
    77557
    16183
    79.13%
    slider.css
    8486
    1745
    79.44%
    최소 52.29%, 최대 88.64%, 상당히 가능 합 니 다!!
    3.3 이미지 파일 압축 비율 테스트
    png 파일 3 개, jpg 파일 2 개.
    파일 이름
    초기 크기
    압축 후 크기
    압축 비율
    1.png
    16953
    16882
    0.42%
    2.png
    117010
    116875
    0.12%
    3.png
    66492
    62771
    5.60%
    4.jpg
    775702
    771901
    0.49%
    5.jpg
    620888
    618391
    0.40%
    별 효과 가 없어, 실 망 스 러 워!!png, jpeg 등 형식의 그림 이 압축 되 었 기 때 문 일 것 입 니 다.
    3.4 html 파일 압축 비율 테스트
    html 파일 5 개 를 무 작위 로 테스트 합 니 다.
    파일 이름
    초기 크기
    압축 후 크기
    압축 비율
    genindex.html
    116025
    17769
    84.69%
    index.html
    53112
    8726
    83.57%
    search.html
    33589
    6495
    80.66%
    license.html
    35035
    7285
    79.21%
    DCO.html
    35168
    7258
    79.36%
    css 파일 보다 효과 가 더 좋 습 니 다!!
    요약: gzip 압축 은 텍스트 파일 의 압축 효과 가 매우 좋 고 (40 ~ 80%) 이미지 파일 에 대한 효과 가 매우 적다.실제 응용 에 서 는 js, html, css 형식의 파일 에 대해 gzip 압축 을 여 는 것 을 고려 할 수 있 습 니 다.제 이 슨 도 괜 찮 을 것 같 아 요. 독자 들 이 관심 이 있 으 면 직접 테스트 해 보 세 요.
    후기
    이 글 을 거의 다 썼 을 때 마크 다운 에 문제 가 생 겼 다. 다시 불 러 오 겠 다 고 했 더 니 내용 이 모두 사 라 졌 다.얼마나 아 픈 깨 달 음 인가!어 쩔 수 없 이 깨 진 기억 을 정리 하고 다시 썼 다.

    좋은 웹페이지 즐겨찾기