专栏首页后端技术探索nginx+memcached构建页面缓存应用

nginx+memcached构建页面缓存应用

一.前言

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来做用户头像的存储岂不是更好么。

本文分享自微信公众号 - nginx(nginx-study)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nginx+memcached构建页面缓存应用

    nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、djang...

    后端技术探索
  • 业务id转密文短链的一种实现思路

    买家通过电商app下单后,会受到一条短信,短信内容中包括改订单详情页面的h5地址连接,因为是出现在短信中,所以对连接有要求:1.尽量短;2.安全性考虑,订单在数...

    后端技术探索
  • 分表查询统计的一个具体案例

    问题描述 mysql数据库在数据量较大的情况下,对数据表进行水平分表,按照年份,如下:

    后端技术探索
  • Linux 安装Memcached

    剑行者
  • PHP 开发学习[2] —— wamp memcache 的安装与扩展(Windows 64)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT
  • memcached的最新状态

    memcached 是由 Danga Interactive 开发并使用 BSD 许可的一种通用的分布式内存缓存系统。最新的稳定版本是memcached 1.4...

    张善友
  • memcached全面剖析

    如今,越来越多的Web应用程序开始使用memcached这个高速的缓存服务器软件。然而,memcached的基础知识远远未能像其他Web技术那样普及,memca...

    张善友
  • Mac OS使用brew安装memcached

    代码改变世界-coding
  • nginx+memcached构建页面缓存应用

    nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、djang...

    后端技术探索
  • Memcache

    Memcached概念:     Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一...

    joshua317

扫码关注云+社区

领取腾讯云代金券