nginx从memcached返回损坏的数据

时间:2012-07-16 11:15:16

标签: nginx memcached

在我的网站上,我使用memcached进行数据缓存。它存储完全生成的html页面。下一步是通过nginx从memcached获取此数据并发送回用户w \ o启动apache进程。 首先,我试图通过php后端从缓存中获取数据并且它有效。但是,当我尝试使用nginx时 - 我看到几乎没有损坏的数据。像enter image description here

一样

我正在寻求这个问题的帮助。

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;
}

6 个答案:

答案 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)

我遇到了同样的问题,但是我最终发现,当我们使用PHP Memcached扩展名从memcached服务器读取数据时,memcached客户端正在使用PHP Memcache扩展名来保存数据。 / p>

更改为在两者上都使用Memcache之后,问题就解决了!

通过使用Memcache PHP扩展名来保存数据,您也许可以解决压缩问题。