高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式
通过《高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景》一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率是相当高的。那么:
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的提示)
然后我们来编辑配置文件吧。如下:
- 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,可能不予显示,我想着也不是你所希望看到的。
那我们把它改成都是200,是不是很好呢?
- error_page 404 =200 @fallback;
非也,这样404传递到fallback处理请求后的状态如果不是200,就很不一致了,会引起更多问题。所以应该如下配置:
- error_page 404 = @fallback;
这样fallback的处理结果状态是什么,就用什么替换404。
(2)Nginx内部的Memcached模块
如果你想使用Nginx内部的Memcached模块,配置文件可以结合参考上面的示例和《高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景》
高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式的更多相关文章
- 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令
1. error_log 含义:指定存储错误日志的文件 语法:error_log <file> [debug|info|notice|warn|error|crit] 缺省:${prefi ...
- 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景
一.应用场景1 最近在一个项目中,用到了Nginx的Memcached模块,所以就在这个系列教程中提前把Memcached模块拿出来写了.另外发现最近我的 博客文章频频被很多用采集器的网站拿走,帮我发 ...
- 高性能Web服务器Nginx的配置与部署研究(2)Nginx入门级配置与部署及“Hello World”
1. Nginx 程序包 目前最新的开发版本时1.1.12: Linux/Unix:nginx-1.1.12.tar.gz Windows:nginx-1.1.12.zip 我们可以下载稳定版尝试: ...
- 高性能Web服务器Nginx的配置与部署研究(1)Nginx简介及入门示例
概述 从这篇博文起,将带领读者们一起领略Nginx的强大. Nginx 是做什么用的?我相信很多朋友都已经使用过,如果你没有,那么你一定知道以下这些名称之一:Apache,Lighttpd,Tomca ...
- 高性能Web服务器Nginx的配置与部署研究(4)Nginx常用命令
1. 启动 Nginx poechant@ubuntu:sudo ./sbin/nginx 2. 停止 Nginx poechant@ubuntu:sudo ./sbin/nginx -s stop ...
- 高性能Web服务器Nginx的配置与部署研究(12)应用模块之Memcached做文件缓存时压缩引起的问题
在上一篇文章中,提到的Nginx的Memcached模块应用场景,主要是作为文件缓存.然后就发现了一个问题,当以字节数组方式缓存较大的文件时,缓存数据会被压缩,从而在读取的时候出现问题. (本文欢迎转 ...
- 高性能Web服务器Nginx的配置与部署研究系列(1)-- 入门 hello work
简介: Nginx 是一个基于 BSD-like 协议.开源.高性能.轻量级的HTTP服务器.反向代理服务器以及电子邮件(SMTP.POP3.IMAP)服务器.Nginx 是由一个俄罗斯的名叫“Igo ...
- 高性能Web服务器Nginx的配置与部署研究(3)Nginx请求处理机制
1. 处理什么样的请求 处理访问到 Nginx 所在 IP 地址的请求,并且这些请求的 HTTP 头信息中的 Host 为所要处理的域名(如下以80端口为例),如下几个 server 就对应响应的请求 ...
- 高性能Web服务器Nginx的配置与部署研究(15)Upstream负载均衡模块
Nginx 的 HttpUpstreamModule 提供对后端(backend)服务器的简单负载均衡.一个最简单的 upstream 写法如下: server backend1.example.co ...
随机推荐
- java 乐观锁CAS
乐观锁是一种思想,本身代码里并没有lock或synchronized关键字进行修饰.而是采用一种version. 即先从数据库中查询一条记录得到version值,在更新这条记录时在where条件中对这 ...
- caddy server 默认https && http2的验证
1. 下载 https://caddyserver.com/ 注意选择应该包含的模块,此次包含了git 插件 2. 配置 使用 Caddyfile 内容如下: ro ...
- js中对数字进行正则判断
<script type="text/javascript"> function SubmitCk(num) { var reg = /^([a-zA-Z0-9]+[_ ...
- 一个简单的selenium实例(一)
1.selenium RC+Eclipse下载安装 java环境 官网下载地址http://www.oracle.com/technetwork/java/javase/downloads/index ...
- getpwuid()
getpwuid函数是通过用户的uid查找用户的passwd数据.如果出错时,它们都返回一个空指针并设置errno的值,用户可以根据perror函数查看出错的信息. 外文名 getpwuid() 头文 ...
- 将 .NET 任务作为 WinRT 异步操作公开
转自:http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/06/22/net-winrt.aspx 在博文深入探究 Await 和 WinRT ...
- Histogram
folly/Histogram.h Classes Histogram Histogram.h defines a simple histogram class, templated on the t ...
- Druid.io系列(二):基本概念与架构
原文链接: https://blog.csdn.net/njpjsoftdev/article/details/52955788 在介绍Druid架构之前,我们先结合有关OLAP的基本原理来理解Dr ...
- sqlldr并发
sage: SQLLDR keyword=value [,keyword=value,...] 部分关键字: userid -- ORACLE username/password c ...
- 关于linux网络基础记录
1.linux操作系统是一套非常稳定的操作系统,作用永不止于提供网络服务那么简单.(www.Mail.FTP.DNS.DHCP.NAT.Router) 2.对于一个服务器而言,“搭建容易维护难”:维护 ...