高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式...

本文来自:CSDN博客专栏《Nginx高性能Web服务器》Poechant技术博客,转载请注明出处。

通过高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率是相当高的。那么:


(转载请注明来自Poechant的CSDN博客:http://blog.csdn.net/poechant/article/details/7179891


1. 如果不命中呢?


我们可以到相应的数据服务器上读取数据,然后将它缓存到Nginx服务器上,然后再将该数据返回给客户端。这样,对于该资源,只有穿透Memcached的第一次请求是需要到数据服务器读取的,之后在缓存过期时间之内的所有请求,都是读取Nginx本地的。不过Nginx的proxy_cache是本地硬盘缓存,效率要远低于Memcached。


2. 应该如何安装和配置呢?


(1)HttpMemcModule模块

如果使用Nginx的非核心模块——HttpMemcModule模块,则可以下载模块:

http://github.com/agentzh/memc-nginx-module/tags


michael@dev-machine:~$ tar -zxvf agentzh-memc-nginx-module-a0bc33a.tar.gz michael@dev-machine:~$ tar -zxvf nginx-1.1.12.tar.gz michael@dev-machine:~$ cd nginx-1.1.12 michael@dev-machine:~$ ./configure --add-module=/home/michael/agentzh-memc-nginx-module-a0bc33a michael@dev-machine:~$ sudo make michael@dev-machine:~$ sudo make install
目前 验证发现Nginx 1.0.10版本Nginx的1.1.3及其之前的版本,需要额外通过--add-module来加载upstream-keepalive模块,请自行google之。 其他版本还不确定,猜测是在1.1 从nginx的1.1.4及其之后的版本开始,自动携带upstream-keeplive模块的。 (感谢agentzh的提示)


(转载请注明来自Poechant的CSDN博客:http://blog.csdn.net/poechant/article/details/7179891


然后我们来编辑配置文件吧。如下:

http { ... upstream data_server { server 192.168.0.133:1234; server 192.168.0.134:1234; server 192.168.0.135:1234; ip_hash; } upstream memc_backend { server 127.0.0.1:11211; } ... server { listen 8080; server_name localhost; default_type text/html; location / { set $memc_cmd get; set $memc_key $uri; memc_pass memc_backend; error_page 404 @fallback; } location @fallback { internal; proxy_pass http://data_server; proxy_cache cache_one; proxy_cache_valid 200 302 1h; proxy_cache_valid 301 1d; proxy_cache_valid any 1m; expires 30d; } } ... }


从上面的配置文件我们可以看出,一个请求到达后,会其uri作为key去Memcached服务器127.0.0.1:11211上查找value,如果没有命中,则返回404。这时通过error_page将404接收转到@fallback,然后去data_server中取文件,取完后将该文件在本地磁盘缓存,同时用户的浏览器也通过expires设置缓存时间。


这样绝大多数请求如果被第一层Memcached的内存缓存拦截的话,剩余的请求可以通过访问第二层Nginx服务器的硬盘缓存文件,来减少穿透。


按照上面的方式,客户端得到的请求响应中虽然包含了正确的文件内容,但状态码都是404(可以通过Fiddler来观察)。这似乎会引起问题。什么问题呢?绝大多数浏览器,即使在404的情况下,也会尝试去读取内容,如果有正确的内容,是可以正确显示的。但是比较常见的可能引起问题的两种情况是:

(a)、搜索引擎的spider爬到的404时,一般不会收录该URL,我想这不是你所希望看到的;

(b)、Flash等方式加载时,如果头是404,可能不予显示,我想着也不是你所希望看到的。


(转载请注明来自Poechant的CSDN博客:http://blog.csdn.net/poechant/article/details/7179891


那我们把它改成都是200,是不是很好呢?

error_page 404 =200 @fallback;


非也,这样404传递到fallback处理请求后的状态如果不是200,就很不一致了,会引起更多问题。所以应该如下配置:

error_page 404 = @fallback;
这样fallback的处理结果状态是什么,就用什么替换404。


(2)Nginx内部的Memcached模块

如果你想使用Nginx内部的Memcached模块,配置文件可以结合参考上面的示例和《高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景》


(转载请注明来自Poechant的CSDN博客:http://blog.csdn.net/poechant/article/details/7179891

本文来自:CSDN博客专栏《Nginx高性能Web服务器》Poechant技术博客,转载请注明出处。

-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值