nginx与memcache缓存无法命中

10-07-09 icycrystal4
因为项目中的静态资源(HTML,JS,JPG)比较多, 多心考虑台面用nginx搭载memcache增加访问量. 其中nginx.conf中配置(节选如下):

   upstream memcached {  
        server localhost:11211;  
    }  
  
    server {  
            listen 4444;  
            server_name localhost;  
  
               location / { #这里面上线时会配置成静态资源  
            proxy_set_header        X-Real-IP $remote_addr;  
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;              
            proxy_redirect          off;  
        charset             utf-8;  
        set                     $memcached_key $uri;  
        memcached_pass      memcached;  
        error_page          500 404 405 = @fallback;  
}  
  
        location @fallback {  
            root   /Users/crystal/www/html;  
        }  

<p>

访问http://localhost:4444/a/b/c/static.html资源的时候,后台日志出现

 key: "/a/b/c/static.html" was not found by memcached while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /webpro/img/b.html HTTP/1.1", upstream: "memcached://127.0.0.1:11211", host: "localhost:4444".
<p>

但我用JAVA的客户端从memcache中读取key为/a/b/c/static.html的值是可以准备提取到对应的资源的, 不知为什么nginx就是读不出来. 后来将

set                     $memcached_key $uri;  
#改成
set                     $memcached_key 'fixed_key';  #固定的值,不用$uri
<p>

立即可以显示正确的页面, 另外发现如果key中包含有'/', 那nginx也不能正常读出.

请问, 大家碰到过这种问题没有.

PS: 对C不熟悉, 读nginx的源码有点费劲.

1
ronalfei
2010-07-12 01:51
看你的意思是想把页面缓存到memcache里,然后直接读出..这样可以减少磁盘的io开销.

我就不回答你的提问了.不过我给你个建议.

可以使用proxy_cache模块来处理这个问题.

把proxy_cache里的cache_path设置到你的系统的内存分区下,这样就和放到内存没什么区别了.(通常/tmp,就是内存分区).也能解决你想要的问题了.

banq
2010-07-12 09:34
估计nginx没写好,这里有一个.htaccess转换为nginx rule的方式,希望对你有用:

http://www.anilcetin.com/convert-apache-htaccess-to-nginx/

icycrystal4
2010-07-12 11:08
2010年07月12日 01:51 "ronalfei"的内容
可以使用proxy_cache模块来处理这个问题.

把proxy_cache里的cache_path设置到你的系统的内存分区下,这样就和放到内存没什么区别了.(通常/tmp,就是内存分区).也能解决你想要的问题了. ...

谢谢

ronalfei 的建议. 尝试了用proxy_cache这个模块, 它把URL对应的资源以md5(key)的形式存储在了proxy_cache_path这个目录下, 但还有个疑问

1. 就是proxy_temp_path这个路径不能任意设置吗? 如果是系统内存分区(比如/tmp, 对这个概念还不熟悉), 它是把这个目录下的文件映射到内存了吗还是? 如果仅仅只是把url保存为文件, 那还是有文件IO, 这岂不是与nginx读取root rootdir这下面的文件一样了?

PS: to banq大哥, .htaccess这个东东项目没有生成:)

[该贴被icycrystal4于2010-07-12 11:11修改过]

ronalfei
2010-07-12 15:07
据我的测试,proxy_temp_path应该和proxy_cache这个模块没有啥关系吧.

在我的配置里是没有这个temp_path的配置的.

你说的url保存为文件,我不太理解.但是解决磁盘io是没有问题的.

猜你喜欢
2Go 1 2 下一页