NginxExpires

一、Nginx expires 基本介绍

在Web开发中,为了提高Web页面的访问速度,缓存是非常常用的技术之一。针对静态文件的缓存,可以采用HTTP协议定义的”Expires”和”Cache-Control”响应头字段。Nginx也支持这两个字段,可以很好地进行缓存优化。

location / {
    expires 24h;
}

这是一个基本的配置:指定了”/”的response header中expires为24小时后。这里默认采用HTTP协议0.9(也就是不填)。

二、Nginx expires 的使用场景

1. 静态资源缓存

对于静态资源文件(例如js、css、图片等),应该经常被访问,所以使用Nginx expires可以改善访问速度,减轻后台服务器负担。

location ~ .*\.html$ {
    expires 1m;
}
location ~ .*\.css$ {
    expires 1d;
}
location ~ .*\.js$ {
    expires 1d;
}
location ~ .*\.png {
    expires 1d;
}
location ~ .*\.jpg {
    expires 1d;
}

这个例子中,html缓存时间为1分钟,css/js/png/jpg缓存时间为1天。

2. 多级缓存

对于服务器资源非常紧缺的情况(例如CDN多机房、大型活动),可以尝试使用Nginx-expires进行双层甚至多层缓存。

location ~ /(.*)/(.*) {
    proxy_pass http://$1;
    expires 10m;
}
location / {
    proxy_pass http://upstream_server;
}

这里配置了两个location。第一个location是针对http代理的,如果某个请求能够被代理服务器”完美命中”,也即代理后面的”/(.*)/(.*)”正则表达式能够完全和URL吻合,那么就缓存它。

缓存时间为10分钟,这有利于直接从Nginx缓存中读取资源,或者从代理服务器读取资源。

当代理未命中的时候,会走第二个location,即从后台upstream服务器中获取,这种情况下,缓存失效,不使用Nginx缓存。这个例子是一个多级缓存的例子,效果显著。

3. 避免CDN不必要的回源

对于一些稳定不变的文件,例如logo、共用的js库等,经常使用CDN来提供加速服务,但是CDN中可能还没有这个文件,需要先从源站获取一次,这可以用Nginx expires来避免不必要的回源。

location /logo.png {
    expires 30d;
}
location /common.js {
    expires 30d;
}

这里配置了两个location,分别是logo和共用的js文件,expires设置为30天。这样在30天内,CDN就不会回源了,而且cpu以及网络都能够节省不少。

三、Nginx expires 的注意事项

1. expires 与 Cache-Control的互斥

在HTTP协议中存在两个关于缓存的响应头:“Expires”和“Cache-Control”。其中的Cache-Control常用的值有:public, private, no-cache, max-age, s-maxage等。
在nginx expires配置时同时存在Cache-Control配置时,Cache-Control的优先级最高。当Cache-Control的max-age刚好等于Nginx expires的时间时,会优先采用Cache-Control的值来进行缓存而不是Nginx expires的值。

2. expires 改变了“Last-Modified”响应头的值

当expires的时间比当前的时间早,而缓存还没有被删除时,expires会从“Last-Modified”响应头中删除。

3. expires 只对文静态件有效

仅对静态资源文件有效,对于动态页面这些经API计算出的内容不会有影响。

4. expires 的时间点是客户端时间点,而不是Nginx服务器时间点

expires中的时间点是客户端时间点,而不是Nginx服务器时间点。所以,如果客户端时间设置不正常的话,就会出现缓存时间过长或者过短的问题。

5. 针对某些特殊场景需要计算expires

有些特殊场景需要根据变量动态计算expires的值。例如:

location ~ /api/user_info {
    if ($http_cookie ~* "sid=([^;]+)"){
        add_header Set-Cookie "sid=$1; HttpOnly";
        expires 30d;
        break;
    }
    return 401;
}

在这个例子中,针对请求“/api/user_info”,基于变量$http_cookie的值设定Set-Cookie和expires,可以让对这个API的访问在30天之内是有效的。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/156817.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-11-18 01:58
下一篇 2024-11-18 01:58

发表回复

登录后才能评论