Nginx 절편 모듈, 정지점 전송

6624 단어
CDN 업계 의 주류 기술 을 잘 아 는 친구 들 은 잘 알 고 있 을 것 입 니 다. Nginx 는 최근 몇 년 동안 발전 해 왔 지만 직접 사용 하 는 proxy 는 거의 없습니다.cache 모듈 에서 캐 시 를 하 는 이 유 는 여러 가지 가 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
  • 멀 티 플 렉 스 지원 안 함
  • 누 드 장치 지원 하지 않 음
  • 큰 파일 은 슬라이스 하지 않 습 니 다
  • 큰 파일 의 Range 요청 이 미흡 했다
  • Nginx 자체 가 합병 을 지원 하지 않 습 니 다
  • 현재 주류 인 CDN 기술 창고 에서 Nginx 는 주로 하나의 접착제 역할 을 한다. 예 를 들 어 스케줄 러, 부하 이퀄 라이저, 업무 논리 (도 난 방지 체인 등) 는 Squid, ATS 등 주류 Cache Server 와 결합 하여 사용 해 야 한다.
    Nginx - 1.9.8 에 새로 추 가 된 모듈 ngxhttp_slice_모듈 이 일부 문 제 를 해결 했다.
    우선, 몇 가지 버 전의 Nginx proxy 를 살 펴 보 겠 습 니 다.cache 의 Range 처리 상황.
    Nginx-0.8.15
    Nginx - 0.8.15 에서 다음 설정 파일 을 사용 하여 테스트 합 니 다.
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=cache:100m;
        server {    
            listen       8087;
            server_name  localhost;
            location / {
                proxy_cache cache;
                proxy_cache_valid 200 206 1h;
               # proxy_set_header Range $http_range;
                proxy_pass http://127.0.0.1:8080;
    
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        }
    }

    다음 과 같은 두 가지 상황 을 중점적으로 설명 한다.
  • 첫 번 째 Range 요청 (로 컬 캐 시 없 음) 은 Nginx 가 백 엔 드 로 가서 전체 파일 을 끌 어 내 린 다음 (백 엔 드 응답 코드 200) 클 라 이언 트 에 게 되 돌아 오 는 것 은 전체 파일 입 니 다. 응답 상태 코드 는 200 이지 206 이 아 닙 니 다. 후속 Range 요청 은 모두 캐 시 에서 온 로 컬 파일 로 서 비 스 를 제공 하고 응답 상태 코드 는 206 입 니 다.
  • 위의 프로필 에 proxy 를 추가 하면set_header Range $http_range;테스트 를 진행 합 니 다.첫 번 째 Range 요청 (로 컬 캐 시 없 음) 입 니 다. Nginx 는 백 엔 드 에 Range 요청 파일 을 사용 합 니 다. 전체 파일 을 끌 어 내리 지 않 고 클 라 이언 트 에 응답 하 는 것 도 206 입 니 다. 그러나 문 제 는 Range 요청 을 cache key 에 추가 하지 않 았 기 때문에 후속 모든 요청 이 발생 할 수 있 습 니 다. Range 가 어떻든 url 이 변 하지 않 으 면모두 cache 의 내용 으로 클 라 이언 트 에 게 돌아 갑 니 다. 이것 은 분명 요구 에 부합 되 지 않 을 것 입 니 다.

  • Nginx-1.9.7
    Nginx - 1.9.7 에 서 는 위 두 가지 상황 을 똑 같이 테스트 하 는데 두 번 째 상황 의 결 과 는 사실 별로 의미 가 없고 Nginx - 0.8.15 와 같 을 것 이 분명 하기 때문에 첫 번 째 테스트 상황 에 만 관심 을 가진다.
    첫 번 째 Range 요청 (로 컬 캐 시 없 음) 은 Nginx 가 백 엔 드 로 가서 전체 파일 을 끌 어 내 립 니 다 (백 엔 드 응답 코드 는 200). 그러나 클 라 이언 트 에 게 돌아 오 는 것 은 정확 한 Range 응답, 즉 206. 후속 Range 요청 은 모두 캐 시 된 로 컬 파일 로 서 비 스 를 제공 하고 정상 적 인 206 응답 입 니 다.
    이 를 통 해 알 수 있 듯 이 이전 버 전에 비해 개선 되 었 으 나 가장 실질 적 인 문 제 는 해결 되 지 않 았 다.
    우 리 는 Nginx 공식 이 Cache 가 Range 에서 요청 할 때의 행위 에 대한 설명 을 볼 수 있다.
    How Does NGINX Handle Byte Range Requests?
    If the file is up-to-date in the cache, then NGINX honors a byte range request and serves only the specified bytes of the item to the client. If the file is not cached, or if it’s stale, NGINX downloads the entire file from the origin server. If the request is for a single byte range, NGINX sends that range to the client as soon as it is encountered in the download stream. If the request specifies multiple byte ranges within the same file, NGINX delivers the entire file to the client when the download completes.
    Once the download completes, NGINX moves the entire resource into the cache so that all future byte-range requests, whether for a single range or multiple ranges, are satisfied immediately from the cache.
    Nginx-1.9.8
    우 리 는 Nginx - 1.9.8 을 계속 보 았 습 니 다. 물론 컴 파일 할 때 인 자 를 추가 해 야 합 니 다 -- with - httpslice_module, 다음 설정 과 유사 합 니 다:
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    
        proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=cache:100m;
        server {
            listen       8087;
            server_name  localhost;
            location / {
                slice 1m;
                proxy_cache cache;
                proxy_cache_key $uri$is_args$args$slice_range;
                proxy_set_header Range $slice_range;
                proxy_cache_valid 200 206 1h;
                #proxy_set_header Range $http_range;
                proxy_pass http://127.0.0.1:8080;
    
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        }
    }

    뜻밖에 한쪽 이 깜짝 놀 란 것 은 마치 킬러 급 의 특성 과 같다.
    우선 Range 요청 이 없 으 면 백 엔 드 큰 파일 이 로 컬 cache 에 있 을 때 설 정 된 slice 크기 에 따라 절편 으로 저 장 됩 니 다.
    그 다음 에 Range 요청 이 있 으 면 Nginx 는 적당 한 Range 크기 (slice 경계) 로 백 엔 드 요청 을 합 니 다. 이 크기 는 클 라 이언 트 가 요청 한 Range 와 다 를 수 있 으 며 slice 크기 의 절편 을 로 컬 에 저장 하고 정확 한 206 으로 클 라 이언 트 에 응답 합 니 다.
    위 에서 말 한 것 을 주의 하 십시오. Nginx 에서 백 엔 드 까지 의 Range 는 클 라 이언 트 가 요청 한 Range 와 같 지 않 습 니 다. 요청 한 Range 가 어떻든 Nginx 에서 백 엔 드 까지 항상 slice 크기 를 경계 로 하고 클 라 이언 트 요청 을 여러 개의 키 로 나 누 어 백 엔 드 에 요청 합 니 다. 설정 한 slice 가 크기 가 1M, 즉 1024 바이트 라 고 가정 합 니 다.그러면 클 라 이언 트 가 Range 를 0 - 1023 범위 이내 의 모든 숫자 로 요청 하면 첫 번 째 절편 에 떨 어 집 니 다. 요청 한 Range 가 몇 개의 slice 크기 를 가로 지 르 면 nginx 는 백 엔 드 에 여러 개의 키 요청 을 해서 이 slice 캐 시 를 저장 합 니 다.클 라 이언 트 에 대해 클 라 이언 트 가 요청 한 Range 를 기준 으로 합 니 다.요청 중 일부 파일 이 캐 시 되 지 않 으 면 Nginx 는 백 엔 드 에 부족 한 절편 만 요청 합 니 다.
    이 모듈 은 하위 요청 을 바탕 으로 이러한 잠재 적 인 문제 가 있 을 수 있 습 니 다. 파일 이 크 거나 slice 가 작 을 때 slice 크기 에 따라 여러 개의 키 로 나 누 어 요청 합 니 다. 이러한 키 요청 은 자신의 자원 을 바로 방출 하지 않 고 파일 설명자 가 소 진 될 수 있 습 니 다.
    작은 매듭
    정리 하고 주의해 야 할 점:
  • 이 모듈 은 proxy 에 사 용 됩 니 다.cache 큰 파일 의 장면, 큰 파일 절편 캐 시
  • 컴 파일 시 configure 에 -- with - httpslice_module 매개 변수
  • $slice_range 는 반드시 proxy 에 추가 해 야 합 니 다.cache_key 중, proxy 사용set_header 는 이 를 Range 헤드 로 백 엔 드 에 전달 합 니 다
  • 파일 크기 에 따라 slice 크기 를 합 리 적 으로 설정 해 야 합 니 다
  • 구체 적 인 특성 에 대한 설명 은 Roman Arutyunyan 이 이 패 치 를 제출 할 때의 메 일 왕래 를 참고 할 수 있 습 니 다.https://forum.nginx.org/read.php?29,261929,261929#msg-261929
    참고 로 Roman Arutyunyan 도 큰 소 입 니 다. 스 트 리밍 분야 의 친구 들 은 모두 들 어 본 적 이 있 을 것 입 니 다. nginx - rtmp 모듈 의 작성 자.
    참고 자료
  • http://www.tianwaihome.com/2015/03/nginx-proxy-cache.html
  • Nginx 공식 Cache 안내
  •        https://www.nginx.com/blog/nginx-caching-guide/
  • Nginx 버 전 별 changelog
  •        http://nginx.org/en/CHANGES
  • Nginx proxy 모듈 위 키
  •       http://nginx.org/en/docs/http/ngx_http_proxy_module.html
  • http_slice_module 의 역대 제출 기록
  •       http://hg.nginx.org/nginx/rev/29f35e60840b
          http://hg.nginx.org/nginx/rev/bc9ea464e354
          http://hg.nginx.org/nginx/rev/4f0f4f02c98f
  • http_slice_module 제출 전 메 일 왕래
  •       https://forum.nginx.org/read.php?29,261929
  • Nginx 이전 버 전의 Range cache 에 관 한 메 일 왕래
  •       https://forum.nginx.org/read.php?2,8958,8958
  • 절편 모듈 의 위 키
  •      http://nginx.org/en/docs/http/ngx_http_slice_module.html
     
    본문 은 다음 과 같다.http://www.pureage.info/2015/12/10/nginx-slice-module.html

    좋은 웹페이지 즐겨찾기