NGINX:设置 X-Accel-Expires 时缓存

NGINX:设置 X-Accel-Expires 时缓存

我添加了X-Accel-Expires我的静态内容上的标题以及上一次更改标头。我想知道什么是缓存这些元素而不缓存其他任何内容的正确设置。

这是我目前所拥有的,但它没有缓存任何东西:

http {
include       /etc/nginx/mime.types;

access_log  /var/log/nginx/access.log;

sendfile        on;
client_max_body_size 2000m; 
keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

ssl_certificate /etc/nginx/chain.pem; 
ssl_certificate_key /etc/nginx/key.key;

proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=cache:30m max_size=1G;
proxy_temp_path /var/lib/nginx/proxy 1 2;
proxy_cache_use_stale error timeout invalid_header http_502;

server {
    listen       80;
    server_name domain;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_read_timeout 700;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

答案1

要缓存内容,首先需要创建一个代理缓存路径在上下文中http,就像这样:

proxy_cache_path    /var/cache/nginx/site1    levels=1:2    keys_zone=site1:10m max_size=1G;

然后你也可以选择定义代理缓存键。任何具有与缓存条目相同的缓存键的请求都将收到缓存的回复(如果有)。但默认可能已经足够好了,所以,这完全是可选的。

然后,要在给定上下文中启用缓存,只需提及应该使用哪个缓存,如下所示:

proxy_cache    site1;

根据描述代理缓存有效指令,nginx 已经尊重X-Accel-Expires并执行了它,所以,你基本上已经完成了。由于你不想缓存任何不包含的内容X-Accel-Expires,那么你可能希望添加一个值 0 作为默认有效时间(X-Accel-Expires内容中的设置应该会覆盖此默认值)。

proxy_cache_valid    0m;

我假定除了缺少任何缓存之外,您的配置文件是有效的,并且您的代理本身已经起作用。

然后,基本上,要修复您的配置,您只需将以下内容添加到您的或http上下文中:serverlocation

proxy_cache    cache;
proxy_cache_valid    0m;

(当然,您可能还想确保缓存路径存在并且具有正确的权限。)


关于上述哈布拉哈布尔文章/示例,我认为将其包含$http_if_modified_since在缓存键中实际上是不正确的,因为您最终可能会得到大量的多缓存条目,从而实际上浪费了您的缓存。


还要注意,nginx 可能不会代理X-Accel-Expires标头 - 它仅在内部使用它,并且 IIRC 可能不会转发此标头。要改变这种行为,您还必须明确要求它被代理(如果您想通过 nginx 调试您的内容,并查看您的应用如何设置标头等):

proxy_pass_header "X-Accel-Expires";

答案2

有一个很好的指南关于俄罗斯 IT 博客上 nginx 中使用X-Accel-Expiresheader 的信息。我认为,这对你的情况可能非常有用。

答案3

我认为原因是缓存已定义但未启用——proxy_cache cache;丢失。

相关内容