在nginx中为了提升性能和加速访问,nginx提供了缓存的功能,其缓存是以文件系统上的分层数据存储的形式实现的。缓存Key是可配置的,并且可以使用不同的请求特定参数来控制进入缓存的内容。缓存Key和缓存元数据存储在共享内存段中,缓存加载器、缓存管理器和Worker进程可以访问它们。目前,除了操作系统的虚拟文件系统机制所暗示的优化之外,没有任何内存中的文件缓存。每个缓存的响应都放在文件系统上的不同文件中。通过nginx配置指令控制指定层次结构(级别和命名细节)。接下来我们看下nginx的缓存保存过程:
1.当nginx从上游服务器读取响应时,首先将内容写入缓存目录结构之外的临时文件。
2.当nginx完成处理请求时,它会重命名临时文件并将其移动到缓存目录。如果用于代理的临时文件目录位于另一个文件系统上,则文件将被复制,因此建议将临时目录和缓存目录保留在同一个文件系统上。
3.当需要显式清除文件时,从缓存目录结构中删除文件也是非常安全的。
在Nginx中针对fastcgi、http_proxy、scgi、ssl_session、ngx_http_uwsgi_module模块提供了通用的缓存功能,它能够将后台服务返回的数据进行缓存,再次访问时,无需从后台服务拿取结果,直接在nginx本地获取即可。我们以http_proxy为例,它有以下一些缓存配置,其他模块也是类似的:
指令 | 作用 | 默认值 |
proxy_cache_path | 定义缓存的路径和缓存空间名、大小等配置,缓存数据存储在 文件中。缓存中的文件名是将MD5功能应用于缓存键的结果。 | - |
proxy_cache | 启用缓存,指定的用于缓存的缓存空间名,不同地方可以启用同一个空间名。 | - |
proxy_cache_valid | 设置不同响应代码的缓存时间 | - |
proxy_cache_key | 定义缓存的Key | $scheme$proxy_host$request_uri; |
proxy_cache_purge | 定义将请求视为缓存清除请求的条件。如果字符串参数的至少一个值不为空且不等于“0”,则移除具有相应高速缓存键的高速缓存条目 。通过返回204(无内容)响应来指示成功操作的结果。 | - |
在nginx中有3种方式进行缓存的清理:
1.通过在proxy_cache_path指令的被动缓存管理:
max_size
指定缓存大小,缓存管理进程监控缓存是否超过指定值,超过该大小则通过LRU算法来淘汰数据。一次迭代删除的数据通过下面的参数来指定。
manager_files
一次迭代过程中删除的项的数量,默认100个。
manager_threshold
一次迭代操作的持续时间限制,默认200毫秒。
manager_sleep
两次迭代的间隔时间,默认50毫秒。
2.通过nginx的商业功能来实现主动缓存的清理:
purger
on开启缓存清除进程,遍历所有缓存条目并删除匹配到的键的缓存数据
purger_files
一次迭代过程中扫描的项的数量,默认10个
purger_threshold
一次迭代的持续时间,默认50毫秒
purger_sleep
两次迭代的间隔时间,默认50毫秒。
以上参数与proxy_cache_purge指令配合进行。
安装:
wget https:///FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
mv 2.3.tar.gz ngx_cache_purge-2.3.tar.gz
tar -xvzf ngx_cache_purge-2.3.tar.gz
sudo rm -rf /usr/local/nginx
cd /usr/local/nginx-1.16.0
sudo ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--pid-path=/usr/local/nginx/pid/nginx.pid \
--with-http_ssl_module \
--with-openssl=/home/wesley/openssl-OpenSSL_1_0_2k \
--add-module=/home/wesley/echo-nginx-module-0.61 \
--with-http_stub_status_module \
--add-module=/home/wesley/ngx_cache_purge-2.3
sudo make
sudo make install
配置:
#proxy_cache_path可以配置多个
#设置Web缓存区名称为cache1,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为10GB。levels=1:2 表示缓存目录的第一级目录是1个字符,第二级目录是2个字符,即/app/proxy_cache_dir/cache1/a/1b这种形式
proxy_cache_path /app/proxy_cache_dir levels=1:2 keys_zone=cache1:200m inactive=1d max_size=10g;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location ~ /purge(/.*) {
#设置只允许指定的IP来清除缓存
allow 127.0.0.1;
allow 192.168.116.0/24
deny all;
# 这些$host$1$is_args$args变量可以在http://nginx.org/en/docs/varindex.html查看
proxy_cache_purge cache1 $host$1$is_args$args;
}
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
#设置传递给上游服务的请求头,Host为客户端host,默认为$proxy_host
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
# 如果缓存中没找到,再去请求后端服务器
proxy_pass http://127.0.0.1:8080;
# 设置资源缓存的zone
proxy_cache cache1;
# 设置缓存的key,以域名、URI、参数组合成Web缓存的Key值,
# Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
# 对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 12h;
# 缓存时间
expires 7d;
}
}
在nginx中可以通过proxy_cache_path中以下参数来调整加载缓存:
Nginx启动一分钟后,缓存加载进程被激活,存储在文件系统上先前缓存的数据将被加载到缓存区中,整个加载是在迭代中完成的。一次加载:
loader_files
一次迭代加载不超过指定数目的项,默认100。
loader_threshold
一次迭代操作的持续时间限制,默认200毫秒。
loader_sleep
两次迭代的间隔时间,默认50毫秒。