[code.nginx] Nginx服务器的缓存机制

404错误驱动Web缓存

Nginx服务器的这一种实现Web缓存的原理其实很简单,主要还是依靠自身的Proxy Store功能对404错误进行重定向来实现。当Nginx服务器在处理客户端请求时,发现请求的资源数据不存在,会产生404错误,然后服务器通过捕获该错误,进一步转向后端服务器请求数据,最后将后端服务器的响应数据传回客户端,同时在本地进行缓存。从实现-原理上来看,Nginx服务器向后端服务器发起数据请求并完成Web缓存,主要是由产生的404错误驱动的。
请大家看一个简单的实现404错误驱动Web缓存的配置方案片段:

          ...
          location / {
                   ...
                  root /myweb/server/;
                  error_page 404 =200  /errpage 
         }
         location /errpage/ {
                  ...
                  internal;
                  alias /home/html;
                  proxy_pass http://backend;

                  proxy_set_header  Accept-Encoding  "'';  #后端不返回要锁(gzip/deflate)数据
                  proxy_store on;  #指定Nginx将代理返回的文件保存
                  proxy_store_access user:rw group:rw all:r;  #配置缓存数据的访问权限
                  proxy_temp_path  /myweb/server/tmp;  #配置临时目录,该目录要和/myweb/server/在同一个硬盘分区内
        }

配置将404错误响应进行重定向,然后使用location块捕获重定向请求,向后端服务器发起请求获取响应数据,然后将数据转发给客户端的同时缓存到本地。

资源不存在驱动Web缓存

该方法同“404错误驱动Web缓存”的方法的原理上大同小异,不同之处是,该方法是通过location块的location if条件判断直接驱动Nginx服务器与后端服务器的通信和Web缓存,而后者是对资源不存在引发的404错误进行捕获,进而驱动Nginx服务器与后端服务器的通信和Web缓存。
再看一个简单的通过判断资源不存在的驱动Web缓存的配置方案片段:
···nginx
...#其他配置
location / {
...#其他配置
root /home/html/;
internal;; #配置该为目录不能通过外部链接直接访问
alias /myweb/server/;
proxy_set_header Accept-Encoding "''; #配置后端不反悔要锁(gzip或deflate)数据
proxy_store on; #指定nginx将代理返回的文件保存
proxy_store_access user:w group:rw all:r; #配置缓存数据的访问权限
proxy_temp_path /myweb/server/tmp; #配置临时目录,该目录要和/myweb/server/在同一个硬盘分区内
if(!-f $request_filename) #判断请求资源是否存在
{
proxy_pass http://backend/; #配置后端upstream地址或者源地址
}
}

在配置实例中使用location if条件判断支持的“!-f”判断请求的资源在Nginx服务器上是否存在,如果不存在就通过后端服务器获取数据,然后回传给客户端,同时使用Proxy Store进行缓存。
以上两种缓存机制在原理上是相近的,在实际的应用中,我们通常可以将Proxy Store的缓存目录配置到/dev/shm中提高缓存数据的处理速度。如果不是在内存中保存缓存数据,这两种缓存机制不支持缓存数据的清理机制,缓存文件会一直保存在本地占用硬盘空间。
这两种缓存机制还有需要注意的地方是它们只能缓存200状态吗下的响应数据,这就是为什么我们在介绍“404错误驱动Web缓存”机制时配置实例中将404错误重新改写为200状态的原因。

两种缓存机制也不支持动态链接的请求。比如getsource?id=1和getsource?id=2这两个请求,这两种缓存机制会忽略id=1参数,从而造成返回的资源不正确等问题。这是两种缓存机制的缺点,但在实际应用中也有一定的使用价值。
 
## 基于memcached的缓存机制
memcached是一套高性能的基于分布式的缓存系统,用于动态Web应用以减轻后台服务器的负载。memcached可以处理并发的网络连接。它在内存中开辟一块空间,然后建立一个hash表,将缓存数据通过键/值存储在Hash表中进行管理。memcached由服务端和客户端两个核心组件组成,服务端先通过计算“键”的hash值来确定键/值对所在的服务器所处的位置。当确定键/值对的位置后,客户端就会发送一个查询请求给对应的服务端,让它来查找并返回确切的数据。
在Nginx服务器的标准HTTP模块中有一个ngx_http_memcached_module模块,专门用于处理和memcached相关的配置和功能实现,虽然在目前的版本中还没有支持完整的功能,但是其性能很好,对于一般的应用场景是比较好的选择方案。

## Proxy Cache缓存机制
Proxy Cache机制是Nginx服务器自己实现的类似于Squid的缓存机制,它使用md5算法将请求链接hash后生成文件系统目录保存响应数据。
Nginx服务器在启动后,会生成专门的进程对磁盘上的缓存文件进行扫描,在内存中建立缓存索引,提高访问效率,而且还会生成专门的管理进程对磁盘上的缓存文件进行过期判断,更新等方面的管理。Proxy Cache缓存机制支持对任意链接响应数据的缓存,不仅限于200状态时的数据。
Proxy Cache缓存机制的一个缺陷是,他没有实现自动清理磁盘上缓存数据的功能,因此在长时间使用过程中对服务器存储造成一定的压力。
在下面的配置中,实现了Nginx服务器Proxy Cache缓存机制的一般配置:
```nginx
      ...#其他配置
      http {
            ...#其他配置
            proxy_cache_path  /myweb/server/proxycache  levels=1:2  max_size=2m  inactive=5m
            loader_sleep=1m;  keys_zone=MYPROXYCACHE:10m  #配置了缓存数据存放路径和Proxy Cache使用
            proxy_temp_path  /myweb/server/tmp;  #配置响应数据的临时存放目录
            server {
                    ...... #其他配置
                    proxy_pass http://www.myweb.name/;  #配置使用MYPROXYCACHE这个keys_zone
                    proxy_cache  MYPROXYCACHE;  # 配置200状态和302状态的响应缓存1小时
                    proxy_cache_valid  200 302 1h;  #配置200和302状态的响应缓存1小时
                    proxy_cache_valid  301  1d;  #配置301状态的响应缓存1天
                    proxy_cache_valid  any 1m;  #配置其他状态的响应数据缓存1分钟

            }
      }

在该实例中,我们首先在http块中配置了缓存数据存放路径和Proxy Cache使用的内存Cache空间。缓存数据存放在磁盘上/myweb/server/proxycache目录下,它包含两级hash目录,缓存数据的总量不能超过20MB、如果缓存在5分钟内没有被访问,则强制更新。内存Cache空间的名字为MYPROXYCACHE,大小不能超过10MB,每隔1分钟遍历一次磁盘缓存源数据,更新内存Cache中的缓存索引。
之后,我们在server块中,配置使用上面设置好的MYPROXYCACHE内存空间进行Proxy Cache工作,对不同响应状态的数据缓存时间进行了配置。
Proxy Cache机制是Nginx服务器自身实现的一个功能比较完整、性能也不错的缓存机制,在实际应用过程后者能够使用比较广泛。

Nginx与Squid组合

Squid Cache(简称Squid)是目前在大访问量的网站建设中应用非常广泛的Web缓存服务器。它可以作为网页服务器的前置缓存服务器来缓存相关的请求数据,也可以缓存公网资源为局域网内用户提供共享资源。但是,Squid服务本身不支持在单台服务器同一端口(例如要反向道理Web必须制定80端口)下运行多个进程,这样的话就需要给每一个Squid服务分配一台服务器设备,这样非常浪费资源。
Nginx具有反向代理服务功能,支持服务器组的配置和对组间服务器的轮询,我们可以运用Nginx的这一功能,实现在同一台服务器中运行多个Squid服务的目的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容