柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

nginx系列(四)nginx做缓存服务器

一、nginx缓存介绍

1.1 web缓存?

Web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输出内容给客户端,而不是向源服务器再次发送请求。Web缓存降低了内容源Web服务器、数据库的负载,减少了网络延迟,提高了用户访问的响应速度,增强了用户体验。

Web缓存服务器最著名的是squid cache,作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度。我之前的公司用的就是squid 。nginx也早已经实现了cache功能。

1.2 nginx的cache

nginx从0.7.48版开始,支持了类似squid的缓存功能。这个缓存是把URL及相关组合当做Key,用md5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录内。它可以支持任意URL链接,同时也支持404/301/302这样的非200状态码。并且可以通过第三方的ngx_cache_purge模块,用来清除指定URL的缓存。

在性能上,nginx对多核CPU的利用,胜过squid很多。另外在反向代理、负载均衡、健康检查、后端服务器故障转移、重写、易用性上,nginx也比squid强大很多。

nginx的web缓存服务主要由proxy_cache相关指令集和fastcgi相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。

1.3 nginx的cache指令介绍

proxy_cache指令:

语法:proxy_cache zone_name;

默认值:None

使用环境:http,server,location

该指令用于设置哪个缓存区将被使用,zoen_name的值为proxy_cache_path指令创建的缓存区名称。

proxy_cache_path 指令:

语法:proxy_cache_path path [levels=number] keys_zone_name:zone_size [inactive=time] [max_size=size];

默认值: None

使用环境:http

该指令用于设置缓存文件的存放路径。示例如下:

proxy_cache_path  proxy_cache  levels=1:1:2   keys_zone=cache_images:1800m inactive=30d max_size=20g;

#存放在nginx目录下的proxy_cache目录,levels(缓存目录结构)是三层目录结构,第一层目录结构是1个字母、第二层目录还是1个字母、第三层目录是2个字母,keys_zone(指定缓存池名字)名称为cache_images,后面跟的是内存缓冲区的大小是1800MB(设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的拷贝放入内存可以使NGINX在不检索磁盘的情况下快速决定一个请求是`HIT`还是`MISS`,这样大大提高了检索速度。一个1MB的内存空间可以存储大约8000个key),inactive=30d表示缓存数据在30天内没有被访问将被删除该参数默认值为10分钟(指定了项目在不被访问的情况下能够在内存中保持的时间),max_size=20g是指硬盘缓存空间为30G、默认情况下经访问的文件常将被放到内存中进行缓存,而在内存缓存空间不足时,Nginx会将不经常访问的数据从内存写到磁盘(如果不指定具体值,那就是允许缓存不断增长,占用所有可用的磁盘空间。当缓存达到这个上线,处理器便调用cache manager来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下。)。

proxy_cache_methods指令:

语法:proxy_cache_methods [GET HEAD POST];

默认值: proxy_cache_methods GET HEAD;

使用环境:http,server,location

该指令用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法,不缓存HTTP POST方法。

proxy_cache_min_user指令:

语法:proxy_cache_min_uses the_number;

默认值:proxy_cache_min_uses 1;

使用环境:http,sertver,location

该指令用于设置缓存的最小使用次数,默认值为1.

proxy_cache_valid指令:

语法:proxy_cache_valid reply_code [reply_code...] time;

默认值:none

使用环境:http,server,location

该指令用于对不同返回状态码的URL设置不同的缓存时间,例如:

proxy_cache_valid 404 301 302 10s;
proxy_cache_valid 200 206 10d;

proxy_cache_valid any 30s;

# 404 301 302 状态的URL缓存10秒钟

# 200 206状态的URL缓存10天

# 对于没有单独设置的状态码,全部设置缓存时间为30秒。

proxy_cache_key指令:

语法:proxy_cache_key line;

默认值:None

使用环境:http,server,location

该指令用来设置Web缓存的Key值,nginx根据Key值md5哈希存储缓存。一般根据$host(域名)、$request_uri(请求的路径)等变量组合成proxy_cache_key。例如:

proxy_cache_key $host$uri$is_args$args;

博文来自:www.51niux.com

二、nginx缓存示例介绍

2.1 基本示例

http {
     ... 
     proxy_temp_path   /data/proxy_temp;  #这个临时目录跟下面指定的目录要在同一级目录下
     proxy_cache_path  /data/proxy_cache  levels=1:2   keys_zone=cache_images:1800m inactive=30d max_size=20g;
      #上面定义了cache的目录为/data/proxy_cache,缓存目录为第一级1个字符第二级两个字符,zone的名称为cache_images,分配内存大小为1800MB,这个zone的缓存文件如果30天内没有被访问文件就会被cache manager进程删除掉,zone的磁盘容量为20GB。
     proxy_cache_valid 404 301 302 10s;  #设置状态码是404,301,302的响应缓存时间为10秒钟
     proxy_cache_valid 200 206 10d;   #设置状态码是200或者206的响应缓存时间是10天(资源缓存到本地磁盘的时间),当然如果静态文件不会更改的话缓存时间会更长。
     proxy_cache_valid 504 60s;   
     proxy_cache_valid 502 60s;
     proxy_cache_valid 500 60s;
     proxy_cache_valid any 60s;   #这里是除上述状态码以外的所有响应缓存时间是60秒。
      #这里主要是在日志里面加入了$upstream_cache_status来表示资源缓存的状态,有HIT(命中) MISS(未命中) EXPIRED(过期)三种状态
     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr" "$upstream_cache_status"';     
     ...
     server_names_hash_bucket_size 128;
     client_header_buffer_size 32k;
     large_client_header_buffers 4 32k;
        upstream backend_image {
               server 192.168.1.107:80;
               server 192.168.1.108:80;
               keepalive 32;
          }
      server {
           listen 80;
           server_name  192.168.1.103;
           location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            proxy_pass http://backend_image;
            valid_referers none blocked  *.baidu.com$;
            if ($invalid_referer) {
                 return 403;
                 }
           proxy_cache cache_images;  #设置资源缓存的zone
           proxy_cache_key $host$uri$is_args$args; #设置缓存的key。nginx根据key值md5哈希存储缓存,这里根据“域名、URI、参数”组合成key。
           expires 30d; 
            #add_header X-Cache   $upstream_cache_status;
      }

#levels=1:2 一般都得整多级目录,有好处,你像我们就是单挂的200G的SSD,限制的是180G,/data/proxy_cache目录基本长期保持再180G状态,如果你想多存点东西资源呢,可以多挂几块盘,软连接或者挂载什么的把多级目录搞几个挂在别的硬盘上面去,这样你的限制目录大小就可以调大了。当然这也跟需求有关系,我就想让它经常清理,我的缓存目录就想存一些新的实时被访问到的数据,那么也就不用挂载多块盘了。而且我们200,206状态的缓存时间一般都比较长,会缓存几个月,也是跟业务有关系的,我们主要偏浏览,图片啊视频啊基本很少变动,一般都是新增。

在前端Ctrl+f5刷新页面:

查看下日志会发现就第一次调用的时候是MISS,然后跑到后端都去192.168.1.107调用资源了,剩下的都是直接HIT命中直接就返回数据了没有再去后端调用数据。

192.168.1.114 - - [26/Jun/2017:17:34:34 +0800] "GET /images/4.jpg HTTP/1.1" 200 72851 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "192.168.1.107:80" "MISS"
192.168.1.114 - - [26/Jun/2017:17:34:37 +0800] "GET /images/4.jpg HTTP/1.1" 200 72851 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "HIT"
192.168.1.114 - - [26/Jun/2017:17:34:37 +0800] "GET /images/4.jpg HTTP/1.1" 200 72851 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "HIT"
192.168.1.114 - - [26/Jun/2017:17:34:38 +0800] "GET /images/4.jpg HTTP/1.1" 200 72851 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "HIT"

下面是资源过期之后再次调用的日志信息(文件如果过期了回去后端服务器重新获取然后再更新本地缓存,然后就继续本地提供此资源的访问不会再去后端调用此资源):

192.168.1.114 - - [28/Jun/2017:09:48:52 +0800] "GET /images/1.jpg HTTP/1.1" 200 346212 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "192.168.1.108:80" "EXPIRED"
192.168.1.114 - - [28/Jun/2017:09:49:06 +0800] "GET /images/1.jpg HTTP/1.1" 200 346212 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "HIT"
192.168.1.114 - - [28/Jun/2017:09:49:07 +0800] "GET /images/1.jpg HTTP/1.1" 200 346212 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "HIT"
192.168.1.114 - - [28/Jun/2017:09:49:08 +0800] "GET /images/1.jpg HTTP/1.1" 200 346212 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "HIT"

另外(在location中添加下面的配置):

add_header 'Access-Control-Allow-Origin' '*';    #任何域都可以访问我的资源.
add_header 'Access-Control-Allow-Credentials' 'true';  #设置响应头,如果服务端不设置响应头,响应会被忽略不可用。
add_header 'Access-Control-Allow-Methods' 'GET';   #只允许GET请求

现在Html5开始流行,Access-Control-Allow-Origin 是html5 添加的新功能,用来解决跨域问题。

A.abc.com 发起一个到 abc.com/B 的ajax请求,也会有跨域的问题。之所以会有跨域问题,实则是因为www.abc.com其实同A.abc.com一样,也是一个二级域名,而非一级域名(一级域名是http://abc.com)。

同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。
1.协议相同
2.域名相同
3.端口相同
不同源的网页之间,是无法互相访问cookie、LocalStorage、indexDB的。大家经常说的跨域访问,CORS是一个W3C标准,全称是"跨域资源共享"。跨域访问时,如果客户端发送非简单请求,客户端会首先发送一个option预请求,检查服务端是否支持跨域访问。

博文来自:www.51niux.com

2.2 proxy_cache与purge清理缓存

好了我们上面已经将nginx的cache功能实现出来了,但是有一个问题,如果后端内容发生了变化呢,这时候你前端的nginx_cache的资源还未到过期时间,一访问url,发现本地有资源就还未过期根本就不会去后端去请求了。那么返回给用户的还是旧的资源,显然这不是我们希望的。只有当后端资源发送了变化,然后让nginx的cache里面的资源失效或者删除当用户发起请求时,再去后端同步一次才能解决这个问题。

第一种方法是将缓存时间调低一点不要那么大了,但是大部分的静态资源是很少变动了,你调低了就会频繁的去后端去请求资源,显然不能这么干。

第二种方法就是用purge模块来主动清理缓存。

安装Purge模块:

#wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3
#unzip 2.3.zip
#/usr/local/nginx/sbin/nginx -V  #查看一下nginx编译时候的参数,在后面加上Purge模块的安装,如下面:

#./configure --prefix=/usr/local/nginx/ --with-http_stub_status_module --with-http_ssl_module --with-pcre --add-module=../ngx_cache_purge-2.3
# make && make install

配置nginx配置文件:

location ~ /purge/(.*) {      #只允许某些IP网段或者IP能访问
                allow 127.0.0.1;
                allow 192.168.1.0/24;
                allow 192.168.2.114;
                deny all;
                 proxy_cache_purge    cache_images $host$1$is_args$args;
}

重启nginx服务查看进程:

#重启nginx服务,然后查看进程发现下面多了两个cache管理进程

图片.png

访问一个url查看下缓存的静态文件:

http://192.168.1.103/images/1.jpg   #访问一个url下面就是生产的缓存文件,也只有头部几段可以看

图片.png

# ls -lh /data/proxy_cache/b/44/9db75a1cdefae3dc92a4829be7ca544b  #此静态文件要比请求的资源稍大因为里面有些上图中看到的信息。
-rw------- 1 www www 339K 6月  28 11:06 /data/proxy_cache/b/44/9db75a1cdefae3dc92a4829be7ca544b
图片.png

现在我们将后端的1.jpg图片换成其他的图片,然后你在浏览器各种ctrl+f5刷新的话会发现图片没有发生变化,因为你这个url还没有过期,而nginx_cache本地的静态资源文件也在,所以不会去后端进行文件同步。

在浏览器输入url:http://192.168.1.103/purge/images/1.jpg  (主要是在原来的链接前面加了/purge/)

图片.png

#上面如果出现这个界面说明清理成功。下面查下后面的日志:

192.168.1.114 - - [28/Jun/2017:12:01:47 +0800] "GET /purge/images/1.jpg HTTP/1.1" 200 282 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "-"

查看下上面我们看的那个静态文件是否还存在(从下图中可以看出hash静态文件也已经删除掉了。):

图片.png

再次刷新之前测试的url发现页面已经发生了变化:

图片.png

再次查看nginx_cache这台机器的日志(第一次是MISS第二次是HIT):

192.168.1.114 - - [28/Jun/2017:12:04:25 +0800] "GET /images/1.jpg HTTP/1.1" 200 95179 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "192.168.1.108:80" "MISS"
192.168.1.114 - - [28/Jun/2017:12:06:09 +0800] "GET /images/1.jpg HTTP/1.1" 200 95179 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "HIT"

#从上面可以看出purge 在清理缓存的时候,是将缓存的key和缓存目录中的静态文件一并删除掉。

2.3 proxy_store缓存

proxy_store是nginx缓存的另一种方式,类似于镜像的形式。是一种传统的缓存方式,将缓存文件拉取到本地永久保存,所以这种形式不能定义图片的自动过期时间。

下面是配置示例:

http {
   ...
   upstream backend_image {
               server 192.168.1.107:80;
               server 192.168.1.108:80;
               keepalive 32;
     }
   server {
     ...
      location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
                root /data/proxy_store/51niux_images/;
                error_page 404 = @not_found;   #如果是404我们传统的是返回一个错误页面,或者返回一个url,这里呢我们来如果是404就返回一个location。
     ...
     }  
     location @not_found {
                  proxy_set_header   Host    admin.51niux.com;
                  rewrite    /(.*)  /images/$1 break;         #将所有的图片请求都重写到后端服务器的域名/images/目录下面。
                  proxy_store /data/proxy_store/51niux_images/$1;   #然后再将图片写到本地的/data/proxy_store/51niux_images/目录下面。
                  proxy_pass  http://backend_image;          #然后将请求转发到后端服务器 
           }
   ...
}

然后我们用浏览器访问一个url然后再多次强制刷新网页查看nginx_cache的日志:

# ls -lh /data/proxy_store/51niux_images/5.jpg   #文件本地也刚刚从后端copy了一份到本地目录下面。
-rw------- 1 www www 81K 6月  29 2017 /data/proxy_store/51niux_images/5.jpg

192.168.1.114 - - [29/Jun/2017:11:38:27 +0800] "GET /5.jpg HTTP/1.1" 200 82938 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "192.168.1.108:80" "-"
192.168.1.114 - - [29/Jun/2017:11:38:30 +0800] "GET /5.jpg HTTP/1.1" 200 82938 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "-"
192.168.1.114 - - [29/Jun/2017:11:38:30 +0800] "GET /5.jpg HTTP/1.1" 200 82938 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "-"
192.168.1.114 - - [29/Jun/2017:11:38:30 +0800] "GET /5.jpg HTTP/1.1" 200 82938 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "-"
192.168.1.114 - - [29/Jun/2017:11:38:30 +0800] "GET /5.jpg HTTP/1.1" 200 82938 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "-"

#从日志可以看出,我们除了第一次本地没有这个资源要去后端去调用一下以外,以后再有请求都会直接返回结果不会再去后端去调用。

关于404错误的小测:

404优化页面这也是我们常用的一个功能,肯定不能返回默认的404,那是很影响用户体验的,所以我们都会不同的错误,做一些好看点的提示页面。

测试过程分拣单,分别在proxy_store所在的服务器的location @not_found的最后一行添加上error_page  404              /404.html;然后在后端的nginx同样开启这个页面功能。

然后分别在404.html写入不同的内容标识作为区分,然后重新加载nginx配置文件,用浏览器故意访问一个不存在的url。

结果是:如果nginx_store和后端的nginx服务器都同时开启了err_page 404跳转某个页面的功能,那么优先是返回nginx_store的404页面,如果只有后端nginx服务器开启了err_page页面跳转,那么返回的是后端的404页面。

博文来自:www.51niux.com

2.4 proxy_store+lua缓存清理缓存

nginx搭配lua这已经在生产上面跑了很多年了,大家也都有接触。Lua是一个可以嵌入到Nginx配置文件中的动态脚本语言,从而可以在Nginx请求处理的任何阶段执行各种Lua代码,提升nginx的性能和处理很多需求。nginx lua模块淘宝开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力.

下面是写的挺好的三篇入门级的文章:

https://my.oschina.net/leejun2005/blog/494248

http://blog.csdn.net/ygm_linux/article/details/53534917

http://outofmemory.cn/code-snippet/14396/nginx-and-lua

另外一些第三方模块都可以去此查找:https://www.nginx.com/resources/wiki/modules/

LuaJIT的安装

首页:http://luajit.org/

# wget luajit.org/download/LuaJIT-2.0.4.tar.gz

#tar zxf LuaJIT-2.0.4.tar.gz
#cd LuaJIT-2.0.4

#make PREFIX=/usr/local/luajit

#make install PREFIX=/usr/local/luajit

下载nginx lua模块

# cd ..

#wget https://github.com/openresty/lua-nginx-module/archive/v0.10.8.zip    #因为nginx的版本比较新,所以对应的模块也要新一点不然的话可能会报错缺少东西。

#unzip v0.10.8.zip

nginx加载lua模块

# cd  ../nginx-1.10.3

#export LUAJIT_LIB=/usr/local/lib   #这里和下面那句就是导入环境变量告诉nginx去哪里找luajit
#export LUAJIT_INC=/usr/local/include/luajit-2.0

#./configure --prefix=/usr/local/nginx/ --with-http_stub_status_module --with-http_ssl_module --with-pcre --add-module=../ngx_cache_purge-2.3  --add-module=../lua-nginx-module-0.10.8/
# make -j 2 && make install

#ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2  #做这个软连接是为了避免启动nginx的时候报下面的错误

/usr/local/nginx/sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

nginx lua配置并测试

nginx的配置:

location ~* ^/lua(/.*) {
      default_type 'text/plain';
      content_by_lua 'ngx.say("hello, the lua is ok!")';  
}

然后nginx一定要重启服务而不是重新加载配置文件,因为你是又重新加载了一个lua模块,得重启服务让其生效。

如浏览器访问:http://192.168.1.103/lua/test

图片.png

现在我们查下日志看是什么?

192.168.1.114 - - [29/Jun/2017:15:20:34 +0800] "GET /lua/test HTTP/1.1" 200 33 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "-"

  proxy_store利用lua实现purge的功能

上面已经说了proxy_store是永久的把资源保留在本地,而这就存在一个问题了,如果后端的资源如图片发了变化,但是用户访问proxy_store,它会首先查看本地有没有资源,如果没有才会去向后端服务器去请求资源。所以如果后端的资源如何发生了变化,也让proxy_store发生更改了,而不是保留旧的错误的资源呢。那就只能在后端服务器的资源发生更改的时候,在proxy_store上面把此资源删除掉,然后再有访问,它本地没有资源是404,就会去后端去同步资源了。当然如果我们如果图片发生了更改,如1.jpg发生了更改,可以主动告诉proxy_store我1.jpg发生了更改,然后就让proxy_store将本地的1.jpg文件删除掉,或者更省事的办法就是多长时间之后将一个目录删除掉,然后再有请求就回源,这种方式当然是延时性比较大了。记得几年前用CDN的时候,那时候还是如果资源有变动(当然像图片视频这种资源变动的情况真的不多),人家给你提供个后台可以主动的提交哪些链接或者目录有变动,这就是一种让用户主动提交然后较实时的一种方式。当然现在更多的是通过程序来实现这种功能。当然现在更多的是通过程序来实现,CDN那边给你提供一个api,然后客户这边有程序来做哪些资源发送了变化,然后将资源的变动提交给api。

这里就简单的举例一个purge的功能,说白了就是删除白,而我们proxy_store就是将图片放到本地,那就通过访问url来删除图片就行了。

 location ~ /purge/ {
                    set $cache_home /data/proxy_store/51niux_images/;   #设置设置变量cache_home为/data/proxy_store/51niux_images/
                    content_by_lua '                                           #内容处理器,接收请求处理并输出响应
                       local file = string.match(ngx.var.uri,"^/purge/(%S+)")  #将本地文件的名字通过url过来出来
                       path = ngx.var.cache_home                               #path为变量然后将文件所在的路径传值给他
                       os.remove(path..file)                                   #删除文件括号里面是文件所在系统的全路径
                       ngx.say(path..file)                                     #然后输出一下文件的全路径
                     ';
             }

然后就可以像proxy_cache一样,在浏览器上面通过输入url来删除旧资源了:

加入我们接到了通知有两个后台资源发送了变化,url分别为:

http://192.168.1.103/purge/5.jpg

http://192.168.1.103/purge/test1/7.jpg

然后我们在浏览器分别访问者两个url:

图片.png

然后再看下日志:

192.168.1.114 - - [29/Jun/2017:15:46:33 +0800] "GET /purge/5.jpg HTTP/1.1" 200 49 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)" - "-" "-"
192.168.1.114 - - [29/Jun/2017:15:53:10 +0800] "GET /purge/test1/7.jpg HTTP/1.1" 200 55 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0" - "-" "-"

然后再去proxy_store所在的系统上面查看一下,两个目录下面对应的资源已经被删除了。这样再有客户发起这两个url的请求,就会回源,返回给客户的也是新的资源了。

注(当然如果lua语句少可以直接通过content_by_lua 将语句写到nginx的配置文件里面):

但是正规的大范围的使用lua的话,一般都会将lua语句写到文件里面,然后通过content_by_lua_file语句来调用,如下面的例子:

location /user/online/UserList.htm {  #当访问用户在线列表的时候
            content_by_lua_file conf/onlineuserlist.lua;   #会调用nginx安装目录的conf目录下的onlineuserlist.lua文件来返回结果
        }

#上面就是一个关于用户在线列表的统计lua,当然像这种统计类的,在里面都会定义一些共享内存空间供使用,如:lua_shared_dict user_cache 20m; #定义一个20MB的内存空间供程序使用存放一些数据。通过该命令定义的共享内存对象对于Nginx中所有worker进程都是可见的,当Nginx通过reload命令重启时,共享内存字典项会从新获取它的内容,当Nginx退出时,字典项的值将会丢失。

2.5 fastcgi_cache

fastcgi_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。fastcgi_cache缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力。

这个功能用的比较少就不记录了,这个一搜介绍很多的。

基础的介绍:http://yujianglei.blog.51cto.com/7215578/1565576

注意项介绍:http://www.cnxct.com/several-reminder-in-nginx-fastcgi_cache-and-php-session_cache_limiter/
 

作者:忙碌的柴少 分类:Web环境搭建 浏览:3584 评论:0
留言列表
发表评论
来宾的头像