nginx从memcached返回损坏的数据

问题描述 投票:2回答:6

在我的网站上,我使用memcached进行了数据缓存。它存储完全生成的html页面。下一步是从Nginx的memcached获取此数据,然后将其发送回用户,而不是开始apache进程。首先,我尝试通过php后端从缓存中获取数据,并且它起作用了。但是当我尝试使用nginx进行此操作时-我几乎看不到损坏的数据。类似于“在此处输入图像描述”

我正在寻求有关此问题的帮助。

ps.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;
}
nginx memcached
6个回答
5
投票

Nginx不会处理存储在Memcached中的内容,它只会获取它并按原样返回浏览器。

真正的原因是您的应用程序使用了Memcached客户端库。大多数库会压缩较大的值(通常是在值大小超过某个阈值时),因此您必须配置为不这样做,或者在启用memcached_gzip_flag的情况下设置memcached_gzip_flag(首次出现在Nginx“不稳定” 1.3.6中)。


1
投票

您发布的回复似乎压缩了一个。我的第一个猜测是gunzip module返回带有存储在Apache中的transfer-encoding=gzip的响应,但是当从memcachednginx弹出并返回时,省略了memcached标头,因此浏览器收到了错误的回应。通过在transfer-encoding中禁用gzip压缩,您可以轻松测试这种情况。

如果是这种情况,您应该寻找一种解决方案来保留Apache标头...也许要定义不同的规则-针对非压缩和压缩内容,并在后一种情况下始终返回标头。但是看一下:transfer-encoding。似乎可以处理此类情况。


1
投票

所以问题出在Memcached CompressTreshold中。当数据超过2万个符号时,即使conression = false,memcached也会打开压缩。


0
投票

问题出在特定的内存缓存行为中。即使您关闭了数据压缩,如果您的数据超过了2万个符号限制,memcached也会这样做。解决方法是-(就我而言)在缓存后端上做http://wiki.nginx.org/HttpSRCacheModule


0
投票

如果使用的是PHP Memcached库,请记住,它只能以__contstruct()编码存储其压缩数据。 Nginx无法扩展zlib,即使使用了亚历山大上面提到的zlib也是如此。因此,在这种情况下,除非您愿意压缩everything


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.