nginx的服务端缓存和客户端缓存两种方法叠加使用

服务端缓存:

原文:

https://www.cnblogs.com/wpjamer/articles/7124087.html

客户端缓存:

原文:

https://blog.csdn.net/zhang_referee/article/details/88532172

nginx 图片缓存

最近准备用nginx搭建了一个图片服务器,看中的就是nginx超强的静态文件处理能力。

由于图片量比较大,和web服务器(也是nginx)分开运行,虽然web服务器调用图片没用问题,但毕竟是远程调用,肯定没有本地文件系统那么快,因此仍然有优化的空间。

使用前的nginx配置

location ~* ^.+.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
    log_not_found off;
    access_log off;
    expires 7d;
}
   
接下来就用到了nginx的proxy_store模块,让nginx 将取得的图片缓存在本地一个目录,下次就直接调用,(这让网页热点图片统计变得非常容易,讨厌日志分析的管理员肯定喜欢)
 
 
复制代码
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {
           log_not_found off;
           expires 7d ;
           access_log off;
           proxy_store on;
           proxy_store_access user:rw group:rw all:rw;
            if ( !-e $request_filename) {
           proxy_pass  http://img.example.com
           }
}
复制代码

默认的缓存路径位于 /var/cache/nginx/proxy_temp,里面将会保持图片服务器的目录结构

proxy_store 没有缓存过期,相当于镜像功能,这既是优点也是缺点,优点是访问快速,缺点是不知哪一天,硬盘会被撑爆,不过我们可以写个find脚本,定时清理一下缓存就OK了。

nginx还有一种缓存proxy_cache,它在设计上比proxy_store 更先进,采用内存+硬盘方式缓存,可以设置缓存大小和缓存过期。

复制代码
http {
    ,,,,,
    proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=imgcache:100m inactive=1d max_size=10g;
    server {
    ........
        location ~* ^.+.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
        log_not_found off;
        access_log off;
        expires 7d;
        proxy_pass http://img.example.com ;
        proxy_cache imgcache;
        proxy_cache_valid 200 302 1d;
        proxy_cache_valid 404 10m;
        proxy_cache_valid any 1h;
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
        }
    }
}
复制代码
   

上面的代码将会使用一块最大100M的共享内存,用于硬盘上的文件索引,包括文件名和请求次数,每个文件在1天内若不活跃(无请求)则从硬盘上淘汰,硬盘缓存最大10G,满了则根据LRU算法自动清除缓存。

这种缓存方式为了更快的索引,采用hash分级来存储图片,图片目录结构和名称都变得面目全非,因此网页热点图片,必须通过其他途径统计,比如日志。

后一种方式更像一种正儿八经的缓存系统,应用相对更广,在性能上也更好。

本文针对nginx expires 设置进行讲解。nginx 缓存设置非常简单,可以设置在location /if 段里。

注:这个缓存是指针对浏览器所做的缓存,不是指服务器端的数据缓存.

下面就以具体的示例网站,针对该示例网站做实验。

一般缓存是针对不常发生变化的内容来做的缓存,在我们的这个示例网站中,可以看到图片是很多的,如果每次访问都请求加载很多图片资源的话,那是相当慢的,也是非常浪费服务器资源的。

ok,我们这边设置nginx 做下缓存,让浏览器一个星期内不再重复请求图片内容。

我们先看下,在没做缓存配置前的一个浏览器请求响应头信息:

注:我这里nginx 有配置过虚拟主机,把虚拟主机的配置单独抽离出来放在了vhosts 目录下,因此,下面所做的配置主要是针对该主机,如果配置在nginx.conf 文件中也同样适用的(前提要配置正确哦)。

配置如下:

  1.  
    location ~* .(jpg|jpeg|gif|png){
  2.  
     
  3.  
    root /data/www/OneGame/public ;
  4.  
    expires 7d;
  5.  
     
  6.  
    }

该配置表示:所有在/data/www/OneGame/public 目录下的以.jpg、.png、.gif、.jpeg为后缀  (不区分大小写)的文件缓存7天。

 以下是我配置文件完整内容:

让nginx  重新载入配置

nginx -s reload

然后强制刷新访问示例网站,查看一下图片的请求响应头信息。

可以看到响应头信息多了一个Cache-Control ,而且该值为:604800 ( 3600 * 24 * 7 ) ,该值单位为秒,即缓存7天。

再次刷新(非强制刷新)查看浏览器请求响应头信息

再次刷新后(非强制刷新),可以查看到,状态码304的数据浏览器已经没有再请求服务器了


原理是:第一次浏览器访问资源,服务器响应Etag 验证令牌,Last-Modified 时间,Cache-Control:max-age 缓存时长,第二次浏览器发送请求的时候在HTTP If-None-Match 请求标头中加上ETAG 验证令牌,服务器根据当前请求资源核对令牌如果它未发生变化,服务器返回"304 Not Modified"响应,告知浏览器缓存中响应未发生变化,可以继续延用Cache-Control响应头中max-age时长。这次不必再次下载响应,这节约了时间和带宽。

浏览器发出的所有 HTTP 请求会首先路由到浏览器缓存,以确认是否缓存了可用于满足请求的有效响应。 如果有匹配的响应,则从缓存中读取响应,这样就避免了网络延迟和传送产生的流量费用。

原文地址:https://www.cnblogs.com/itfat/p/13810219.html