zoukankan      html  css  js  c++  java
  • 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 请求会首先路由到浏览器缓存,以确认是否缓存了可用于满足请求的有效响应。 如果有匹配的响应,则从缓存中读取响应,这样就避免了网络延迟和传送产生的流量费用。

  • 相关阅读:
    python 时间 时间戳 转换
    jsp mysql
    multi struts config
    mysql start
    struts logic tag
    jsp setProperty
    jstl fn tag
    write jsp tag
    use Bean in JSP
    jsp mysql JavaBean
  • 原文地址:https://www.cnblogs.com/itfat/p/13810219.html
Copyright © 2011-2022 走看看