У меня есть API REST позади прокси nginx. Проксирование хорошо работает, однако я не могу кэшировать любые ответы. Любая справка очень ценилась бы:
Конфигурация 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;
}
}
}
Независимо от того, что я попробовал, Кэш прокси-сервера всегда возвращается как МИСС:
Заголовки запроса:
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
Заголовки Reponse:
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
Мое подозрение - то, что это - что-то с клиентскими заголовками, но даже если я издаю приказ через завихрение и проверяю заголовки, нет никакого ответа.
Заранее спасибо
Вы не сказали nginx, сколько времени ответ действителен и должен обслуживаться из кеша.
Это должно быть указано в директиве proxy_cache_valid
.
proxy_cache one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;
] Но это не сработает для запросов POST, потому что у вас нет ключа кеша, который отличается от запроса POST на другой по тому же URL, если они не имеют одинакового содержания.
Таким образом, вам необходимо настроить ключ кеша кому: $ host $ request_uri | $ request_body
. Вам нужно будет контролировать размер кеша ( proxy_cache_path
параметр max_size
) и буфер ответа прокси proxy_buffer_size
, чтобы он соответствовал вашим потребностям.
От: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid
Синтаксис: proxy_cache_valid [код ...] время;
...
Параметры кеширования также можно задать прямо в заголовке ответа. Это имеет более высокий приоритет , чем установка времени кэширования с помощью директива.
- Поле заголовка «X-Accel-Expires» устанавливает время кэширования ответа в секундах. Нулевое значение отключает кеширование ответа. Если значение начинается с префикса @, устанавливает абсолютное время в секундах начиная с эпохи, до которой ответ может кэшироваться.
- Если заголовок не включает поле «X-Accel-Expires», параметры кэширования могут быть установлены в полях заголовка «Истекает» или
«Cache-Control».- Если заголовок включает поле «Set-Cookie» , такой ответ не будет кэшироваться.
- Если заголовок включает поле «Vary» со специальным значение «*», такой ответ не будет кэшироваться (1.7.7). Если заголовок включает
поле «Vary» с другим значением, такой ответ будет кэшироваться
с учетом соответствующих полей заголовка запроса (1.7.7).Обработка одного или нескольких из этих полей заголовка ответа может быть отключено с помощью директивы proxy_ignore_headers .
Большинство веб-приложений устанавливают заголовок Set-Cookie
,поэтому ответ не будет кэшироваться. Чтобы исправить это, используйте эту директиву:
proxy_ignore_headers Set-Cookie;