NGINX proxy_pass 不缓存内容
NGINX proxy_pass not caching content
我在让 NGINX 缓存我使用 proxy_pass 命令从 Dropbox 中提取的缩略图时遇到问题。在 NGINX 所在的同一台服务器上 运行 我 运行 多次执行以下命令
wget --server-response --spider http://localhost:8181/1/thumbnails/auto/test.jpg?access_token=123
并使用 X-Cache 获得完全相同的响应:每次 MISS
HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Wed, 25 Mar 2015 20:05:36 GMT
Content-Type: image/jpeg
Content-Length: 1691
Connection: keep-alive
pragma: no-cache
cache-control: no-cache
X-Robots-Tag: noindex, nofollow, noimageindex
X-Cache: MISS
这是我的 nginx.conf 文件的主要内容.. 关于我在这里做错了什么有什么想法吗?
## Proxy Server Caching
proxy_cache_path /data/nginx/cache keys_zone=STATIC:10m max_size=1g;
## Proxy Server Setting
server {
listen *:8181;
proxy_cache STATIC;
proxy_cache_key "$request_uri";
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
location ~ ^/(.*) {
set $dropbox_api 'api-content.dropbox.com';
set $url '';
resolver 8.8.8.8;
proxy_set_header Host $dropbox_api;
proxy_cache STATIC;
proxy_cache_key "$request_uri";
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
add_header X-Cache $upstream_cache_status;
proxy_pass https://$dropbox_api/$url$is_args$args;
}
##Error Handling
error_page 500 502 503 504 404 /error/;
location = /error/ {
default_type text/html;
}
}
为了缓存代理响应,Nginx 和源之间的请求应该是无 cookie 的:
proxy_hide_header Set-Cookie;
proxy_ignore_headers Set-Cookie;
查看带有失效方法的完整配置:https://gist.github.com/mikhailov/9639593
原来从 Dropbox 返回的缩略图请求包括 header
Cache-Control: no-cache
并且 Nginx 将遵守这些 headers 除非它们被显式忽略 这可以通过简单地使用以下将忽略任何缓存控制的配置行来完成。
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
我们在 nginx.conf 文件的不同区域放置 "proxy_ignore_headers" 选项时也遇到了问题。最后,经过大量尝试,我们通过在 "location" 块中明确设置它来使其工作。可以在下面找到配置文件的完整片段
## Proxy Server Caching
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:50m inactive=2h max_size=2g;
## Proxy Server Setting
server {
listen *:8181;
location ~ ^/(.*) {
set $dropbox_api 'api-content.dropbox.com';
set $url '';
resolver 8.8.8.8;
proxy_set_header Host $dropbox_api;
proxy_hide_header x-dropbox-thumbcachehit;
proxy_hide_header x-dropbox-metadata;
proxy_hide_header x-server-response-time;
proxy_hide_header x-dropbox-request-id;
proxy_hide_header cache-control;
proxy_hide_header expires;
add_header cache-control "private";
add_header x-cache $upstream_cache_status; # HIT / MISS / BYPASS / EXPIRED
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
proxy_pass https://$dropbox_api/$url$is_args$args;
}
}
如果以上答案未能解决您的问题,请尝试以下操作:
proxy_cache_valid 200 2d;
(或者你想要的任何时间和任何响应代码)
在您使用或激活 proxy_cache <keys_zone_name>
的地方添加这个。
显然对我来说,一旦我删除 proxy_cache_valid
参数缓存状态就不会显示。文档也没有说这是必填字段。如果这对你有用,请告诉我。所以我们可能会更新文档。
我希望 proxy_cache 开始页面应该显示您至少需要 3 个这些参数才能开始:proxy_cache_path
、proxy_cache
和 proxy_cache_valid
我在让 NGINX 缓存我使用 proxy_pass 命令从 Dropbox 中提取的缩略图时遇到问题。在 NGINX 所在的同一台服务器上 运行 我 运行 多次执行以下命令
wget --server-response --spider http://localhost:8181/1/thumbnails/auto/test.jpg?access_token=123
并使用 X-Cache 获得完全相同的响应:每次 MISS
HTTP/1.1 200 OK Server: nginx/1.1.19 Date: Wed, 25 Mar 2015 20:05:36 GMT Content-Type: image/jpeg Content-Length: 1691 Connection: keep-alive pragma: no-cache cache-control: no-cache X-Robots-Tag: noindex, nofollow, noimageindex X-Cache: MISS
这是我的 nginx.conf 文件的主要内容.. 关于我在这里做错了什么有什么想法吗?
## Proxy Server Caching
proxy_cache_path /data/nginx/cache keys_zone=STATIC:10m max_size=1g;
## Proxy Server Setting
server {
listen *:8181;
proxy_cache STATIC;
proxy_cache_key "$request_uri";
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
location ~ ^/(.*) {
set $dropbox_api 'api-content.dropbox.com';
set $url '';
resolver 8.8.8.8;
proxy_set_header Host $dropbox_api;
proxy_cache STATIC;
proxy_cache_key "$request_uri";
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
add_header X-Cache $upstream_cache_status;
proxy_pass https://$dropbox_api/$url$is_args$args;
}
##Error Handling
error_page 500 502 503 504 404 /error/;
location = /error/ {
default_type text/html;
}
}
为了缓存代理响应,Nginx 和源之间的请求应该是无 cookie 的:
proxy_hide_header Set-Cookie;
proxy_ignore_headers Set-Cookie;
查看带有失效方法的完整配置:https://gist.github.com/mikhailov/9639593
原来从 Dropbox 返回的缩略图请求包括 header
Cache-Control: no-cache
并且 Nginx 将遵守这些 headers 除非它们被显式忽略 这可以通过简单地使用以下将忽略任何缓存控制的配置行来完成。
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
我们在 nginx.conf 文件的不同区域放置 "proxy_ignore_headers" 选项时也遇到了问题。最后,经过大量尝试,我们通过在 "location" 块中明确设置它来使其工作。可以在下面找到配置文件的完整片段
## Proxy Server Caching
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:50m inactive=2h max_size=2g;
## Proxy Server Setting
server {
listen *:8181;
location ~ ^/(.*) {
set $dropbox_api 'api-content.dropbox.com';
set $url '';
resolver 8.8.8.8;
proxy_set_header Host $dropbox_api;
proxy_hide_header x-dropbox-thumbcachehit;
proxy_hide_header x-dropbox-metadata;
proxy_hide_header x-server-response-time;
proxy_hide_header x-dropbox-request-id;
proxy_hide_header cache-control;
proxy_hide_header expires;
add_header cache-control "private";
add_header x-cache $upstream_cache_status; # HIT / MISS / BYPASS / EXPIRED
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
proxy_pass https://$dropbox_api/$url$is_args$args;
}
}
如果以上答案未能解决您的问题,请尝试以下操作:
proxy_cache_valid 200 2d;
(或者你想要的任何时间和任何响应代码)
在您使用或激活 proxy_cache <keys_zone_name>
的地方添加这个。
显然对我来说,一旦我删除 proxy_cache_valid
参数缓存状态就不会显示。文档也没有说这是必填字段。如果这对你有用,请告诉我。所以我们可能会更新文档。
我希望 proxy_cache 开始页面应该显示您至少需要 3 个这些参数才能开始:proxy_cache_path
、proxy_cache
和 proxy_cache_valid