nic*_*_v1 18 nginx proxy cache solr
我在 nginx 代理后面有一个 REST API。代理工作正常,但我无法缓存任何响应。任何帮助将非常感激:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
无论我尝试过什么,代理缓存总是作为 MISS 返回:
请求头是:
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
Run Code Online (Sandbox Code Playgroud)
响应头是:
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
Run Code Online (Sandbox Code Playgroud)
我怀疑这与客户端标头有关,但即使我通过 curl 发出调用并检查标头,也没有响应。
提前致谢
Xav*_*cas 49
您没有告诉 NGINX 响应有效且必须从缓存提供的时间。
这必须用proxy_cache_valid
指令指定。
proxy_cache one;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;
Run Code Online (Sandbox Code Playgroud)
但是,这不适用于 POST 请求,因为如果它们没有相同的内容,则您没有与同一 URL 上的 POST 请求不同的缓存键。
因此,您需要将缓存键调整为$host$request_uri|$request_body
. 您必须监视缓存大小(proxy_cache_path
参数max_size
)和代理响应缓冲区,proxy_buffer_size
以便满足您的需求。
小智 17
来自:http : //nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid
语法:proxy_cache_valid [code ...] time;
...
缓存的参数也可以直接在响应头中设置。这比使用指令设置缓存时间具有更高的优先级。
- “X-Accel-Expires”标头字段以秒为单位设置响应的缓存时间。零值禁用响应缓存。如果该值以 @ 前缀开头,则它会设置自 Epoch 以来的绝对时间(以秒为单位),直到可以缓存响应为止。
- 如果头部不包含“X-Accel-Expires”字段,可以在头部字段“Expires”或
“Cache-Control”中设置缓存参数。- 如果标头包含“Set-Cookie”字段,则不会缓存此类响应。
- 如果标头包含具有特殊值“*”的“Vary”字段,则不会缓存此类响应(1.7.7)。如果标头包含
具有另一个值的“Vary”字段,则将
考虑到相应的请求标头字段(1.7.7)来缓存此类响应。可以使用proxy_ignore_headers指令禁用对这些响应头字段中的一个或多个的处理。
大多数网络应用程序设置Set-Cookie
标头,因此不会缓存响应。要解决这个问题,请使用以下指令:
proxy_ignore_headers Set-Cookie;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38874 次 |
最近记录: |