一、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
微信扫一扫
支付宝扫一扫