Nginx não armazena dados em cache

9

Eu tenho uma API REST por trás de um proxy nginx. Proxying funciona bem, no entanto, não consigo armazenar nenhuma resposta em cache. Qualquer ajuda seria muito apreciada:

Configuração do 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;
        }
    }
}

Não importa o que eu tentei, o Cache Proxy sempre retorna como MISS:

Cabeçalhos de solicitação são:

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

Cabeçalhos de resposta são:

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

Minha suspeita é de que é algo com os cabeçalhos do cliente, mas mesmo se eu emitir a chamada via curl e verificar os cabeçalhos, não há resposta.

Obrigado antecipadamente

    
por user2630270 15.10.2014 / 18:35

2 respostas

32

Você não disse ao nginx quanto tempo a resposta é válida e deve ser atendido pelo cache.

Isso deve ser especificado com a diretiva proxy_cache_valid .

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

Mas isso não funcionará para solicitações POST porque você não tem nenhuma chave de cache que seja diferente de uma solicitação POST para outra na mesma URL, se não tiver o mesmo conteúdo.

Portanto, você precisará ajustar a chave do cache para $host$request_uri|$request_body . Você terá que monitorar o tamanho do cache ( proxy_cache_path parameter max_size ) e o buffer de resposta do proxy proxy_buffer_size para que ele atenda às suas necessidades.

    
por 15.10.2014 / 19:31
12

De: link

Syntax: proxy_cache_valid [code ...] time;

...

Parameters of caching can also be set directly in the response header. This has higher priority than setting of caching time using the directive.

  • The “X-Accel-Expires” header field sets caching time of a response in seconds. The zero value disables caching for a response. If the value starts with the @ prefix, it sets an absolute time in seconds since Epoch, up to which the response may be cached.
  • If the header does not include the “X-Accel-Expires” field, parameters of caching may be set in the header fields “Expires” or
    “Cache-Control”.
  • If the header includes the “Set-Cookie” field, such a response will not be cached.
  • If the header includes the “Vary” field with the special value “*”, such a response will not be cached (1.7.7). If the header includes
    the “Vary” field with another value, such a response will be cached
    taking into account the corresponding request header fields (1.7.7).

Processing of one or more of these response header fields can be disabled using the proxy_ignore_headers directive.

A maioria dos aplicativos da web definiu Set-Cookie header, portanto, uma resposta não será armazenada em cache. Para corrigir isso, use esta diretiva:

proxy_ignore_headers Set-Cookie;
    
por 17.11.2015 / 09:31