在我的网站我已经取得了数据缓存与分布式缓存。 IT卖场完全生成HTML页面。 下一步是从nginx的memcached的得到这个数据并发送回用户w ^ \ o启动Apache进程。 首先,我试图通过PHP后端得到缓存数据和它的工作。 但是,当我试着使用nginx的让这个 - 我几乎看不到损坏的数据。 像水木清华
我要求此问题的帮助。
PS这里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;
}
Nginx的不处理存储在Memcached的内容,它只是把它买走,因为是返回给浏览器。
真正的原因是您的应用程序使用Memcached的客户端库。 大多数图书馆的压缩大值(通常是当值的大小超过某个阈值),所以你必须配置它不这样做,或者设置memcached_gzip_flag
(先Nginx的“不稳定” 1.3.6出现)与gunzip解模块启用。
您发布的回应似乎是一个gzip压缩。 我的第一猜测是Apache
被返回的响应与transfer-encoding=gzip
哪个存储到memcached
中弹出,并且从返回时,但随后nginx
通过memcached
,所述transfer-encoding
省略报头,从而浏览器接收错误响应。 您可以轻松地测试,如果这是在禁用gzip压缩的情况下Apache
。
如果是这样的话,你应该寻找一个解决方案来保护transfer-encoding
头...也许来定义不同的规则-对于非gzip压缩和gzip压缩的内容,并在后一种情况下总是返回头。 但是看看这个: http://wiki.nginx.org/HttpSRCacheModule 。 这似乎是它处理这样的情况。
所以,问题是在Memcached的CompressTreshold。 当数据超过20K符号,分布式缓存即使conression =假接通压缩。
问题是在具体的memcached的行为。 即使你关闭数据压缩,如果在20K符号的数据超出限额的memcached做到这一点。 治愈是- (对我来说)的缓存后端都像水木清华$this->_memcache->setCompressThreshold(20000, 1);
PS我使用Zend_Cache_Backend_Memcached作为父类我的后端的。 因此字符串上述必须__contstruct()
如果您使用的是PHP的Memcached库,请记住,它只能存储其压缩数据与zlib
编码。 Nginx的不能扩大zlib的,甚至与memcached_gzip_flag
亚历山大以上建议。 因此,在这种情况下,你可能不应该在Memcached的,除非你感到舒适压缩一切 ,直接传递到浏览器与压缩数据add_header Content-Encoding deflate
。