J'ai une API REST derrière un proxy nginx. Le proxy fonctionne bien, mais je ne peux pas mettre en cache les réponses. Toute aide serait très appréciée:
Configuration 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;
}
}
}
Peu importe ce que j'ai essayé, le Proxy-Cache revient toujours en tant que MISS:
Les en-têtes de demande sont:
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
Les en-têtes de réponse sont:
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
Je soupçonne que c'est quelque chose avec les en-têtes client, mais même si j'émets l'appel via curl et vérifie les en-têtes, il n'y a pas de réponse.
Merci d'avance
Vous n'avez pas indiqué à nginx pendant combien de temps la réponse est valide et doit être servie depuis le cache.
Cela doit être spécifié avec proxy_cache_valid
directive.
proxy_cache one;
proxy_cache_key $Host$uri$is_args$args;
proxy_cache_valid 200 10m;
Mais cela ne fonctionnera pas pour les demandes POST car vous n'avez pas de clé de cache qui diffère d'une demande POST à une autre sur la même URL si elles ne le font pas) t ont le même contenu.
Vous devrez donc régler la clé de cache sur $Host$request_uri|$request_body
. Vous devrez surveiller la taille du cache (proxy_cache_path
paramètre max_size
) et tampon de réponse proxy proxy_buffer_size
donc il convient à vos besoins.
De: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid
Syntaxe: proxy_cache_valid [code ...] time;
...
Les paramètres de mise en cache peuvent également être définis directement dans l'en-tête de réponse. Cela a une priorité plus élevée que la définition du temps de mise en cache à l'aide de la directive.
- Le champ d'en-tête "X-Accel-Expires" définit le temps de mise en cache d'une réponse en secondes. La valeur zéro désactive la mise en cache d'une réponse. Si la valeur commence par le préfixe @, elle définit une durée absolue en secondes depuis Epoch, jusqu'à laquelle la réponse peut être mise en cache.
- Si l'en-tête n'inclut pas le champ "X-Accel-Expires", les paramètres de mise en cache peuvent être définis dans les champs d'en-tête "Expires" ou
"Cache-Control".- Si l'en-tête comprend le champ "Set-Cookie" , une telle réponse ne sera pas mise en cache.
- Si l'en-tête comprend le champ "Varier" avec la valeur spéciale "*", une telle réponse ne sera pas mise en cache (1.7.7). Si l'en-tête comprend
le champ "Varier" avec une autre valeur, une telle réponse sera mise en cache
en tenant compte des champs d'en-tête de demande correspondants (1.7.7).Le traitement d'un ou plusieurs de ces champs d'en-tête de réponse peut être désactivé à l'aide de la directive proxy_ignore_headers .
La plupart des applications Web définissent Set-Cookie
en-tête, donc une réponse ne sera pas mise en cache. Pour résoudre ce problème, utilisez cette directive:
proxy_ignore_headers Set-Cookie;