在项目中,有些产品介绍类图片、文档会存储到hdfs中,但hdfs的存取速度比较慢,不能满足互联网用户的要求,这里就使用缓存方式,将不经常变化文件缓存到nginx代理服务器,以减少HDFS的读取次数,提高用户访问速度。
缓存技术的基本思想其实是对用户已经访问过的内容在Nginx建立副本,如果在一段时间内(缓存尚未过期)再次访问该数据,则不需要重新发起请求获取数据,可以直接从缓存中读取到该数据,好处在于减少了Nginx与后端服务之间的网络交互,减轻了网络的压力,而且在减少数据传输的延迟时同时可以提升用户访问速度。而且如果碰上后端服务出现异常时,还可以通过缓存进行相应用户请求,提高了后端服务的稳定性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kUtfe4tx-1579162275349)(en-resource://database/2234:1)]
启用代理缓存需要进行两步操作,一是配置缓存通用配置包括路径、目录级别、失效策略等,二是在对应的地址使用缓存。
在http模块下配置对应信息。格式如下:
proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time];
示例代码:
proxy_cache_path /opt/app/cache_test levels=1:2 keys_zone=cache_test:10m inactive=1d max_size=1g;
参数说明:
Nginx启动后,缓存加载程序只进行加载一次,加载时会将缓存的元数据加载到共享内存区域,但是如果一次加载整个缓存全部内容可能会使Nginx刚启动的前几分钟性能消耗严重,大幅度降低Nginx的性能。所以可以在proxy_cache_path命令中配置缓存迭代加载。缓存迭代加载一共可以设置三个参数:
在对应的location节点下启用缓存。参数说明:
示例
location / {
proxy_pass http://slbserver_cache; #通过upstrean定义的服务器组名调用后端服务器
proxy_redirect off ;
proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#跟后端服务器连接超时时间,发起握手等候响应时间
proxy_connect_timeout 300;
#后端服务器回传时间,就是在规定时间内后端服务器必须传完所有数据
proxy_send_timeout 300;
#连接成功后等待后端服务器的响应时间,已经进入后端的排队之中等候处理
proxy_read_timeout 600;
#代理请求缓冲区,会保存用户的头信息以供nginx进行处理
proxy_buffer_size 256k;
#同上,告诉nginx保存单个用几个buffer最大用多少空间
proxy_buffers 4 256k;
#如果系统很忙时候可以申请最大的proxy_buffers
proxy_busy_buffers_size 256k;
#proxy缓存临时文件的大小
proxy_temp_file_write_size 256k;
#如果某台应用服务器出现500,400或者超时情况,直接访问下一台
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
#使用Web缓存区cache_test,proxy_cache_path中设置好的那个名字,关闭参数为off。
proxy_cache cache_test ;
#对不同HTTP状态码缓存设置不同的缓存时间
proxy_cache_valid 200 304 1m ;
#设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存,这里根据"域名,URI,#参数"组合成Key
proxy_cache_key $uri$is_args$args;
}
在location配置中添加:
add_header Nginx-Cache "$upstream_cache_status";
在nginxlog中添加:
log_format combinedio …$upstream_cache_status;
原理:
利用nginx $upstream_cache_status变量,该变量代表缓存命中的状态,状态包括:
在配置完成后,缓存一直显示miss,发现一般有两个原因导致此问题。
当返回信息中Cache-Control
和Set-Cookie
。可以在nginx中通过proxy_ignore_headers设置忽略它们,如:
server {
listen 80;
listen [::]:80;
server_name 镜像服务器主机名;
location / {
......
proxy_ignore_headers Set-Cookie Cache-Control;
proxy_hide_header Cache-Control;
proxy_hide_header Set-Cookie;
......
}
}
需要打开缓存,将proxy_buffering
设置为on。如:
location ~ (^/).*\.(gif|jpg|jpeg|png|js|css|html|cab|bmp)${
......
proxy_buffering on;
......
}
Nginx proxy_cache 缓存配置
Nginx缓存原理及机制
Nginx实战-缓存服务proxy(1)
Nginx作为缓存服务
Nginx的proxy cache MISS问题
解决nginx反向代理缓存不起作用的问题