Eu tenho uma API REST por trás de um proxy nginx. O proxy funciona bem, no entanto, não consigo armazenar em cache nenhuma resposta. 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 Proxy-Cache sempre volta como uma MISS:
Os cabeçalhos da 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
Os 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 é 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.
desde já, obrigado
Cache-Control:max-age=0
... isso implica em "não armazenar em cache esta solicitação".Respostas:
Você não disse ao nginx por quanto tempo a resposta é válida e deve ser veiculada no cache.
Isso deve ser especificado com a
proxy_cache_valid
diretiva.Porém, isso não funcionará para solicitações POST, porque você não possui uma chave de cache que difere de uma solicitação POST para outra na mesma URL se elas não tiverem o mesmo conteúdo.
Portanto, você precisará ajustar a chave de cache para
$host$request_uri|$request_body
. Você precisará monitorar o tamanho do cache (proxy_cache_path
parâmetromax_size
) e o buffer de resposta do proxyproxy_buffer_size
para que ele se adapte às suas necessidades.fonte
De: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid
A maioria dos aplicativos Web define o
Set-Cookie
cabeçalho, portanto, uma resposta não será armazenada em cache. Para corrigir isso, use esta diretiva:fonte