nginx proxy cache缓存

nginx proxy cache缓存在nginx服务器中,离用户最近,但是基于磁盘,QPS可能降低

  • nginx 反向代理(实现nginx proxy cache缓存必须有nginx反向代理)

  • 依靠文件系统存索引文件(key存在内存中,具体内容value存在文件中)

  • 依靠内存保存索引文件地址

1.配置负载均衡

在nginx.conf 文件中的http模块加:

proxy_cache_path /usr/local/openresty/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=10g ;

 

解释:

proxy_cache_path: 缓存文件的路径

levels 设置缓存文件的目录层次 1:2 代表2级目录

keys_zone: 设置缓存的名字和共享内存的大小

inactive: 在指定时间内没有人访问就被删除

max_size: 最大的缓存空间。 如果缓存满了, 默认覆盖掉缓存时间最长

 upstream backend{

  server 192.168.66.32:8080;

  server 192.168.66.33:8080;

}   反向代理两台服务器

 

 

location / {

proxy_pass http://backend;
proxy_cache tmp-test;      用的缓存名字
proxy_cache_key $uri;      缓存的key是请求的url地址
proxy_cache_valid 200 206 304 302 10d;     返回值是这些时,value加缓存
}

 

解释:

proxy_cache tmp-test 使用名为tmp-test

proxy_cache_valid 200 206 304 ; 对httpcode 为缓存 10天;

proxy_cache_key $uri; 定义缓存唯一的key /通过唯一key来进行hash

 

 检查是否配置好用:./nginx -t

 

一些问题

  1. 我需要主动清理缓存文件

  2. 写入路径是一个快磁盘,如果磁盘打满了怎么办

  3. 日志统计,如何配置命中和不命中,如何设计?

  4. 基于磁盘操作 。影响我们性能,怎么办?

 

解决

1)解决问题一: 主动清理缓存

采用: nginx proxy_cache_purge 模块 , 改模块与 proxy_cache 功能相反。

设计方法: nginx中 另外在启动一个servce 。当需要清理资源的时候呢。 访问一下

相关配置:

 在service{}里加以下:

location /tem-test/{
allow 127.0.0.1;
deny all;
proxy_cache_purge tmp-test $uri;
}

 

解释:

allow: 谁能访问

deny all; 禁止其他所有ip

proxy_cache_purge tmp-test 缓存清理模块指定的​缓存文件tmp-test,和指定key 参数$uri 

 

2) 解决问题二: 缓存文件磁盘打满怎么办?

​ 由于写入路径唯一单一目录。 只能写入一块磁盘, 一块磁盘很快就满了 。 解决这种问题

1. 将多个磁盘做个磁盘阵列?缺点事减少了实际的存储空间。
2. 通过软链(快捷方式)的方法。 实现 将不同盘下的目录作为真正的存放数据的路径。 就解决了多盘利用, 单盘被打满的问题/。

3) 解决问题三? 日志统计
nginx 提供了 upstream_cache_status 这个变量 来显示我们缓存的一个状态。 我们可以配置在http头 :

 

location / {

proxy_pass http://backend;
proxy_cache tmp-test;
proxy_cache_key $uri;
proxy_cache_valid 200 206 304 302 10d;
add_header Nginx-Cache "$upstream_cache_status";  增加响应头,缓存状态
}

 

 

  • 缓存状态

HIT: 缓存命中

MISS: 为命中 请求被传送到后端

EXPIRES: 缓存过期被床送到后端

UPDATING: 正在更新缓存。

STALE: 后端得到的过期的应答

 

 

4) 解决问题四? 基于磁盘操作

 

使用 shared dic(基于内存): 共享内存字典(key,value), 所有的worker进程都可见 其中使用的淘汰算法事 LRU算法

我们使用 shared dic必须要用OpenResty 由nginx核心加上很多第三方的模块。默认集成 Lua 开发环境。

posted @ 2020-07-31 16:54  neona  阅读(501)  评论(0编辑  收藏  举报