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; } }
没有评论:
发表评论