Nginx가 데이터를 캐싱하지 않음


15

nginx 프록시 뒤에 REST API가 있습니다. 프록 싱은 잘 작동하지만 응답을 캐시 할 수 없습니다. 도움을 주시면 감사하겠습니다.

Nginx 설정 :

worker_processes  10;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
        proxy_cache_path /path/to/cache/dir keys_zone=one:60m;
        proxy_cache_methods GET HEAD POST;

     upstream backend {
        server server1 backup;
        server server2 weight=5;
    }
    access_log  logs/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       7076;
        server_name  localhost;
        #charset koi8-r;
        access_log  logs/host.access.log;

        location / {
            add_header 'Access-Control-Allow-Origin' *;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Headers' 'Content-Type,Accept';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

            proxy_cache one;
            proxy_cache_key $host$uri$is_args$args;

            add_header X-Proxy-Cache $upstream_cache_status;

            proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
            proxy_ignore_headers Set-Cookie;
            proxy_ignore_headers Cache-Control;

            proxy_hide_header Cache-Control;
            proxy_hide_header Set-Cookie;
            proxy_pass http://backend;
        }
    }
}

내가 시도한 것에 상관없이 Proxy-Cache는 항상 MISS로 돌아옵니다.

요청 헤더는 다음과 같습니다.

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:nginxserver:portnumber
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36

응답 헤더는 다음과 같습니다.

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type,Accept
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Type:text/plain;charset=UTF-8
Date:Wed, 15 Oct 2014 16:30:18 GMT
Server:nginx/1.7.4
Transfer-Encoding:chunked
X-Proxy-Cache:MISS

내 생각에는 클라이언트 헤더에 문제가 있지만 curl을 통해 호출을 발행하고 헤더를 확인하더라도 응답이 없습니다.

미리 감사드립니다


1
요청 헤더에서 : Cache-Control:max-age=0"이 요청을 캐시하지 마십시오"를 의미합니다.
Nathan C

클라이언트 헤더에서 무시할 수있는 방법이 있습니까? 이것은 왜 컬을 통해서도 작동하지 않는지를 설명하지 않습니다 ....
user2630270

@ user2630270 초기 요청 URL 및 방법은 무엇입니까? 중간 응답은 무엇입니까?
Xavier Lucas

@XavierLucas 위의 헤더 방법은 Chrome 문제를 해결하기 때문에 GET입니다. 요청은 nginxserver : port / solr / asd / select? q = * : * 라인에 따른 것입니다. 중간 응답을 캡처하는 방법을 모르겠습니다. 이에 대한 지침은 어디서 찾을 수 있습니까?
user2630270

정확히 동일한 쿼리로 nginx를 거치지 않고 응용 프로그램을 직접 누르면 다음과 같은 응답 헤더가 표시됩니다. Content-Type : text / plain; charset = UTF-8 Transfer-Encoding : chunked
user2630270

답변:


44

응답이 유효하고 캐시에서 제공되어야하는 시간에 대해 nginx에 말하지 않았습니다.

proxy_cache_valid지시문 으로 지정해야합니다 .

proxy_cache one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;

그러나 동일한 콘텐츠가없는 경우 POST 요청과 동일한 URL의 다른 키와 다른 캐시 키가 없으므로 POST 요청에는 작동하지 않습니다.

따라서 캐시 키를로 조정해야합니다 $host$request_uri|$request_body. 필요에 맞게 캐시 크기 ( proxy_cache_path매개 변수 max_size) 및 프록시 응답 버퍼 를 모니터링 proxy_buffer_size해야합니다.


좋아, 고마워! 효과가있었습니다. 좀 더 명확하게 문서화되기를 바랍니다.
user2630270

이 지시어를 설정하지 않으면 응답이 캐시됩니다. 그러나 X-Accel-Expire, Cache-Control 또는 App의 Expire 헤더로 재정의됩니다. 적어도 Set-Cookie와 Vary는 캐시를 피할 수 있습니다. 이러한 사실은 문서에 노출되어 있습니다. 내 프레임 워크 인 Laravel이 항상 위의 헤더를 보내므로 테스트 할 간단한 스크립트를 만들었습니다.
빅터 아길라

16

보낸 사람 : http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

구문 : proxy_cache_valid [code ...] 시간;

...

캐싱 매개 변수는 응답 헤더에서 직접 설정할 수도 있습니다. 지시문을 사용한 캐싱 시간 설정 보다 우선 순위높습니다 .

  • "X-Accel-Expires"헤더 필드는 응답의 캐싱 시간을 초 단위로 설정합니다. 값이 0이면 응답 캐싱이 비활성화됩니다. 값이 @ 접두어로 시작하면 응답이 캐시 될 수있는 Epoch 이후의 절대 시간 (초)을 설정합니다.
  • 헤더에 "X-Accel-Expires"필드가 포함되어 있지 않으면 캐싱 매개 변수가 헤더 필드 "Expires"또는
    "Cache-Control"에 설정 될 수 있습니다 .
  • 헤더에 "Set-Cookie" 필드가 포함되어 있으면 해당 응답이 캐시되지 않습니다.
  • 헤더에 특수 값 "*"이있는 "Vary"필드가 포함되어 있으면 이러한 응답이 캐시되지 않습니다 (1.7.7). 헤더
    에 다른 값을 가진 "Vary"필드가 포함 된
    경우 해당 요청 헤더 필드 (1.7.7)를 고려하여 이러한 응답이 캐시됩니다 .

proxy_ignore_headers 지시문을 사용하여 이러한 응답 헤더 필드 중 하나 이상의 처리를 비활성화 할 수 있습니다 .

대부분의 웹 앱은 Set-Cookie헤더를 설정 하므로 응답이 캐시되지 않습니다. 이를 해결하려면 다음 지시문을 사용하십시오.

proxy_ignore_headers Set-Cookie;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.