Nginx 절편 모듈, 정지점 전송
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;
}
}
}
다음 과 같은 두 가지 상황 을 중점적으로 설명 한다.
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 크기 에 따라 여러 개의 키 로 나 누 어 요청 합 니 다. 이러한 키 요청 은 자신의 자원 을 바로 방출 하지 않 고 파일 설명자 가 소 진 될 수 있 습 니 다.
작은 매듭
정리 하고 주의해 야 할 점:
참고 로 Roman Arutyunyan 도 큰 소 입 니 다. 스 트 리밍 분야 의 친구 들 은 모두 들 어 본 적 이 있 을 것 입 니 다. nginx - rtmp 모듈 의 작성 자.
참고 자료
http://hg.nginx.org/nginx/rev/bc9ea464e354
http://hg.nginx.org/nginx/rev/4f0f4f02c98f
본문 은 다음 과 같다.http://www.pureage.info/2015/12/10/nginx-slice-module.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.