nginx与memcache缓存无法命中

因为项目中的静态资源(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;
}



访问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".


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


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

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

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

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

看你的意思是想把页面缓存到memcache里,然后直接读出..这样可以减少磁盘的io开销.
我就不回答你的提问了.不过我给你个建议.
可以使用proxy_cache模块来处理这个问题.
把proxy_cache里的cache_path设置到你的系统的内存分区下,这样就和放到内存没什么区别了.(通常/tmp,就是内存分区).也能解决你想要的问题了.
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修改过]

据我的测试,proxy_temp_path应该和proxy_cache这个模块没有啥关系吧.
在我的配置里是没有这个temp_path的配置的.
你说的url保存为文件,我不太理解.但是解决磁盘io是没有问题的.
决定尝试采取proxy_cache这种方案
(另外我还需要去了解一下linux的内存文件系统:)
谢谢

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