nginx 压缩和缓存设置

  1. 云栖社区>
  2. 博客>
  3. 正文

nginx 压缩和缓存设置

技术小阿哥 2017-12-31 16:57:00 浏览899
展开阅读全文

nginx js和jpg图片缓存设置

wKiom1Z5dgCyofYtAACJgMbHiSQ692.png

server {

    listen       80;

    server_name  localhost;

    index index.htm index.html;

    root  /to/path/;


    include       mime.types;  #支持的格式,需要压缩什么类型就在这个里面去找。

    default_type  application/octet-stream;

#####gzip压缩功能   

    gzip  on;

    gzip_min_length 1k;

    gzip_buffers 16 64k;

    gzip_http_version 1.1;

    gzip_comp_level 6;

    gzip_types image/gif image/jpeg image/png text/plain application/x-javascript text/css application/xml;

    gzip_vary on;


 location ~ .*\.(js|css)?$

        {

                expires 5d;


        }


####防盗链

 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

        {

                expires 30d;

                valid_referers none blocked www.xxxx *.xxxxxx;

               if($invalid_referer) {         

                rewrite ^/ http://www.xx.com/403.html;


}}    

HTTP_Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。



nginx referer限制

语法:valid_referers [none|blocked|server_names]

使用字段:server, location

这个指令在referer头的基础上为 $invalid_referer 变量赋值,其值为0或1。

可以使用这个指令来实现防盗链功能,如果valid_referers列表中没有Referer头的值, $invalid_referer将被设置为1。

参数可以使如下形式:

none 意为不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)

blocked 意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。

server_names 为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符。


举例:


location /chat/ { 

  valid_referers none blocked so.com *.so.com; 

  if ($invalid_referer) { 

    return 403; 

  } 






Nginx中使用Expires增强浏览器缓存

expires [time|epoch|max|pff]默认值:offexpires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用time:可以使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定time值来设定。time值还控制"Cache-Control"的值:负数表示no-cache正数或零表示max-age=time epoch:指定“Expires”的值为 1January,1970,00:00:01 GMTmax:指定“Expires”的值为31December2037 23:59:59GMT,"Cache-Control"的值为10年。-1:指定“Expires”的值为当前服务器时间-1s,即永远过期。off:不修改“Expires”和"Cache-Control"的值


expires使用了特定的时间,并且要求服务器和客户端的是中严格同步。

而Cache-Control是用max-age指令指定组件被缓存多久。

对于不支持http1.1的浏览器,还是需要expires来控制。所以最好能指定两个响应头。但HTTP规范规定max-age指令将重写expires头。


如果不想让代理或浏览器缓存,加no-cache参数或private参数:

# expires 1d;

add_header Cache-Control no-cache;

add_header Cache-Control private;

这样浏览器F5刷新时,返回的依然是200,而不是304.


记录一个nginx控制缓存的例子:

       expires 1d;

       add_header Cache-Control no-cache;

       add_header Cache-Control private;

       if ( !-e $request_filename) {

       rewrite ^(.*) http://test.zhaopin.com/index.html break;

  #   add_header Cache-Control no-cache;

  #   add_header Cache-Control private;

当我将add_header写在rewrite之后时,发现add_header竟然不起作用了。。是因为写进了if里面..



apache的mod_expires模块使得在使用expires头时能像max-age那样以相对的方式设置日期,通过ExpiresDefault指令完成。例如:图片等过期时间为请求开始的10年之后

<FileMatch"\.(gif|jpg|js|css)$">

ExpiresDefault "access plus 10years"

</FileMatch>

它像响应中发送Expires头和Cache-Control max-age头。


expires|etag控制页面缓存区别expires:像上面文章提到的:expires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用time:可以使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定time值来设定。time值还控制"Cache-Control"的值:负数表示no-cache正数或零表示max-age=time epoch:指定“Expires”的值为 1January,1970,00:00:01 GMTmax:指定“Expires”的值为31December203723:59:59GMT,"Cache-Control"的值为10年。-1:指定“Expires”的值为当前服务器时间-1s,即永远过期。off:不修改“Expires”和"Cache-Control"的值


expires使用了特定的时间,并且要求服务器和客户端的是中严格同步。

而Cache-Control是用max-age指令指定组件被缓存多久。

对于不支持http1.1的浏览器,还是需要expires来控制。所以最好能指定两个响应头。但HTTP规范规定max-age指令将重写expires头。一般用于页面变化不是很快的时候,如果缓存过期了,浏览器在重用它之前会首先确认他是否有效,就是一个“条件GET请求”,如果有效,返回304状态码。expires通过Last-Modified响应头来确定。




能够使浏览器缓存的HTTP头部信息主要有以下三种:


1、last-modified实现浏览器缓存

last-modified是根据文件更新时间来确定是否再次发送加载。通过返回last-modified头部信息:


 

GET/wp-content/plugins/crayon-syntax-highlighter/js/min/crayon.min.js HTTP/1.1

Host:www.3mc2.com

User-Agent:Mozilla/5.0(Windows NT6.1;WOW64;rv:26.0)Gecko/20100101Firefox/26.0

Accept:*/*

Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding:gzip,deflate

Referer:http://www.3mc2.com/category/architecture

Cookie:wp-settings-1=hidetb%3D0%26libraryContent%3Dbrowse%26align%3Dcenter%26urlbutton%3Dnone%26editor%3Dtinymce%26wplink%3D0%26ed_size%3D508%26mfold%3Do;wp-settings-time-1=1389840828

Connection:keep-alive

 

HTTP/1.1200OK

Server:nginx

Date:Thu,16Jan201415:47:24GMT

Content-Type:application/x-javascript

Last-Modified:Thu,16Jan201402:29:13GMT

Transfer-Encoding:chunked

Connection:keep-alive

Content-Encoding:gzip

 

再次请求则带有If-Modified-Since头部信息,并返回404:


GET/wp-includes/js/jquery/jquery.js?ver=1.10.2HTTP/1.1

Host:www.3mc2.com

User-Agent:Mozilla/5.0(Windows NT6.1;WOW64;rv:26.0)Gecko/20100101Firefox/26.0

Accept:*/*

Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding:gzip,deflate

Referer:http://www.3mc2.com/category/architecture/nginx

Connection:keep-alive

If-Modified-Since:Thu,16Jan201402:29:13GMT

 

HTTP/1.1304Not Modified

Server:nginx

Date:Thu,16Jan201415:53:34GMT

Last-Modified:Thu,16Jan201402:29:13GMT

Connection:keep-alive

 

我的测试环境为firefox,网址中带有”?ver=”参数的文件会再次发送请求(返回304),其他文件均未再次请求。


2、Etag确定浏览器缓存:

Etag的原理是将文件资源编号一个etag值,Response给访问者,访问者再次请求时,带着这个Etag值,与服务端所请求的文件的Etag对比,如果不同了就重新发送加载,如果相同,则返回304.


3、Expires浏览器缓存:

Expires是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。如果文件变动较频繁,不要使用Expires来缓存。


对于本博客来说,css样式和JS脚本基本已经定型,所以最适合的方法是Expires来缓存一些内容到访问者浏览器。通过配置Nginx配置文件实现相关功能:



server{

    .....

    root/www.3mc2.com;

    index  index.html index.htm index.php;

    location~.*\.(gif|jpg|jpeg|bmp|png|ico|txt|mp3|mp4|swf){

        expires15d;

    }

    location~.*\.(css|js){

        expires12h;

    }

    ......

}



本文转自 吃草的青蛙 51CTO博客,原文链接:http://blog.51cto.com/tlinux/1727390,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论