Nginx http_proxy_module模块实现缓存代理服务器

网友投稿 257 2022-09-13

Nginx http_proxy_module模块实现缓存代理服务器

缓存类型

浏览器缓存Nginx代理服务器缓存服务器缓存,例如Redis、Memcache等

缓存代理服务器

在代理服务器的磁盘中保存请求目标的内容,加快响应速度,减少应用服务器(后端服务器)上的资源开销,比如多客户端请求相同的资源,代理缓存命中后,对于应用服务器来说,只发生了一次资源调度。而浏览器上的缓存配置,一般来说是用来减少本地IO的,请求目标的内容会存放在浏览器本地。

缓存分为两类:时间缓存和空间缓存

时间缓存(比空间缓存用的多):比如上面图片蓝色用户访问了index.html,这个请求通过因特网到达了Nginx之后,因为Nginx没有缓存所以访问了后端应用服务器,应用服务器返回的响应到达了Nginx之后Nginx同时做两件事情。一件事情是将响应返回给用户,第二件事情是将响应缓存到磁盘上。当下一次橘黄色的另外一个用户访问index.html当请求到达Nginx之后,Nginx发现用户缓存的页面已经缓存了而且在有效期之内,,那么就之间返回内容,这样就减少了整个环节。

指令

前面我的博客介绍的是Nginx控制浏览器如何使用缓存,这里是nginx之上怎么配置上游服务器返回响应的缓存

缓存最重要的两个指令是定义存放缓存载体,proxy_cache_path定义了缓存存放在磁盘的位置,key_zone的name就是共享内存的名字,size就是共享内存的大小。共享内存的name就是给proxy_cache用的

Syntax: proxy_cache zone | off;Default: proxy_cache off;Context: server, locationSyntax:#只能放在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];Default: —Context: proxy_cache_key string;Default: proxy_cache_key $scheme$proxy_host$request_uri;Context: server, location

#缓存什么样的响应Syntax: proxy_cache_valid [code ...] time;Default: —Context: server, location

#哪些内容不写入缓存,参数为真时候不写入缓存Syntax: proxy_no_cache string ...;Default: —Context: server, location

缓存流程:发起请求

上面图片是在nginx接收到用户请求请求时处理缓存的流程以及从上游收到响应以后决定这个响应是否写入缓存。

proxy_cache_methods

#该指令可以设定对那些用户的请求方法才使用缓存,否则不使用缓存,默认是GET HEAD方法才使用缓存当中的内容Syntax: proxy_cache_methods GET | HEAD | POST ...;Default: proxy_cache_methods GET HEAD;Context: server, location

缓存代理服务器192.168.179.99配置

缓存代理服务器192.168.179.99 { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$' '"$"$ access_log logs/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; proxy_cache_path /data/nginx/cache max_size=10G levels=1:2 keys_zone=nginx_cache:10m inactive=60m use_temp_path=off; include /usr/local/nginx/conf/vhost/*.conf;}#缓存存放的位置是 /data/nginx/cache,目录层级为两层,最多存放10G缓存#缓存key存放的内存空间是 nginx_cache ,单个缓存最大为 10m#自动移除60分钟内没有人访问的缓存#在将缓存放置到 proxy_cache_path 之前,不使用 use_temp_path

--/data/nginx/cache   缓存资源存放路径

-- max_size   最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除不活跃的cache文件(超出后cache manager进程按照LRU链表淘汰)

--  levels   设置缓存目录的层级,最多三级。默认为levels=1:2,表示Nginx为将要缓存的资源生成的key从后依次设置两级保存,两级目录的意思,每层目录长度为1或者2个字节。

--key_zone  在共享内存中设置一块存储区域来存放缓存的key和metadata,这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key

--inactive 未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件

-- use_temp_path 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝

[root@~]# mkdir -p /data/nginx/cache  --创建缓存目录

代理缓存服务器192.168.179.99 location 配置

server { listen 80; server_name test.com; charset utf-8; location /{ proxy_pass proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # using include to bring in a file with commonly-used settings #include proxy.conf; 你可以把上面这些放到proxy.conf当中 #使用nginx_cache 缓存 proxy_cache nginx_cache; #只要统一个url,不管间隔多久,总次数访问到达3次,就开始缓存。 proxy_cache_min_uses 3; #指定在后端服务器在返回什么状态码的情况下可以使用过期的缓存 proxy_cache_use_stale error timeout invalid_header updating #200、304的响应缓存时间为12h proxy_cache_valid 200 304 302 12h; #非200、304,302的响应缓存时间为10m proxy_cache_valid any 10m; #使用$uri作为缓存key proxy_cache_key $uri; #对于以下特定情况,继续请求负载均衡组里面的其他服务器 proxy_next_upstream error timeout invalid_header #如果请求中含有参数或者为授权请求,则不缓存 proxy_no_cache $ $ #向客户端返回一个是否击中缓存的头信息 add_header Nginx-Cache "$upstream_cache_status"; }}

proxy_cache nginx_cache:表示使用nginx_cache缓存,这个使用之前必须先用proxy_cache_path定义。

proxy_cache_key string:缓存中用于“键”的内容;proxy_cache_key$host$uri$is_args$args;这里设置$host$uri$is_args$args作为键

proxy_cache_min_uses:指同一个url,不管时间间隔多长,是否在一个缓存周期外,只要总次数到达proxy_cache_min_uses次数,就会触发缓存功能。后续缓存失效以后,只要访问一次,又会缓存。

proxy_cache_use_stale:指定在后端服务器在返回什么状态码的情况下可以使用过期的缓存,比如:error timeout invalid_header updating 192.168.179.100 server配置

很简单就是客户端通过访问代理服务器拿到的是后端服务器上的index.html资源

server{ listen 80; server_name localhost; charset utf-8; error_page 404 =200 /404.html; location /{ root html; }}

[root@~]# echo "this is houduan fuwuqi 192.68.179.100 index.html resouce" > /usr/local/nginx/html/index.html  --在后端服务器上修改index.html里面的信息

客户端访问缓存服务器

[root@localhost network-scripts]# curl 192.168.179.99  -- --客户端去访问代理服务器,拿到的是后端服务器上的资源

this is houduan fuwuqi 192.68.179.100 index.html resouce

[root@83]# cd /data/nginx/cache/  --这个时候可以看到代理服务器上缓存了后端服务器上的资源

[root@cache]# ls

[root@cache]# ls

e

[root@cache]# cd e

[root@e]# ls

72

[root@e]# cd 72/

[root@72]# ls

1959bec6fcc5a5f1d12590dfe299f72e

可以看到生成的缓存,72红色构成了二级目录,e构成了第一级目录,剩下蓝色部分就是哈希值

测试缓存服务器是否真的可以缓存

(1)资源删除测试缓存是否生效

[root@~]# rm -rf /usr/local/nginx/html/index.html --在后端服务器上将资源删除[root@localhost network-scripts]# curl 192.168.179.99 --可以看到即使删除了后端服务器上的资源也还是可以从代理服务器上的缓存里拿到资源,不再去通过代理服务器去访问后端去拿index.html资源了 this is houduan fuwuqi 192.68.179.100 index.html resouce [root@cache]# rm -rf /data/nginx/cache/* --代理服务器删除缓存[root@localhost network-scripts]# curl 192.168.179.99 --可以看到已经拿不到资源了403 Forbidden

403 Forbidden


nginx/1.16.1

(2)从日志方面来观察缓存是否生效

[root@~]# tail -f /usr/local/nginx/logs/host.log --这条日志是客户端192.168.179.102访问192.168.179.99时,在192.168.179.100上产生的日志。当你再次访问代理服务器的资源时候直接去代理服务器上拿,在后端的192.168.179.102上不会产生日志记录192.168.179.102|192.168.179.102|192.168.179.99 - - [27/Apr/2020:09:59:47 +0800] "GET / HTTP/1.0" 200 3 "-" "curl/7.29.0" "192.168.179.102"

nginx缓存服务器加强版

nginx缓存配置实例,以下配置摘自OSChina.Net官方网站的联通节点配置

#缓存存放路径proxy_cache_path /disk2/cache/data levels=1:2 keys_zone=static:1000m inactive=600m max_size=100G;proxy_temp_path /disk2/cache/temp;location ~ ^/(img|css|js|uploads)/ {proxy_buffering on;proxy_cache static;proxy_cache_key "$host$request_uri$is_args$args";proxy_ignore_headers "Cache-Control" "Expires";proxy_cache_min_uses 1;proxy_cache_valid 200 302 304 5m;proxy_cache_use_stale set-Cookie;proxy_pass proxy.conf,gzip.conf;}proxy.conf配置:proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-ip $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size 10m;client_body_buffer_size 128k;proxy_connect_timeout 300;proxy_send_timeout 300;proxy_read_timeout 300;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;gzip.conf配置:gzip on;gzip_min_length 1000;gzip_types text/plain text/css application/x-javascript;

缓存清理

​​rm -rf 缓存目录​​使用​​ngx_cache_purge​​ 模块清理特定缓存

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Nginx 虚拟主机配置
下一篇:休克文案:五芳斋,你又淘气了!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~