您的位置:首页 > 运维架构 > Nginx

(1)nginx 作为web的缓存服务器案例

2018-03-11 15:34 585 查看
nginx 作为web的缓存服务器案例
1.启用缓存的准备
2.参与缓存的nginx进程
3.指定要缓存的请求
4.指定绕过缓存
5.从缓存中清除内容
6.完全从缓存中删除文件

nginx 作为web的缓存服务器案例

启用缓存时,nginx会将响应保存在磁盘中,并使用它们响应客户端,而不必要每次都请求相同的内容

1.启用缓存的准备

首先需要安装第三方的软件:
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;
}
}
}

2.参与缓存的nginx进程

①如果高速缓存大小超过指令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性能带来极大的消耗

3.指定要缓存的请求

默认情况下,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;

4.指定绕过缓存

默认情况下,缓存不被覆盖,将无限期保留,但我们设置缓存的响应有限时间,定义于,http,server,或location上下文
要限制具有特定状态代码的缓存响应时间,proxy_cache_valid
proxy_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;

5.从缓存中清除内容

从缓存中删除过时的缓存文件,这对于删除过期的缓存内容是必须的,避免同事提供新旧版本的网页。
接收到包含自定义HTTP标头或“PURGE”HTTP方法的特殊“清除”请求后,清除缓存。
配置告诉缓存清除
标识使用purge http 方法的请求并删除匹配的URL
1、在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_zone

proxy_cache_purge $purge_method;   #调用清除指令
}
}

发送清除命令
当proxy_cache_purge指令配置,你需要发送一个特殊的缓存清除请求缓存。可以使用一系列工具发出清除请求,如curl命令
#curl -X PURGE -D – "https://www.example.com/*";
具有公共url部分的资源被删除,但是这样的缓存条目将不会从缓存中完全删除;它们将保留在磁盘上
直到它们被删除 proxy_cache_path

限制对清除命令的访问
建议配置允许发送缓存清除请求的有限数量的ip地址

geo $purge_allowed {
default 0;                   # deny from other
10.0.0.1 1;                  # allow from localhost
192.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”拒绝清除。

6.完全从缓存中删除文件

要完全删除与星号匹配的缓存文件,您需要激活一个特殊的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=on

map $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;
}
}

6.字节范围缓存

有时,初始缓存填充操作可能需要一些时间,特别是对于大文件,当第一个请求开始下载一部分视频文件时,下一个请求不得不等待整个文件被下载并放入缓存。
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://localhost:8000;
}

组合配置示例:

http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300
loader_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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx 缓存 linux