本文共 5950 字,大约阅读时间需要 19 分钟。
nginx 作为web的缓存服务器案例
1.启用缓存的准备2.参与缓存的nginx进程3.指定要缓存的请求4.指定绕过缓存5.从缓存中清除内容6.完全从缓存中删除文件启用缓存时,nginx会将响应保存在磁盘中,并使用它们响应客户端,而不必要每次都请求相同的内容
首先需要安装第三方的软件:
ngx_cache_purge如果在安装的过程中没有编译进入,那么需要重新编译添加ngx_cache_purge模块#nginx -V 查看安装了那些模块#./configure --prefix=/usr/local/webserver/nginx/ --with-http_stub_status_module --with-http_ssl_module --add-module=/ngx_cache_purge-2.3 增加需要安装的模块,编译过程中业务不中断要启用缓存,将proxy_cache_path指令包含在顶级http上下文中,必须的第一个参数是缓存内容本地文件系统路径
而mandatory keys_zone参数定义用于存储相关缓存项目的元数据的共享内存区域的名称和大小http { //定义缓存的路径,然后定义元数据的名称为one 大小为10M,然后proxy_cache要在缓存服务器响应的上下文中进行调用 ,key_zone参数定义的区域名称proxy_cache_path /data/nginx/cache keys_zone=one:10m;server { location / { proxy_pass http://localhost:8000; proxy_cache one; //在server中调用keys_zone}}}
范例:简单示例
http { proxy_cache_path /tmp/cache keys_zone=tmpcache:10m; server { location ~ .(gif|jpg|jgep|png)${ proxy_pass http://127.0.0.1:8000; proxy_cache tmpcache; proxy_cache_key $uri$is_args$args; proxy_cache_valid 200 304 1d; //设置缓存代码为200 304的响应进行缓存,缓存为1天。 proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; //后端500错误不会反馈给前端 expires 1d; } location ~ /pruge(/.*) { //在跟新的文件路径前127.0.0.1/pruge allow 127.0.0.1; deny all; proxy_cache_pruge tmpcache $1$is_args$args; } } }
①如果高速缓存大小超过指令max_size参数设置的限制proxy_cache_path,高速缓存管理器将删除最近访问的数据。
②该缓存加载器只运行一次,NGINX开始之后。它将有关以前缓存数据的元数据加载到共享内存区域中。一次加载整个缓存可能会消耗足够的资源,以在启动后的最初几分钟内降低NGINX的性能。为了避免这种情况,通过在proxy_cache_path指令中包含以下参数来配置缓存的迭代加载:loader_threshold - 迭代持续时间,以毫秒为单位(默认为200)
loader_files - 一次迭代中加载的项目的最大数目(默认为100)loader_sleeps - 迭代之间的延迟(以毫秒为单位)(默认值为50)proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
#该配置避免nginx 重新加载的时候,缓存失效,重新缓存给nginx性能带来极大的消耗默认情况下,nginx会缓存在从代理服务器对http get和head响应,并进行标识
下次客户端请求,如果请求与缓存具有相同的秘钥,nginx会将缓存响应发送给客户端要更改计算秘钥使用的请求特征proxy_cache_key "$host$request_uri$cookie_user";最少请求5次,才进行缓存
proxy_cache_min_uses 5;要使用get 、head 以外的请求方式,
proxy_cache_methods GET HEAD POST;默认情况下,缓存不被覆盖,将无限期保留,但我们设置缓存的响应有限时间,定义于,http,server,或location上下文
要限制具有特定状态代码的缓存响应时间,proxy_cache_validproxy_cache_valid 200 302 10m; #10分钟有效proxy_cache_valid 404 1m;proxy_cache_valid any 5m; #定义所有响应代码的缓存时间要定义nginx不向客户端发送缓存响应的条件,包括proxy_cache_bypass指令
每个参数定义一个条件,并由许多变量组成。如果至少一个参数不为空且不等于“0”(零),NGINX Plus不会查找缓存中的响应,而是立即将请求转发到后端服务器。proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;要定义nginx不缓存响应的条件,与proxy_cache_bypass指令相同的方式定义参数proxy_no_cache $http_pragma $http_authorization;从缓存中删除过时的缓存文件,这对于删除过期的缓存内容是必须的,避免同事提供新旧版本的网页。
接收到包含自定义HTTP标头或“PURGE”HTTP方法的特殊“清除”请求后,清除缓存。配置告诉缓存清除标识使用purge http 方法的请求并删除匹配的URL1、在http关卡上,创建一个新的变量,列如,$purge_method取决于$request_method变量http {map $request_method $purge_method{PURGE 1;default 0 ;}}
2、在location 配置的缓存中,包含proxy_cache_purge指定缓存清除请求条件的指令。
server {listen 80;server_name www.example.com;location / {proxy_pass https://localhost:8002;proxy_cache mycache; #调用缓存keys_zoneproxy_cache_purge $purge_method; #调用清除指令}}
发送清除命令
当proxy_cache_purge指令配置,你需要发送一个特殊的缓存清除请求缓存。可以使用一系列工具发出清除请求,如curl命令#curl -X PURGE -D – "*";具有公共url部分的资源被删除,但是这样的缓存条目将不会从缓存中完全删除;它们将保留在磁盘上直到它们被删除 proxy_cache_path限制对清除命令的访问
建议配置允许发送缓存清除请求的有限数量的ip地址geo $purge_allowed {default 0; # deny from other10.0.0.1 1; # allow from localhost192.168.0.0/24 1; # allow from 10.0.0.0/24}map $request_method $purge_method {PURGE $purge_allowed;default 0;}
在这个例子中,NGINX检查请求中是否使用“PURGE”方法,如果是,则分析客户端IP地址。如果IP地址列入白名单,则$purge_method设置为$purge_allowed:“1”允许清除,“0”拒绝清除。
要完全删除与星号匹配的缓存文件,您需要激活一个特殊的cache purger进程,该进程将永久遍历所有缓存条目,并删除与通配符匹配的条目。在http关卡上,将purger参数添加到proxy_cache_path指令中:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;高速缓存配置实列:
http {...proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on; #启用缓存响应,并且开启缓存完成删除purger=onmap $request_method $purge_method { #定义缓存清除变量PURGE 1; #1表示开启default 0;}server {listen 80;server_name www.example.com;location / {proxy_pass https://localhost:8002; proxy_cache mycache; #在location中启用缓存响应proxy_cache_purge $purge_method; #在location中启用缓存清除,全局定义的是完成删除}}geo $purge_allowed { #允许进行缓存清除的主机default 0; #默认拒绝所有10.0.0.1 1; #允许该地址清除缓存192.168.0.0/24 1; #并且允许这个段}map $request_method $purge_method {PURGE $purge_allowed;default 0;}}
有时,初始缓存填充操作可能需要一些时间,特别是对于大文件,当第一个请求开始下载一部分视频文件时,下一个请求不得不等待整个文件被下载并放入缓存。
nginx使用cache slice module模块可以进行缓存填充,每个范围请求选择将覆盖所请求的范围的特定切片,并且如果该范围仍未被缓存,则将其放入缓存。对这些片的所有其他请求将从缓存中获取响应。要启用字节范围缓存:
1.确保nginx是用slice模块编译的2.使用slice指令指定切片的大小location / { slice 1m;}切片的大小要适当的调整,使切片下载更快,太小的大小可能导致内存使用量过大以及大量打开的文件描述符,值太大可能会导致延迟。3.将$slice_range变量包含在缓存键中:
proxy_cache_key $uri$is_args$args$slice_range;4.使用状态码启用缓存响应:
proxy_cache_valid 200 206 1h;5.通过$slice_range在Range头字段中传递变量来启用传递范围请求到代理服务器:
proxy_set_header Range $slice_range;字节范围缓存示例:
location / { slice 1m;proxy_cache cache;proxy_cache_key $uri$is_args$args$slice_range;proxy_set_header Range $slice_range;proxy_cache_valid 200 206 1h;proxy_pass ;}组合配置示例:
http {...proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300loader_files=200 max_size=200m; #为了避免刚启动时占用资源过大设置loader限制server {listen 8080;proxy_cache one; #调用缓存location / {proxy_pass http://backend1; #响应很少发生变化,无需缓存}location /some/path {proxy_pass http://backend2; #经常发生变化,可以进行短期缓存proxy_cache_valid any 1m; #可缓存的端口号以及时间proxy_cache_min_uses 2; #请求三次以上才进行缓存proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment; #指定不缓存的项} location ~/pruge(/.*){ 清除缓存 allow 10.0.10.0/24; proxy_cache_purge two $1$is_args$args;}}}
转载于:https://blog.51cto.com/7603402/2085216