当我们访问网站的时候为了加快访问速度,减少HTTP请求,通常使用缓存,高级一点名称叫动静分离技术(中的静)。我们把不长更换的CSS、图片等等,生成缓存。
Proxy_store
但 Proxy_store
跟 Squid
是有区别的!! 最明显的一点在于其不具有expires
,无法通过程序控制cache什么时间过期。往后要写个脚本定期删除缓存目录中的内容,不过这也正合我意。
以下是配置方式:
如果需要将文件拉到到本地,则需要增加如下几个子参数:
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path 缓存目录;
其中:
proxy_store on
启用缓存到本地的功能,proxy_temp_path
指定缓存在哪个目录下,如:proxy_temp_path /var/nginx_cache;
在经过上一步配置之后,虽然文件被缓存到了本地磁盘上,但每次请求仍会向远端拉取文件,为了避免去远端拉取文件,还必须增加:
if ( !-e $request_filename) {
proxy_pass http://192.168.10.10;
}
即改成有条件地去执行proxy_pass
,这个条件就是当请求的文件在本地的proxy_temp_path
指定的目录下不存在时,再向后端拉取。
整体配置例子:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {
#指定缓存文件类型
expires 7d; #设置浏览器过期时间
root /data/nginx_cache;
#静态文件根目录目录(必须对应proxy_temp_path)
proxy_store on; #开启缓存机制
proxy_store_access user:rw group:rw all:rw; #缓存读写规则
proxy_temp_path /data1/nginx_caches; #存放静态文件的缓存目录
include proxy.conf;
# 外联proxy理的详细配置如proxy_set_header, client_max_body_size ….
if ( !-e $request_filename) { #正则表达式,匹配缓存目录中的文件与源文件是否存在)
proxy_pass http://192.168.10.10 # PHP 应用的服务器地址
}
}
proxy_cache缓存
upstream dd{
server 192.168.100.11:8001;
server 192.168.100.11:8002;
server 192.168.100.11:8003;
}
proxy_cache_path /opt/app/cache levels=1:2 keys_zone=solo_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server{
listen 80;
server_name www.solo365.cn;
access_log /var/log/nginx/access.log;
location /{
proxy_cache dd_cache;
proxy_pass http://dd;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upsteam error timeout invalid_header http_500 http_502 http_503 http_504;
include proxy_params;
}
}
}
levels=1:2
代表目录结构,两层分级。
keys_zone
是开辟缓存空间的名字,keys_zone=solo_cache:10m代表keys空间大小
max_size=10g
代表最大目录空间,用慢后会自动清理。
inactive=60m
代表60分钟内没有访问缓存会进行清理
use_temp_path=off;
关闭比较好
proxy_cache_valid 200 304
他们缓存12h;
proxy_next_upsteam error timeout invalid_header http_500 http_502 http_503 http_504 当我们的负载均衡服务器 返回500 502 跳转下一台服务器。
清理指定缓存
第三方扩展模块: ngx_cache_purge
让页面不缓存。
proxy_no_cache
作用域:http,server,location
server{
if($request_uri ~^/(url|login|register|password\/reset)){
set $cookie_nocache 1;
}
location /{
proxy_cache solo_cache;
proxy_pass http://dd;
proxy_cache_key $host$uri$is_args$args;
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorizationl
add_header Nginx-Cache "$upstream_cache_status";
}
}