nginx的回报率从memcached的损坏的数据(nginx return corrupted d

2019-09-19 13:01发布

在我的网站我已经取得了数据缓存与分布式缓存。 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;
}

Answer 1:

Nginx的不处理存储在Memcached的内容,它只是把它买走,因为是返回给浏览器。

真正的原因是您的应用程序使用Memcached的客户端库。 大多数图书馆的压缩大值(通常是当值的大小超过某个阈值),所以你必须配置它不这样做,或者设置memcached_gzip_flag (先Nginx的“不稳定” 1.3.6出现)与gunzip解模块启用。



Answer 2:

您发布的回应似乎是一个gzip压缩。 我的第一猜测是Apache被返回的响应与transfer-encoding=gzip哪个存储到memcached中弹出,并且从返回时,但随后nginx通过memcached ,所述transfer-encoding省略报头,从而浏览器接收错误响应。 您可以轻松地测试,如果这是在禁用gzip压缩的情况下Apache

如果是这样的话,你应该寻找一个解决方案来保护transfer-encoding头...也许来定义不同的规则-对于非gzip压缩和gzip压缩的内容,并在后一种情况下总是返回头。 但是看看这个: http://wiki.nginx.org/HttpSRCacheModule 。 这似乎是它处理这样的情况。



Answer 3:

所以,问题是在Memcached的CompressTreshold。 当数据超过20K符号,分布式缓存即使conression =假接通压缩。



Answer 4:

问题是在具体的memcached的行为。 即使你关闭数据压缩,如果在20K符号的数据超出限额的memcached做到这一点。 治愈是- (对我来说)的缓存后端都像水木清华$this->_memcache->setCompressThreshold(20000, 1);

PS我使用Zend_Cache_Backend_Memcached作为父类我的后端的。 因此字符串上述必须__contstruct()



Answer 5:

如果您使用的是PHP的Memcached库,请记住,它只能存储其压缩数据与zlib编码。 Nginx的不能扩大zlib的,甚至与memcached_gzip_flag亚历山大以上建议。 因此,在这种情况下,你可能不应该在Memcached的,除非你感到舒适压缩一切 ,直接传递到浏览器与压缩数据add_header Content-Encoding deflate



文章来源: nginx return corrupted data from memcached