Memcached 结合nginx实现小文件存储方案

nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、django,大大的提升动态页面的速度。nginx只负责从memcached服务器中读取数据,要往memcached写入数据还得需要后台的应用程序来完成,主动的将要缓存的页面缓存到memcached中,可以通过404重定向到后端去处理的。memcached是nginx的核心模块,默认是可以直接使用。这个模块只能读,不能写,不过有第三方模块可以做到。我们可以使用memcache来存储图片、小文件,nginx可以直接从memcahed中取出缓存展示给浏览器,从而提高性能。

ngx_http_memcached_module可以操作任何兼用memcached协议的软件。如ttserver、membase等。

Memcached 结合nginx实现小文件存储方案

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,否则可能会显示不正常。

一、使用测试

1.安装nginx略

2.配置nginx,并启动

nginx配置实例

[plain] view plain copy
 print?
  1. worker_processes  1;  
  2.   
  3. events {  
  4.     worker_connections  1024;  
  5. }  
  6.   
  7.   
  8. http {  
  9.     include       mime.types;  
  10.     default_type  application/octet-stream;  
  11.   
  12.     sendfile        on;  
  13.   
  14.     keepalive_timeout  65;  
  15.   
  16.     gzip  on;  
  17.   
  18.     upstream memcacheds {  
  19.         server 127.0.0.1:11211;  
  20.     }  
  21.     server  {  
  22.             listen       8080;  
  23.             server_name  localhost;  
  24.             index index.html index.htm index.php;  
  25.   
  26.             location /images/ {  
  27.                     set $memcached_key $request_uri;  
  28.                     add_header X-mem-key  $memcached_key;  
  29.                     memcached_pass  memcacheds;  
  30.                     default_type text/html;  
  31.                     error_page 404 502 504 = @app;  
  32.             }  
  33.   
  34.             location @app {  
  35.                     proxy_pass http://127.0.0.1;  
  36.             }  
  37.     }  

启动nginx

./sbin/nginx

3.使用java写图片memcached

[java] view plain copy
 print?
  1. public static void main(String[] args) throws Exception {  
  2.         List<InetSocketAddress> servers = new ArrayList<InetSocketAddress>();  
  3.         servers.add(new InetSocketAddress("127.0.0.1"11211));  
  4.         SpymemcachedManager memcachedManager = new SpymemcachedManager(servers);  
  5.         File file = new File("src/main/resources/memcache.png");  
  6.         BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));  
  7.         ByteArrayOutputStream out = new ByteArrayOutputStream(1024);  
  8.         byte[] temp = new byte[1024];  
  9.         int size = 0;  
  10.         while ((size = in.read(temp)) != -1) {  
  11.             out.write(temp, 0, size);  
  12.         }  
  13.         in.close();  
  14.         byte[] content = out.toByteArray();  
  15.         memcachedManager.add("/images/memcache.png", content, 0);  
  16.         memcachedManager.close();  
  17.     }  
java添加后通过http://127.0.0.1:8080/images/memcache.png即可访问

二、模块指令说明

1.memcached_bind
语法: memcached_bind address | off;
默认值: none
配置段: http, server, location
指定从哪个IP来连接memcached服务器
2.memcached_buffer_size
语法: memcached_buffer_size size;
默认值: 4k|8k;
配置段: http, server, location
读取从memcached服务器接收到响应的缓冲大小。尽快的将响应同步传给客户端。
3.memcached_connect_timeout
语法:memcached_connect_timeout time;
默认值:60s;
配置段:http, server, location
与memcached服务器建立连接的超时时间。通常不超过75s。
4.memcached_gzip_flag
语法:memcached_gzip_flag flag;
默认值:none
配置段:http, server, location
测试memcached服务器响应标志。如果设置了,将在响应头部添加了Content-Encoding:gzip。
5.memcached_next_upstream
语法: memcached_next_upstream error | timeout | invalid_response | not_found | off …;
默认值: error timeout;
配置段: http, server, location
指定在哪些状态下请求将转发到另外的负载均衡服务器上,仅当memcached_pass有两个或两个以上时使用。
6.memcached_pass
语法:memcached_pass address:port or socket;
默认值:none
配置段:location, if in location
指定memcached服务器地址。使用变量$memcached_key为key查询值,如果没有相应的值则返回error_page 404。
7.memcached_read_timeout
语法:memcached_read_timeout time;
默认值:60s;
配置段:http, server, location
定义从memcached服务器读取响应超时时间。
8.memcached_send_timeout
语法:memcached_send_timeout
默认值:60s
配置段:http, server, location
设置发送请求到memcached服务器的超时时间。
9.$memcached_key变量
memcached key的值。

四、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请求。

五、总结

1.memcached不是持久化的,如果是永久性的图片应用,选用可以持久化存储方案合适,如riak、membase、ttserver、mongodb GridFS等等。

2.对于经常变化的数据,用memcached来做缓存也不合适,需要经常刷新缓存
转至:http://www.ttlsa.com/html/2418.html