为什么nginx + memcache会破坏我的响应体?

时间:2010-09-29 16:45:59

标签: ruby-on-rails memcached nginx

我在memcache中缓存了一些网页。当我直接从缓存中读取页面时,页面就像这样......

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"-:--     0
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />

但是当我使用浏览器或curl从nginx(版本0.8.50)读取它时,看起来响应标题最终会在响应的主体中结束......

     �{
        "    ETag"'"16bb9f51667d334aa4e7663ca28d308a""X-Runtime177"Content-Type"text/html; charset=utf-8"Content-Length"5428"Set-Cookie""Cache-Control"(private, max-age=0, must-revalidate"4<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">


我的nginx配置非常简单......

     set $memcached_key $cookie__app_session$uri;
     memcached_pass     localhost:11211;
     default_type       text/html;
         error_page         404 502 /fallback$uri;

有没有人知道为什么回复会被破坏?

1 个答案:

答案 0 :(得分:2)

做的!愚蠢的开发人员问题!


有两个错误

(a)我将响应头和主体存储在memcache中,然后在nginx规则中添加头。仅在memcache中存储响应主体消除了大部分问题

(b)我用Ruby的marshal格式(memcache-client中的默认设置)存储响应 - 使用简单的Ruby客户端读取memcache的内容隐藏了nginx无法直接使用该格式的事实。 / p>

希望有时帮助某人!

克里斯