常见的缓存类型有服务端缓存(Redis、Memcached)、代理缓存(Nginx)、客户端缓存(浏览器),它们的作用都是用于减少后端服务器的压力。在Nginx中要开启缓存的话,除了可以使用expires选项开启客户端缓存,还支持代理缓存,要开启代理缓存功能的话所使用到的模块是ngx_http_proxy_module,其包含了proxy_cache功能,常用配置项有以下几个项:
1、proxy_cache zone | off ; :调用已经定义好的缓存,如果off则关闭缓存;zone代表已经配置好的缓存名字,这个由proxy_cache_path在http、server、location标签中定义
2、proxy_cache_valid [code ...] time; :缓存过期时间,code为http状态码,可以针对不同状态码进行缓存
3、proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time] ; :定义缓存以及缓存配置,只能定义在http标签中
4、proxy_cache_key string;:缓存维度,也就是需要缓存的内容
5、proxy_cache_lock:如果有多个相同的请求同时传递给Nginx,将这些请求进行合并
Nginx缓存配置示例
user nginx; #运行Nginx的用户 worker_processes 1; error_log logs/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; tcp_nopush on; #tcp_nodeley off; keepalive_timeout 65; gzip on; include /etc/nginx/conf.d/*.conf; upstream linuxe { server 192.168.100.110; server 192.168.100.120; } #下面语句是关键,分别定义了缓存存放的目录;缓存目录为2层,目录命名规则为层1个字符,第二层2个字符;缓存空间的名字为linuxe,并且开辟空间为10m,每1m可存放8000个key;缓存目录更大有10g,超出的进行淘汰;60分钟没被使用的缓存文件认为是非活跃文件而被清理 proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=linuxe_cache:10m max_size=10g inactive=60m use_temp_path=off; server { listen 80; server_name linuxe.cn; location { proxy_cache linuxe_cache; #调用了linuxe_cache这个缓存区 proxy_pass http://linuxe; proxy_cache_valid 200 304 12h; #将200和304的状态码将缓存12个小时 proxy_cache_valid any 10m; #其他状态码缓存10分钟 proxy_cache_key $host$uri$is_args$args; } }
上述设置成功后可以访问页面进行测试,正常情况下即使有做负载均衡但经过缓存后访问的页面是同一个,这个可以通过放置不同的页面进行测试
Nginx缓存清理与过滤
1、要清理缓存的话可以通过rm命令删除缓存目录或者使用第三方扩展模块ngx_cache_purge,该模块装上后,只需要访问指定的路径就可以删除对应的缓存
http://www.linuxe.cn/purge/index.php #清理index.php页面的缓存
2、使用proxy_no_cache选项可以指定某URL不被缓存,如:
server { listen 80; server_name linuxe.cn; if ( $request_uri ~ ^/(login|password|test) ){ set $cookie_nocache 1; #将访问路径进行正则匹配,如果匹配上了给cookic_nocache这个变量设值为1 } location / { proxy_no_cache $cookie_nocache; #这里no_cache的条件就是变量是否为1,为1则不缓存 } }