Linux nginx 作为缓存代理不缓存任何东西
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9230812/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
nginx as cache proxy not caching anything
提问by Bruno Faria
I'm trying to cache static content which are basically inside the paths below in virtual server configuration. For some reason files are not being cached. I see several folders and files inside the cache dir but its always something like 20mb no higher no lower. If it were caching images for example would take at least 500mb of space.
我正在尝试缓存静态内容,这些内容基本上位于虚拟服务器配置中的以下路径内。由于某些原因,文件没有被缓存。我在缓存目录中看到了几个文件夹和文件,但它总是像 20mb 一样不高不低。例如,如果它是缓存图像,则至少需要 500mb 的空间。
Here is the nginx.conf cache part:
这是 nginx.conf 缓存部分:
** nginx.conf **
proxy_cache_path /usr/share/nginx/www/cache levels=1:2 keys_zone=static$
proxy_temp_path /usr/share/nginx/www/tmp;
proxy_read_timeout 300s;
Heres the default virtual server.
这是默认的虚拟服务器。
**sites-available/default**
server {
listen 80;
root /usr/share/nginx/www;
server_name myserver;
access_log /var/log/nginx/myserver.log main;
error_log /var/log/nginx/error.log;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location ~* ^/(thumbs|images|css|js|pubimg)/(.*)$ {
proxy_pass http://backend;
proxy_cache static;
proxy_cache_min_uses 1;
proxy_cache_valid 200 301 302 120m;
proxy_cache_valid 404 1m;
expires max;
}
location / {
proxy_pass http://backend;
}
}
采纳答案by Alexander Azarov
Make sure your backend does not return Set-Cookie
header. If Nginx sees it, it disables caching.
确保您的后端不返回Set-Cookie
标头。如果 Nginx 看到它,它会禁用缓存。
If this is your case, the best option is to fix your backend. When fixing the backend is not an option, it's possible to instruct Nginx to ignore Set-Cookie
header
如果是这种情况,最好的选择是修复您的后端。当修复后端不是一种选择时,可以指示 Nginx 忽略Set-Cookie
标头
proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
See the documentation
查看文档
proxy_ignore_header
will ensure that the caching takes place. proxy_hide_header
will ensure the Cookie payload is not included in the cached payload. This is important to avoid leaking cookies via the NGINX cache.
proxy_ignore_header
将确保缓存发生。proxy_hide_header
将确保缓存的有效负载中不包含 Cookie 有效负载。这对于避免通过 NGINX 缓存泄漏 cookie 很重要。
回答by Overbryd
I would like to add that multiple configuration options and combinations can disable proxy caching in Nginx. Unfortunately this is poorly documented.
我想补充一点,多个配置选项和组合可以禁用 Nginx 中的代理缓存。不幸的是,这没有很好的记录。
In my configuration I set proxy_buffering on
and it enabled caching as expected.
在我的配置中,我设置proxy_buffering on
并按预期启用了缓存。
回答by Russell
For what it's worth, my experience is that nginx does not always cache things where you tell it to.
就其价值而言,我的经验是 nginx 并不总是在您告诉它的地方缓存内容。
For example, on centos7, with the configuration option
比如在centos7上,用配置选项
proxy_cache_path /tmp/my_nginx_cache levels=1:2 keys_zone=my_zone:10m inactive=24h max_size=1g;
nginx actually caches the files at:
nginx 实际上将文件缓存在:
/tmp/systemd-private-phJlfG/tmp/my_nginx_cache
回答by James Tan
after going through multiple answers and comments, i found this configuration finally works:
在浏览了多个答案和评论后,我发现这个配置终于有效了:
10m
= 10mb
key cache, max_size
to 2GB
, inactive=120m
(refresh from source after 120minutes of inactive), use_temp_path=off
(to reduce io)
10m
= 10mb
key cache, max_size
to 2GB
, inactive=120m
(在非活动状态 120 分钟后从源刷新), use_temp_path=off
(减少 io)
proxy_cache_valid
- cache status of 200
and 302
for 60 minutes
proxy_cache_valid
-200
和302
60 分钟的缓存状态
proxy_cache_path /tmp/cache levels=1:2 keys_zone=default_cache:10m max_size=2g
inactive=120m use_temp_path=off;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 60m;
server {
listen 80;
server_name example.com;
# https://www.nginx.com/blog/nginx-caching-guide
location / {
proxy_cache default_cache;
proxy_buffering on;
proxy_ignore_headers Expires;
proxy_ignore_headers X-Accel-Expires;
proxy_ignore_headers Cache-Control;
proxy_ignore_headers Set-Cookie;
proxy_hide_header X-Accel-Expires;
proxy_hide_header Expires;
proxy_hide_header Cache-Control;
proxy_hide_header Pragma;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_pass http://ip-of-host:80;
#set $memcached_key "$uri?$args";
#memcached_pass 127.0.0.1:11211;
# error_page 404 502 504 = @fallback;
}
}