nginx性能优化-----缓存(四)

在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指令配合进行。

3.缓存第三方主动清除模块ngx_cache_purge ,按照ip进行清除

安装:

wget https://github.com/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; 
        }
}

验证:

访问缓存URL,假如这里有一个图片缓存

http://hostname/test/n.jpg

查看缓存的文件,修改数据

不清除缓存访问,不发生变化,走的缓存

http://hostname/test/n.jpg

清除缓存再次访问,发生变化,缓存已清空

http://hostname/purge/test/n.jpg

http://hostname/test/n.jpg

在nginx中可以通过proxy_cache_path中以下参数来调整加载缓存:

Nginx启动一分钟后,缓存加载进程被激活,存储在文件系统上先前缓存的数据将被加载到缓存区中,整个加载是在迭代中完成的。一次加载:

   loader_files
      一次迭代加载不超过指定数目的项,默认100。

   loader_threshold

      一次迭代操作的持续时间限制,默认200毫秒。

   loader_sleep

      两次迭代的间隔时间,默认50毫秒。

你可能感兴趣的:(nginx,nginx,nginx缓存)