nginx 시리즈 (21) nginx 의 ETag 와 Last - Modified

4218 단어
nginx 의 proxycache 는 캐 시 첫 번 째 Cache - Control 과 Expires 를 통 해 프 록 시 캐 시 를 할 수 있 지만 인자 proxy 가 있 습 니 다.cache_revalidate on; 메시지 의 전송 을 효과적으로 줄 일 수 있다.이것 을 말 하기 전에 먼저 원 리 를 보 세 요.HTTP 프로 토 콜 에서 If - Modified - Since 와 If - None - Match 는 각각 Last - Modified 와 ETag 에 대응 합 니 다.Expires 를 캐 시 로 하 는 방식 으로 메시지 전송 을 줄 이 는 장면 을 실현 합 니 다.RFC 2616 의 HTTP 프로 토 콜 에 따 르 면 클 라 이언 트 가 두 번 째 로 서버 에 요청 할 때 첫 번 째 방문 요청 한 자원 에 대해 응답 상태 가 200 인 자원 이 라면 이번 요청 에 새로운 요청 헤드 를 추가 합 니 다. If - Modified - Since 라 는 이름 은 서버 에 이 시간 부터 물 어보 거나 이 시간 을 분할 점 으로 하 는 것 입 니 다.이 시간 전에 이 문 서 를 수정 한 적 이 있 습 니까? 수정 되 지 않 았 다 면 http 상태 코드 는 304 입 니 다. 또한 응답 헤드 Last - Modified 를 다시 보 내 고 이 두 머리의 시간 은 똑 같 습 니 다.
Etag 를 계산 할 때 CPU 소모 가 발생 하기 때문에 시간 스탬프 를 사용 할 수도 있 지만, 이렇게 해서 Last - Modified 를 직접 사용 하면 된다.
Expires 와 Etag 를 동시에 사용 할 때 우선 순위 가 없고 이들 을 만족 시 킬 때 결정 할 수 있 습 니 다.
http 의 Response 첫 부분 에 transfer - coding 도 메 인 값 이 chunked 입 니 다.304 의 원 리 를 사용 할 수 없다.tomcat 에서 사용 하지 않 는 방법 은 되 돌아 오 는 캐 시 를 설정 하 는 것 입 니 다. 이 캐 시 보다 데이터 가 적 으 면 열 리 지 않 습 니 다.
response.setBufferSize(1024 * 1024);
앱 과 요청 한 네 이 티 브 프로 세 스.그림 을 보면 모든 것 을 안다.
[img]http://dl2.iteye.com/upload/attachment/0113/0688/de0ea2ab-ccde-3c08-a499-5aa3862b01c9.png[/img]
proxy 사용 하기cache 모듈 의 nginx 프로 세 스.프 록 시 를 열 고 캐 시 인증 을 다시 합 니 다.
[color = red] proxy 의 cache 구현, 고양이 머리 형의 다른 글 참조
http://phl.iteye.com/blog/2247856[/color]
proxy_cache_revalidate on
프 록 시 캐 시가 만 료 되 지 않 았 다 면 프 록 시 캐 시 는 304 상태 코드 를 되 돌려 주 고 body 가 없습니다.
프 록 시 캐 시가 만 료 되면 백 엔 드 에 서버 인증 을 적용 하고 백 엔 드 서버 가 304 로 돌아 가면 프 록 시 캐 시가 계속 사 용 됩 니 다.
이 프로 세 스에 서 는 이전 네 이 티 브 프로 세 스 의 브 라 우 저의 원리 와 같 습 니 다.
그리고 proxycache 에서 proxy 를 사용 하면cache_min_uses 마지막 캐 시 를 출발 할 때 nginx 서버 는 304 를 응용 서버 에 전달 하지 않 고 최신 데 이 터 를 직접 가 져 와 캐 시 를 하고 응용 서버 는 200 상태 코드 를 되 돌려 줍 니 다.
[img]http://dl2.iteye.com/upload/attachment/0113/0686/09e6baee-8054-3071-acd8-af2172301b56.png[/img]

response.addHeader("Cache-Control", "max-age=5,s-maxage=15");//, no-store, max-age=0,s-maxage=0
// Expires , Expires
response.setDateHeader("Expires", System.currentTimeMillis() + 1000 * 10);

//"If-Modified-Since" , "If-None-Match"
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH");
String e1 = sdf.format(new Date());
response.setHeader("ETag", e1);
//2015-11-13 12:28:00
long d1 = 1447388904765L / 1000 * 1000 + 3600 * 1000; // ,
response.setDateHeader("Last-Modified", d1);

long d = request.getDateHeader("If-Modified-Since"); //
String e = request.getHeader("If-None-Match");

System.out.println(d);
System.out.println(e);

response.setContentType("text/html");
if (e1.equals(e) && d1 == d) {
response.setStatus(304);
} else {
response.getWriter().write("hello world:" + new Timestamp(System.currentTimeMillis()).toString());
}

nginx 의 전체 프로필

location /cache_ehcache-2.10.0_web {
proxy_pass http://192.168.56.1:8080/cache_ehcache-2.10.0_web;

proxy_cache_revalidate on;

proxy_cache content; # keys_zone
proxy_cache_valid 200 304 301 302 1h; #
proxy_cache_methods GET; # get head
proxy_cache_valid any 3s; #
proxy_cache_key $host:$server_port$uri$is_args$args; # key hash, KEY
# key : [host]192.168.56.2 [server_port]8080 [uri]/cache_ehcache-2.10.0_web/expire [is_args] [args]-
proxy_cache_min_uses 3; # url, , 3 , 。
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment; # , 0,nginx ,
#
access_log logs/cache.log cache_log;
}

참고 문장
http 의 chunked 원리
http://www.cnblogs.com/zhaozhan/archive/2010/08/24/1807639.html
tomcat 에서 Transfer - Encoding: chunked 를 사용 하지 않 는 방법
http://stackoverflow.com/questions/6299432/how-do-disable-transfer-encoding-in-tomcat-6

좋은 웹페이지 즐겨찾기