Mam interfejs API REST za proxy Nginx. Serwer proxy działa dobrze, ale nie jestem w stanie buforować żadnych odpowiedzi. Każda pomoc będzie mile widziana:
Konfiguracja 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;
}
}
}
Bez względu na to, czego próbowałem, pamięć podręczna proxy zawsze wraca jako MISS:
Nagłówki żądania to:
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
Nagłówki odpowiedzi to:
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
Podejrzewam, że jest to coś z nagłówkami klienta, ale nawet jeśli wydam połączenie za pomocą curl i sprawdzę nagłówki, nie ma odpowiedzi.
Z góry dziękuję
Cache-Control:max-age=0
... oznacza to, że „nie buforuj tego żądania”.Odpowiedzi:
Nie powiedziałeś nginx, przez ile czasu odpowiedź jest ważna i musisz ją podać z pamięci podręcznej.
Musi to zostać określone w
proxy_cache_valid
dyrektywie.Ale to nie zadziała dla żądań POST, ponieważ nie masz klucza pamięci podręcznej, który różni się od żądania POST do innego pod tym samym adresem URL, jeśli nie mają tej samej zawartości.
Musisz więc dostosować klucz pamięci podręcznej do
$host$request_uri|$request_body
. Będziesz musiał monitorować rozmiar pamięci podręcznej (proxy_cache_path
parametrmax_size
) i bufor odpowiedzi proxy,proxy_buffer_size
aby dopasować go do swoich potrzeb.źródło
Od: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid
Większość aplikacji internetowych ustawia
Set-Cookie
nagłówek, więc odpowiedź nie będzie buforowana. Aby to naprawić, użyj tej dyrektywy:źródło