在我的网站上,我使用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中的内容,它只会获取它并按原样返回浏览器。
真正的原因是您的应用程序使用了Memcached客户端库。大多数库会压缩较大的值(通常是在值大小超过某个阈值时),因此您必须配置为不这样做,或者在启用memcached_gzip_flag
的情况下设置memcached_gzip_flag
(首次出现在Nginx“不稳定” 1.3.6中)。
您发布的回复似乎压缩了一个。我的第一个猜测是gunzip module返回带有存储在Apache
中的transfer-encoding=gzip
的响应,但是当从memcached
到nginx
弹出并返回时,省略了memcached
标头,因此浏览器收到了错误的回应。通过在transfer-encoding
中禁用gzip压缩,您可以轻松测试这种情况。
如果是这种情况,您应该寻找一种解决方案来保留Apache
标头...也许要定义不同的规则-针对非压缩和压缩内容,并在后一种情况下始终返回标头。但是看一下:transfer-encoding
。似乎可以处理此类情况。
所以问题出在Memcached CompressTreshold中。当数据超过2万个符号时,即使conression = false,memcached也会打开压缩。
问题出在特定的内存缓存行为中。即使您关闭了数据压缩,如果您的数据超过了2万个符号限制,memcached也会这样做。解决方法是-(就我而言)在缓存后端上做http://wiki.nginx.org/HttpSRCacheModule
如果使用的是PHP Memcached库,请记住,它只能以__contstruct()
编码存储其压缩数据。 Nginx无法扩展zlib,即使使用了亚历山大上面提到的zlib
也是如此。因此,在这种情况下,除非您愿意压缩everything
[我遇到了同样的问题,但是我最终发现,当我们使用PHP memcached_gzip_flag
扩展名从memcached服务器读取数据时,memcached客户端正在使用PHP memcached_gzip_flag
扩展名来保存数据。