2

在我的网站上,我使用 memcached 进行了数据缓存。它存储完全生成的 html 页面。下一步是从 nginx 的 memcached 中获取这些数据,并在没有启动 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;
}
4

6 回答 6

5

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

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

于 2012-07-16T12:23:21.847 回答
1

您发布的回复似乎是 gzip 压缩的。我的第一个猜测是返回存储到Apache的响应,但是当从through弹出并返回时,标头被省略,因此浏览器收到错误的响应。您可以轻松测试是否是在.transfer-encoding=gzipmemcachednginxmemcachedtransfer-encodingApache

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

于 2012-07-16T12:00:56.703 回答
1

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

于 2012-07-17T09:39:21.597 回答
0

问题出在特定的 memcached 行为中。即使您关闭数据压缩,如果您的数据超过 20k 个符号的限制,memcached 也会执行此操作。解决方法是 - (在我的情况下)缓存后端做 smth like$this->_memcache->setCompressThreshold(20000, 1);

ps 我使用 Zend_Cache_Backend_Memcached 作为后端的父类。所以上面的字符串必须在__contstruct()

于 2012-08-01T14:43:48.190 回答
0

如果您使用的是 PHP Memcached 库,请记住它只能存储带有zlib编码的压缩数据。Nginx 无法扩展 zlib,即使memcached_gzip_flag如 Alexander 建议的那样。因此,在这种情况下,您可能不应该在 Memcached 中压缩数据,除非您对压缩所有内容并使用add_header Content-Encoding deflate.

于 2013-11-24T06:58:25.880 回答
0

我遇到了同样的问题,但我最终发现 memcached 客户端使用 PHPMemcached扩展来保存数据,而我们使用 PHPMemcache扩展从 memcached 服务器读取数据。

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

您可以通过使用MemcachePHP 扩展来保存数据来解决压缩问题。

于 2019-10-29T09:19:30.653 回答