nginx 缓存使用
***********************
永久缓存:除非手动删除,否则永远有效
**************
配置文件
default.conf
location / {
proxy_store on; #开启永久缓存
root /usr/share/nginx/cache; #缓存存储目录,手动创建,user:nginx,group:root
proxy_temp_path /usr/share/nginx/cache_temp; #缓存临时存储目录,自动创建
proxy_store_access user:rw group:rw all:r;
if (!-e $request_filename) { #如果缓存中没有,则从代理中查询
proxy_pass http://192.168.57.10:8080;
}
}
**************
应用:hello-world
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello world";
}
}
**************
创建容器
docker run -it -d --net fixed3 --ip 192.168.57.10 \
-v /usr/nginx/test/hello-world.jar:/usr/local/app.jar \
--name hello-world common
docker run -it -d --net fixed3 --ip 192.168.57.11 \
-v /usr/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf --name nginx nginx
**************
测试输出
192.168.57.11:80/hello
nginx中的缓存:hello ==》 hello world
***********************
临时缓存:缓存设置有效期, 一段时间后自动删除缓存
**************
配置文件
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_cache_path /usr/share/nginx/cache levels=1:2 keys_zone=cache_one:50m inactive=1m max_size=500m;
include /etc/nginx/conf.d/*.conf;
}
proxy_cache_path:设置缓存目录,在http模块中设置,location中设置会报错
/usr/share/nginx/cache:缓存存储目录
levels=1:2:从url hash值的尾部截取,最后1个字符为一级目录,往前2个字符为二级目录
keys_zone=cache_one:50m:缓存区的名称,大小为50m
inactive=1m:主动清空在1m内未使用的缓存
max_size=500m:磁盘空间大小为500m
default.conf
server {
listen 80;
server_name localhost;
add_header X-via $server_addr; #代理服务器的ip地址
add_header X-cache-status $upstream_cache_status; #缓存状态
location / {
proxy_cache cache_one; #缓存区的名称
proxy_cache_key $host-$uri-$is_args-$args; #缓存key值,$host:主机名,$uri:请求地址,$is_args:是否含有参数,若有则为?,没有则为空,$args:参数,没有则为空
proxy_cache_valid 200 10m; #缓存有效期,200为10m
proxy_cache_valid 304 1m; #缓存有效期,304为1m
proxy_cache_valid 301 302 1h; #缓存有效期,301、302为1h
proxy_cache_valid any 1m; #缓存有效期,其余为1m
proxy_temp_path /usr/share/nginx/cache_temp; #临时缓存目录
proxy_pass http://192.168.57.10:8080; #代理应用
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
$upstream_cache_status:请求从缓存服务器中的获取状态
HIT:缓存命中
MISS:没有缓存,请求传送到后端
Expired:缓存过期,请求传送到后端
STALE:无法从后端获取数据,返回旧的数据(proxy_cache_use_stale命令设置)
BY_PASS:绕过缓存,直接去后端获取数据(proxy_cache_bypass命令设置)
REVALIDATED:验证缓存是否过期(proxy_cache_revalidate命令设置)
常用缓存命令
proxy_cache_bypass:不从nginx中获取请求缓存数据
proxy_cache_lock:是否设置缓存锁
proxy_cache_lock_timeout:缓存锁的过期时间
proxy_no_cache:什么情况不使用缓存
proxy_cache_min_uses:同意url请求多少次之后,进行缓存
proxy_cache_revalidate:缓存过期时,向后端验证缓存内容是否过期
proxy_cache_use_stale:是否使用过期的数据
**************
创建容器
docker run -it -d --net fixed3 --ip 192.168.57.10 \
-v /usr/nginx/test/hello-world.jar:/usr/local/app.jar \
--name hello-world common
docker run -it -d --net fixed3 --ip 192.168.57.11 \
-v /usr/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf --name nginx nginx
**************
测试输出
192.168.57.11:80/hello
第一次状态为miss,第二次状态为hit,表示从缓存中获取到了数据
查看缓存数据:c ==》7c ==》1a3e23bc13cb3468778ae0595daaa7cc
一级目录:c、二级目录7c、三级目录:1a3e23bc13cb3468778ae0595daaa7cc