Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1839256
  • 博文数量: 333
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 4314
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 07:39
文章分类

全部博文(333)

文章存档

2015年(1)

2011年(116)

2010年(187)

2009年(25)

2008年(3)

2007年(1)

分类: 系统运维

2010-04-19 15:40:21

一、问题描述:
    使用nginx作为负载均衡,当访问为图片时到memcached中找,如果未找到运行apache模块将相应文件写入memcached。如果访问图片last-modified为改变,则从本地浏览器的缓存中读取相应文件。
    但是,每次访问memcached会吧浏览器传过来的头去掉,这样造成的后果就是不能从本地缓存中读取相应文件。

二、问题解决:
    经过大量的google,终于找到一个不错的解决方案——修改ngx_http_memcached_module.c源文件,在该模块中加入相应的Last-Modified头。
    具体方案如下(nginx 0.8.34):
    修改src/http/modules/ngx_http/memcached_module.c文件。

--- nginx-0.8.34.orig/src/http/modules/ngx_http_memcached_module.c    
+++ nginx-0.7.62.mio/src/http/modules/ngx_http_memcached_module.c    

@@ 353行 @@
 
 /* skip flags */
+ long int lm;
+ time_t ims;
+ lm = strtol(p, NULL, 10);
+ if( r->headers_in.if_modified_since == NULL) {
+     ims = 0;
+ } else {
+     ims = ngx_http_parse_time(r->headers_in.if_modified_since->value.data,
+     r->headers_in.if_modified_since->value.len);
+ }
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+ "TIEMPOS: lm=\"%d\" ims=\"%d\"", lm, ims);
+
         while (*p) {
             if (*p++ == ' ') {
                 goto length;


@@ 380行 @@
 
         while (*p && *p++ != CR) { /* void */ }
 
+ r->headers_out.last_modified_time = lm;
         r->headers_out.content_length_n = ngx_atoof(len, p - len - 1);
         if (r->headers_out.content_length_n == -1) {
             ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,


在Memcached-1.4.4中memcachd.c中2700行修改为

    time_t t;
    time(&t);
    flags = t;

    if (! (flags
           && safe_strtol(tokens[3].value, &exptime_int)
           && safe_strtol(tokens[4].value, (int32_t *)&vlen))) {
        out_string(c, "CLIENT_ERROR bad command line format");
        return;
    }


阅读(3546) | 评论(0) | 转发(0) |
0

上一篇:实体标签(etag)

下一篇:lvs简介

给主人留下些什么吧!~~