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

mnm*_*nml 5 nginx proxy cache

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

这是我目前所拥有的,但它不缓存任何内容:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

cns*_*nst 7

要缓存内容,首先需要在上下文中创建代理缓存路径http,如下所示:

proxy_cache_path    /var/cache/nginx/site1    levels=1:2    keys_zone=site1:10m max_size=1G;
Run Code Online (Sandbox Code Playgroud)

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

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

proxy_cache    site1;
Run Code Online (Sandbox Code Playgroud)

根据proxy cache valid指令的描述,nginx已经尊重X-Accel-Expires并操作了,到此基本大功告成。由于您不想缓存任何不包含的内容X-Accel-Expires,因此您可能希望添加一个 0 作为默认有效时间(X-Accel-Expires您的内容中的设置应覆盖此默认值)。

proxy_cache_valid    0m;
Run Code Online (Sandbox Code Playgroud)

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

然后,基本上,修复配置所需要做的就是将以下内容添加到http,serverlocation上下文中:

proxy_cache    cache;
proxy_cache_valid    0m;
Run Code Online (Sandbox Code Playgroud)

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


关于提到的habrahabr文章/示例,我认为将其包含$http_if_modified_since在缓存键中实际上是不正确的,因为您可能最终会得到很多多缓存条目,从而有效地浪费了缓存。


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

proxy_pass_header "X-Accel-Expires";
Run Code Online (Sandbox Code Playgroud)