赞
踩
第一步:添加nginx.conf
的http
级别的缓存配置
##cache## proxy_connect_timeout 500; #跟后端服务器连接的超时时间_发起握手等候响应超时时间 proxy_read_timeout 600; #连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理 proxy_send_timeout 500; #后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据 proxy_buffer_size 128k; #代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可 proxy_buffers 4 128k; #同上 告诉Nginx保存单个用的几个Buffer最大用多大空间 proxy_busy_buffers_size 256k; #如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2 proxy_temp_file_write_size 128k; #proxy缓存临时文件的大小 proxy_temp_path /usr/local/nginx/temp; #用于指定本地目录来缓冲较大的代理请求 proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g; #设置web缓存区名为cache_one,内存缓存空间大小为12000M,自动清除超过15天没有被访问过的缓存数据,硬盘缓存空间大小200g
此处的重点在最后一句,缓存存储路径为:/usr/local/nginx/cache
,levels=1:2
代表缓存的目录结构为2级目录
如下图,缓存会在/usr/local/nginx/cache
目录下生成,包含2
级目录,在之下就是缓存文件,测试的时候可以到该目录下查看缓存文件是否生成。
第二步:在访问静态文件的location
上添加缓存
#静态数据保存时效 location ~ \.html$ { proxy_pass http://source.qingk.cn; proxy_redirect off; proxy_cache cache_one; #此处的cache_one必须于上一步配置的缓存区域名称相同 proxy_cache_valid 200 304 12h; proxy_cache_valid 301 302 1d; proxy_cache_valid any 1m; #不同的请求设置不同的缓存时效 proxy_cache_key $uri$is_args$args; #生产缓存文件的key,通过4个string变量结合生成 expires 30d; #其余类型的缓存时效为30天 proxy_set_header X-Forwarded-Proto $scheme; }
此处需要注意3点:
1、只有在proxy_pass
的时候,才会生成缓存,下一次请求执行到proxy_pass
的时候会判断是否有缓存,如果有则直接读缓存,返回给客户端,不会执行proxy_pass
;如果没有,则执行proxy_pass
,并按照规则生成缓存文件;可以到nginx
的cache
文件夹下看是否生成了缓存文件。
2、proxy_set_header Host $host
这一句可能导致缓存失败,所以不能配置这一句。我在测试的时候遇到了这个问题,不明原理。
3、proxy_pass
使用upstream
,换成域名或ip
则可行。
第三步:在proxy_pass
跳转的location
中配置静态文件的路径
location ~ .*\.(html)$ {
default_type 'text/html';
root "/usr/local/openresty/nginx/html";
}
将nginx
本地存放静态文件的路径配到root
指令处
如果没有这一句:default_type 'text/html'
,所有的请求都默认是下载文件,而不是访问html
页面
到此,静态文件缓存已经配置完成。但是还差很重要的最后一步,缓存生成之后会阻止访问进入后台和nginx
本地,如果有更新,则更新内容无法生效,还需要一种手动清除缓存的机制。
第四步:清除缓存
缓存文件是根据proxy_cache_key
这个指令生成的,所以找到对应的缓存文件,删除即可
location ~ /purge(/.*) {
#删除指定缓存区域cache_one的特定缓存文件$1$is_args$args
proxy_cache_purge cache_one $1$is_args$args;
#运行本机和10.0.217.0网段的机器访问,拒绝其它所有
allow 127.0.0.1;
allow 10.0.217.0/24;
deny all;
}
删除缓存用到proxy_cache_purge
指令。
Nginx
的缓存配置比较直观简单,具体有下面几个指令需要知道:
A、proxy_cache_path
格式:proxy_cache_path path [levels=numbers] keys_zone=zone_name:zone_size[inactive=time] [max_size=size]
说明:
path -缓存文件存放的位置
levels -缓存目录结构,可以是1、2、3位数字作为目录,最多是3位数字如:1,1:2
keys_zone -指定缓存池名字及大小,每个定义缓存路径必须不同
inactive -设置每个缓存区缓存文件的有效时长,超过该时长没被访问的缓存被删除
max_size -设置不活动的缓存大小,不活动的缓存超过该大小后被删除
B、proxy_cache
格式:proxy_cache cache_name
说明:
指定缓存区域的名字,一个相同的区域可以在不同的地方使用。
C、proxy_cache_valid
格式:proxy_cache_valid reply_code [reply code…|any] time;
说明:
reply_code -不同的应答代码
time -为不同应答设置不同缓存时长 默认为分钟m
any - 代表任何代码
A、新建缓存页面
$ mkdir –pv /nginx/cache/webpages
B、配置nginx.conf
proxy_cache_path /nginx/cache/webpages levels=1:2 keys_zone=webpages:30mmax_size=2g; server { listen 80; server_name localhost; charset utf-8; location / { proxy_passhttp://webservers; proxy_set_header X-Real-IP$remote_addr; proxy_cache webpages; proxy_cache_valid 20010m; } }
最后,测试下配置是否正确:
$sudo nginx –t
然后,重载下nginx服务:
$sudo nginx –s reload
C、测试结果
浏览器输入:http://127.0.0.1 然后查看缓存路径下是否生成缓存文件,以及缓存文件格式是否正确,缓存的结果:
/nginx/cache/webpages/f/63/681ad4c77694b65d61c9985553a2763f
上面的路径规则已经按照我们预期设置生成,缓存文件格式是url
的hash
格式,下面可以查看下这个文件是否是我们使用的页面,默认生成的缓存目录f
级别是不允许进入访问的,为了演示我已经给予其777
权限了。
$cat 681ad4c77694b65d61c9985553a2763f
D、如何知道是否访问缓存?
答案很简单,我们使用谷歌浏览器浏览网页,然后打开开发者面板,查看里面的Response Headers
响应头中的信息:
但从上面是看不出是否调用了缓存文件,因为需要额外配置下。首先,要了解下两个缓存变量:
$server_addr - 显示的服务器地址
$upstream_cache_status - 缓存的状态 可能的值为:MISS(未命中)、Hint(命中)、Expired(请求传递到后台)、Stale(后端得到过期的应答)、Updating(正更新,使用旧的应答)等。
那么,在这里如果缓存的状态为HINT
,就说明命中了缓存,也就是调用了缓存文件。接下来,配置下nginx.conf
文件,然后重新加载,刷新页面即刻,具体如下:
A、配置文件nginx.conf
proxy_cache_path /nginx/cache/webpages levels=1:2 keys_zone=webpages:30mmax_size=2g; server { listen 80; server_name localhost; charset utf-8; #add headers add_header X-Via$server_addr; add_header X-Cache$upstream_cache_status; location / { proxy_passhttp://webservers; proxy_set_headerX-Real-IP $remote_addr; proxy_cache webpages; proxy_cache_valid 20010m; } }
B、测试结果
如上图中的Resonpse Headers
部分,已经说明缓存已经调度了。
Nginx
设置expires
设定页面缓存时间 不缓存或一直使用缓存expires
expires
起到控制页面缓存的作用,合理的配置expires
可以减少很多服务器的请求
要配置expires
,可以在http
段中或者server
段中或者location
段中加入
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
root /var/www/img/;
expires 30d;
}
控制图片等过期时间为30天,当然这个时间可以设置的更长。具体视情况而定
比如
location ~ \.(wma|wmv|asf|mp3|mmf|zip|rar|swf|flv)$ {
root /var/www/upload/;
expires max;
}
expires
指令可以控制 HTTP
应答中的“ Expires
”和“ Cache-Control
”的头标(起到控制页面缓存的作用)
语法:expires [time|epoch|max|pff]
默认值:off
expires
指令控制HTTP
应答中的“Expires
”和“Cache-Control
”Header
头部信息,启动控制页面缓存的作用
time
:可以使用正数或负数。“Expires
”头标的值将通过当前系统时间加上设定time
值来设定。
time
值还控制"Cache-Control
"的值:
no-cache
max-age=time
epoch
:指定“Expires
”的值为 1 January,1970,00:00:01 GMT
max
:指定“Expires
”的值为31 December2037 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
头。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。