nginx proxy cache缓存
nginx proxy cache缓存在nginx服务器中,离用户最近,但是基于磁盘,QPS可能降低
-
-
依靠文件系统存索引文件(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)解决问题一: 主动清理缓存
采用: 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. 通过软链(快捷方式)的方法。 实现 将不同盘下的目录作为真正的存放数据的路径。 就解决了多盘利用, 单盘被打满的问题/。
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: 后端得到的过期的应答
我们使用 shared dic必须要用OpenResty 由nginx核心加上很多第三方的模块。默认集成 Lua 开发环境。