2012年10月24日星期三

Nginx做文件缓存原理

        关于反向代理不多赘述,Nginx是一个高性能的http服务器,可以通过配置Nginx缓存来实现静态文件访问加速。

http304原理

        在使用浏览器访问的时候,经常可以看到一个状态值304返回。304的英文表示是Not Modified,即文件未被修改,而这个值是通过http server返回给客户端的。以Nginx为例,当返回304时,并未产生任何的数据下载。
Request URL:http://s1.t.itc.cn/mblog/pic/20122_21_9/92542601162191005.jpg
Request Method:GET
Status Code:304 Not Modified

        从截图上可以看到只有228B字节的返回,这只相当于http header的大小,而图片则不需要被重新下载传输,也就是通过这个会加快网页的加载速度。

        实现304的原理关键在于两个http header。分别是Last-Modified和If-Modified-Since。
        http server在首次收到图片访问请求的时候,会向浏览器端返回Last-Modified这个header,标示当前文件的上次修改日期。
Cache-Control:max-age=86400
Connection:keep-alive
Date:Wed, 24 Oct 2012 08:56:16 GMT
Expires:Thu, 25 Oct 2012 08:56:16 GMT
Last-Modified:Wed, 24 Oct 2012 07:49:33 GMT
Server:nginx/0.8.54
        浏览器收到这个参数后,再次请求时,会带上If-Modified-Since参数传递给服务器。http server收到这个参数,会和本地缓存中的Last-Modified比较,如果一致则返回http304.
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:t.itc.cn
If-Modified-Since:Wed, 24 Oct 2012 07:49:33 GMT
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1

Nginx判断是否返回304的原理

nginx的缓存目录会缓存访问过的文件,这些文件的格式如下:
 [1m~JP^@^@^@^@……………………[1m~Y~GP^@^@^@^@~_^F [1m^@^@[1m^@[1m^A-cache
KEY: t.itc.cn/mblog/pic/20122_21_9/92542601162191005.jpg
HTTP/1.0 200 OK^M
Server: Resin/3.1.9^M
Last-Modified: 23 Oct 2012 09:40:38 GMT^M
ETag: BExxWmSgiYb1234^M
Accept-Ranges: bytes^M
Expires: Fri, 26 Oct 2012 07:33:00 GMT^M
Content-Type: image/jpeg^M
Content-Length: 7810^M
Date: Wed, 24 Oct 2012 07:32:59 GMT^M
^M
…[1m^@^PJFIF^@^A^A^A^@H^@H^@^@…[1m^@C^@^H^F^F^G^F^E^H^G^G^G               ^H
缓存文件中存储了缓存的主键key,和header值,通过匹配缓存中的Last-Modified来达到是否返回http 304的判断。如果没有缓存,则获取文件在源站的修改时间作为Last-Modified值。如果是接口处理后返回的文件,需要接口自己设置Last-Modified值。

简单配置Nginx缓存

proxy_temp_path /var/tmp/nginx/proxy;
proxy_cache_path /var/tmp/nginx/cache levels=1:2 keys_zone=cache_one:20m inactive=1d max_size=5g;
 
server {
 
 listen  80;
 server_name localhost;
 
 root /var/www;
 
 location ~ \.(jpg|png|jpeg|gif|css|js)$ {
  proxy_cache cache_one;
  proxy_cache_valid 200 304 12h;
  proxy_cache_key $host$uri$is_args$args;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_pass http://127.0.0.1:8181;
  proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
  expires 1d;
 }
}

没有评论:

发表评论