nginx+memcache实现页面缓存应用
一.前言
nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、django,大大的提升动态页面的速度。nginx只负责从memcached服务器中读取数据,要往memcached写入数据还得需要后台的应用程序来完成,主动的将要缓存的页面缓存到memcached中,可以通过404重定向到后端去处理的。
ngx_http_memcached_module可以操作任何兼用memcached协议的软件。如ttserver、membase等。
结构图如下:

memcached的key可以通过memcached_key变量来设置,如以$uri。如果命中,那么直接输出内容,没有命中就意味着nginx需要从应用程序请求页面。同时,我们还希望该应用程序将键值对写入到memcached,以便下一个请求可以直接从memcached获取。
如果键值不存在,nginx将报告not found错误。最好的方法是使用error_page指定和location请求处理。同时包含"Bad Gateway"错误和"Gateway Timeout"错误,如:error_page 404 502 504 = @app ;。
注意:需要设置default_type,否则可能会显示不正常。
2. 模块指令说明:
memcached_bind
语法: memcached_bind address | off;
默认值: none
配置段: http, server, location
指定从哪个IP来连接memcached服务器
memcached_buffer_size
语法: memcached_buffer_size size;
默认值: 4k|8k;
配置段: http, server, location
读取从memcached服务器接收到响应的缓冲大小。尽快的将响应同步传给客户端。
memcached_connect_timeout
语法:memcached_connect_timeout time;
默认值:60s;
配置段:http, server, location
与memcached服务器建立连接的超时时间。通常不超过75s。
memcached_gzip_flag
语法:memcached_gzip_flag flag;
默认值:none
配置段:http, server, location
测试memcached服务器响应标志。如果设置了,将在响应头部添加了Content-Encoding:gzip。
memcached_next_upstream
语法: memcached_next_upstream error | timeout | invalid_response | not_found | off ...;
默认值: error timeout;
配置段: http, server, location
指定在哪些状态下请求将转发到另外的负载均衡服务器上,仅当memcached_pass有两个或两个以上时使用。
memcached_pass
语法:memcached_pass address:port or socket;
默认值:none
配置段:location, if in location
指定memcached服务器地址。使用变量$memcached_key为key查询值,如果没有相应的值则返回error_page 404。
memcached_read_timeout
语法:memcached_read_timeout time;
默认值:60s;
配置段:http, server, location
定义从memcached服务器读取响应超时时间。
memcached_send_timeout
语法:memcached_send_timeout
默认值:60s
配置段:http, server, location
设置发送请求到memcached服务器的超时时间。
$memcached_key变量:
memcached key的值。
3. nginx memcached的增强版ngx_http_enhanced_memcached_module
基于nginx memcached 模块的,添加的新特性有:
1. 自定义HTTP头,如Content-Type, Last-Modified。
2. hash键可超过250个字符,memcached受限。
3. 通过HTTP请求将数据存储到memcached。
4. 通过HTTP请求从memcached删除数据。
5. 通过HTTP请求清除所有memcached缓存数据。
6. 通过HTTP请求获取memcached状态数据。
7. 键名空间管理,来部分刷新缓存。
8. 缓存通过If-Modified-Since头和内容Last-Modified来回复304Not Modified请求。
4. 应用实例
nginx配置实例:
upstream memcacheds {
server 10.1.240.166:22222;
}
server {
listen 8080;
server_name nm.ttlsa.com;
index index.html index.htm index.php;
root /data/wwwroot/test.ttlsa.com/webroot;
location /images/ {
set $memcached_key $request_uri;
add_header X-mem-key $memcached_key;
memcached_pass memcacheds;
default_type text/html;
error_page 404 502 504 = @app;
}
location @app {
rewrite ^/.* /nm_ttlsa.php?key=$request_uri;
}
location ~ .*\.php?$
{
include fastcgi_params;
fastcgi_pass 127.0.0.1:10081;
fastcgi_index index.php;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
nm_ttlsa.php实例:
addServers($servers); $r=$m->set($_GET['key'],$data);
header('Content-Length: '.filesize($fn)."\r\n");
header('Content-Type: image/gif'."\r\n");
header('X-cache: MISS'."\r\n");
print $data;
}else{
header('Location: http://www.ttlsa.com'."\r\n");
}
5. 测试
第一次访问:(需要经过php处理)

再次访问:(直接从memcached读取)

哈,这个实例并不好。
1. 地球人都知道memcached不是持久化的,如果是永久性的图片应用,选用可以持久化存储方案合适,如riak、membase、ttserver、mongodb GridFS等等。
2. 如果是用户头像的应用,用memcached来做缓存也不合适。因为用户更改头像又得刷新缓存,鉴于此,一步到位的用ttserver或mongodb GridFS来做用户头像的存储岂不是更好么。
ttserver+nginx构建高并发高可用性应用参见:http://www.ttlsa.com/html/1429.html
这个实例改改或许可以用来在线迁移图片到key-value存储的过渡方案。
nginx+memcache实现页面缓存应用的更多相关文章
- 【转】nginx+memcached构建页面缓存应用
如需转载请注明出处: http://www.ttlsa.com/html/2418.html nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的 ...
- nginx负载均衡 页面缓存
nginx的upstream目前支持4种方式的分配 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight ...
- Nginx+Memcache+一致性hash算法 实现页面分布式缓存(转)
网站响应速度优化包括集群架构中很多方面的瓶颈因素,这里所说的将页面静态化.实现分布式高速缓存就是其中的一个很好的解决方案... 1)先来看看Nginx负载均衡 Nginx负载均衡依赖自带的 ngx_h ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...
- Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡 (负载均衡算法:nginx负载算法 up ...
- Nginx反向代理 负载均衡 页面缓存 URL重写及读写分离
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- [转载]Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- Nginx实现页面缓存
页面缓存 1.缓存指令 Nginx的缓存配置比较直观简单,具体有下面几个指令需要知道: A.proxy_cache_path 格式:proxy_cache_path path [levels=numb ...
随机推荐
- EventBus的思路和一些反思
本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws C#本地实现的和Redis Set实现的,实际上都是要维护一个Events和Handle ...
- 腾讯QQ积分CSRF导致积分任意挥霍(我的积分为什么少了)
触发点:http://jifen.qq.com/html5/index.html?ADTAG=JIFEN.MART.INDEX 随意兑换一个商品: 因为刚才我已经兑换过了,所以积分没有了.. 没关系, ...
- ASP.NET程序也能像WinForm程序一样运行[转载]
阅读目录 开始 操作方式 支持的ASP.NET程序类别 它也是个HTTP服务器 支持远程机器访问 不受限于Windows防火墙 尊重每个人的操作习惯 内置多标签浏览器支持 启动参数及配置文件 支持 . ...
- datatable编辑一行数据的方法
let d =t.row($(e).parents("tr")).data(); 上面的是获取一行数据的方法,如果是更改一行数据,则传入根之前数据结构相同的对象或者数组即可: t. ...
- Android开发学习笔记-关于Android的消息推送以及前后台切换
下面是最简单的Android的消息推送的实现方法 package com.example.shownotic; import java.util.Random; import android.supp ...
- selenium+phantomjs渲染网页
from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapa ...
- html5页面平滑切换实现以及问题(20160120更新)
注:本文是基于手机端 Hybrid APP 讨论,而不是普通的PC端网页 >> 之前的页面跳转方式: 比如有这两个页面:A.html B.html, A B 是纯HTML实现,没有采用 ...
- cocos2dx 优化略记
缓存cache: 预加载资源到内存, 可以异步加载. 直接使用sprite:create()来加载资源的话, 有时候会发现, 在第一次运行动作的时候会变的很卡. 那是因为第一次要加载资源到内存 ...
- express安装及使用(windows系统)
npm install express //安装express命令 npm install express-generator -g //Express 应用生成器,通过应用生成器工具 express ...
- 利用Python爆破数据库备份文件
某次测试过程中,发现PHP备份功能代码如下: // 根据时间生成备份文件名 $file_name = 'D' . date('Ymd') . 'T' . date('His'); $sql_file_ ...