在我的网站上,我使用memcached进行数据缓存。它存储完全生成的html页面。下一步是通过nginx从memcached获取此数据并发送回用户w \ o启动apache进程。
首先,我试图通过php后端从缓存中获取数据并且它有效。但是,当我尝试使用nginx时 - 我看到几乎没有损坏的数据。像
我正在寻求这个问题的帮助。
P.S。这里是nginx配置的一部分,如果它可以帮助
location / {
#add_header Content-Type "text/html";
set $cachable 1;
if ($request_method = POST){
set $cachable 0;
break;
}
if ($http_cookie ~ "beauty_logged") {
set $cachable 0;
break;
}
if ($cachable = 1) {
set $memcached_key 'nginx_$host$uri';
memcached_pass 127.0.0.1:11211;
}
default_type text/html;
error_page 404 502 504 405 = @php;
#proxy_pass http://front_cluster;
}
location @php {
proxy_pass http://front_cluster;
}
答案 0 :(得分:5)
Nginx不处理存储在Memcached中的内容,它只是获取它并按原样返回浏览器。
真正的原因是您的应用程序使用的Memcached客户端库。大多数库压缩大值(通常在值大小超过某个阈值时),因此您必须将其配置为不这样做,或者设置memcached_gzip_flag
(首先出现在Nginx“unstable”1.3.6中){{3启用。
答案 1 :(得分:1)
你发布的回复看起来像是gzipped一个。我的第一个猜测是Apache
正在返回transfer-encoding=gzip
的回复,该回复存储在memcached
中,但是当弹出并从nginx
通过memcached
返回时,transfer-encoding
省略了{1}}标头,因此浏览器收到错误的响应。您可以轻松测试是否在Apache
中禁用gzip压缩的情况。
如果是这种情况,你应该寻找一个解决方案来保留transfer-encoding
标题...可能为非gzip和gzip压缩内容定义不同的规则,并且总是返回后者的标题案件。但请看一下:http://wiki.nginx.org/HttpSRCacheModule。它似乎处理了这种情况。
答案 2 :(得分:1)
所以,问题出现在Memcached CompressTreshold中。 当数据超过20k符号时,memcached会打开压缩,即使conression = false。
答案 3 :(得分:0)
问题出在特定的memcached行为中。即使您关闭数据压缩,如果您的数据超过20k符号限制,memcached也会执行此操作。治愈是 - (在我的情况下)缓存后端像$this->_memcache->setCompressThreshold(20000, 1);
P.S。我使用Zend_Cache_Backend_Memcached作为我后端的父类。所以上面的字符串必须是__contstruct()
答案 4 :(得分:0)
如果您使用的是PHP Memcached库,请记住它只能使用zlib
编码存储其压缩数据。 Nginx无法扩展zlib,即使正如亚历山大所建议的memcached_gzip_flag
也是如此。因此,在这种情况下,您可能不应该压缩Memcached中的数据,除非您感觉很舒服压缩所有内容并将其直接传递给add_header Content-Encoding deflate
的浏览器。
答案 5 :(得分:0)